맥에서 쿠버네티스 k3s 환경설정하기
layout: PostLayout
쿠버네티스 구축 도구
로컬 환경에서 사용하는 쿠버네티스 구축 도구는
- minikube
- docker desktop
- kind
등이 있습니다. 위 로컬환경 구축 도구로는 multi-node 환경을 구축하는데 어려움이 있습니다. 로컬에서 대체로 사용할 도구로는 kubeadm, k3s 등이 있는데 이는 하나의 노드에 하나의 가상머신 또는 하나의 물리적 머신을 요구합니다.
로컬환경에서 가상머신을 구동시키기 위한 유용한 툴로 multipass 가 있습니다.
step 1. multipass 설정하기
multipass 는 로컬에서 ubuntu 가상머신을 쉽게 구동시켜주는 툴입니다. multipass 는 간단한 cli 로 조작이 가능합니다. 홈페이지인 https://multipass.run 를 참조하여 설치하거나 macOS 의 경우 아래 명령어로 설치할 수 있습니다.
brew install multipass --cask
# 설치 후 find 명령어로 사용 가능한 ubuntu 버전을 확인할 수 있습니다.
multipass find
# Image Aliases Version Description
# 18.04 bionic 20220419 Ubuntu 18.04 LTS
# 20.04 focal,lts 20220419 Ubuntu 20.04 LTS
# 21.10 impish 20220309 Ubuntu 21.10
호환성에 문제 없는 버전을 선택하면 됩니다. 저는 21.10 버전인 impish 를 선택해서 vm 을 구동하겠습니다. 구동할 vm 의 구성과 개수는 원하시는데로 하시면 됩니다. 저는 아래처럼 구성했습니다.
- master
- worker1
- worker2
쿠버네티스 구축 도구로 k3s 를 사용할거기 때문에 k3s 라는 이름을 접미사로 붙여 배포했습니다.
# launch --name <vm 이름> --cpus <할당할 cpu 수> --mem <할당할 memory 수> --disk <할당할 디스크용량> <ubuntu alias>
multipass launch --name k3s-master --cpus 1 --mem 1G --disk 5G impish
multipass launch --name k3s-worker1 --cpus 1 --mem 1G --disk 5G impish
multipass launch --name k3s-worker2 --cpus 1 --mem 1G --disk 5G impish
# multipass list 명령어로 잘 생성되었는지 확인해줍시다. 정상적으로 작동되었다면 위에서 생성한 vm 들의 이름이 출력되어야 합니다.
multipass list
step 2. k3s 설정하기
쿠버네티스를 구동하기 위한 도구로 kubeadmin, k3s 등이 있습니다. k3s 는 적은 시스템 요구사항을 가지기 때문에 한정된 자원을 사용해야하는 환경에서 유리한 점이 있어 사용할 툴로 선택했습니다.
각 노드에 k3s 를 설치하고 구동시켜 봅시다.
# multipass exec <vm 이름> -- /bin/bash -c <설치명령어>
# K3S_KUBECONFIG_MODE="644" 는 k3s installer 에게 kubectl 이 클러스터에 접근하기 위해 사용하는 설정 파일을 생성하도록 합니다.
# 참고로 '--' 는 multipass 명령어와 실제 컨테이너 안에서 실행할 명령어를 구분하기 위해 사용됩니다.
multipass exec k3s-master -- /bin/bash -c "curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="644" sh -"
# 워커노드들을 같은 클러스터에 포함시키기 위해사 마스터에 저장된 ip 주소와 k3s token 정보를 사용해야합니다.
# 아래 명령어를 입력하셔도 되고 직접 정보를 가져와 사용하셔도 됩니다.
K3S_NODEIP_MASTER="https://$(multipass info k3s-master | grep "IPv4" | awk -F' ' '{print $2}'):6443"
K3S_TOKEN="$(multipass exec k3s-master -- /bin/bash -c "sudo cat /var/lib/rancher/k3s/server/node-token")"
# 워커노드에 k3s 를 설치합시다.
multipass exec k3s-worker1 -- /bin/bash -c "curl -sfL https://get.k3s.io | K3S_TOKEN=${K3S_TOKEN} K3S_URL=${K3S_NODEIP_MASTER} sh -"
쿠버네티스는 dns 를 look up 할 때
- 쿠버네티스 dns 정보
- 로컬머신의 hosts 파일에 등록된 정보
- 외부 dns 정보
순으로 찾게된다. 로컬환경에서 손쉽게 테스트 하려면 이를 손 봐주는 것이 좋습니다. macOS, 각 노드들의 /etc/hosts 에 다음 내용을 추가해줍시다.
# kubernetes multipass settings
# ip 는 설정마다 다르기 때문에 multipass list 등 명령어로 ip 주소를 확인해준다.
192.168.64.2 k3s-master k3s-container.info
192.168.64.3 k3s-worker1
192.168.64.4 k3s-worker2
위 같이 설정하면 추후 http://k3s-worker1:12345/hello 와 같은 url 로 접근할 수 있게됩니다.
# 노드들이 정상적으로 설정이 되었는지 확인해보자.
multipass exec k3s-master kubectl get nodes
step 3. 로컬에서 마스터 노드 쉽게 조작하기
매번 kubectl 명령어를 수행하기 위해 multipass exec k3s-master … 과 같이 입력하는 것은 꽤나 귀찮은 일입니다. master 에 있는 k3s 설정을 로컬로 복사하고 사용한다면 손쉽게 사용가능 합니다.
# kubectl 을 로컬 머신에 설치
brew install kubernetes-cli
# master 노드의 k3 kubectl 복사
multipass copy-files k3s-master:/etc/rancher/k3s/k3s.yaml
# k3s.yaml 파일에 로컬호스트를 마스터 노드 아이피로 교체
# 아래 명령어를 입력안하고 직접 변경해도 됩니다.
sed -ie s,https://127.0.0.1:6443,${K3S_NODEIP_MASTER},g ${HOME}/.kube/k3s.yaml
# 로컬머신에서 명령어로 실행하기 위해 alias 설정
# ~/.bash 파일 또는 oh my zsh 을 쓴다면 ~/.zshrc 에 아래 내용을 추가로 source ~/.bash 또는 source ~/.zshrc 를 실행하면 됩니다.
alias k3sctl="kubectl --kubeconfig=${HOME}/.kube/k3s.yaml"
이제 로컬 머신에서 k3ctl 명령어로 마스터노드에서 kubectl 을 실행한 것처럼 조작할 수 있습니다..
step 4. private repository 와 연동
필자는 aws 의 ecr 과 연동해서 사용하고 싶어 내용을 추가합니다. aws 인증을 할 수 있다고 가정합니다.
먼저 master 노드에서 aws 인증을 수행해야합니다.
# master 노드에 aws-cli 설치
# unzip 이 안깔려 있는 경우 동등한 기능을 사용하거나 sudo apt install unzip 사용
multipass exec k3s-master -- curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
multipass exec k3s-master -- unzip awscliv2.zip
multipass exec k3s-master -- sudo ./aws/install
# 아래 명령어를 통해 aws 인증을 수행합니다. aws
multipass exec k3s-master -- aws configure
aws 인증 내용을 쿠버네티스 리소스에서 사용하기 위해 쿠버네티스 secret 리소스를 생성합니다.
# regcred 이름의 secret 을 생성합니다. ECR 을 생성할 때 사용했던 server url 을 사용하여 AWS_ACCOUNT, AWS_REGION 내용을 채워줍니다.
k3sctl create secret docker-registry regcred \
--docker-server=http://${AWS_ACCOUNT}.dkr.ecr.${AWS_REGION}.amazonaws.com \
--docker-username=AWS \
--docker-password=$(aws ecr get-login-password) \
그리고 쿠버네티스 Deployment 를 생성할 때 spec.template.spec.imagePullPolicy 내용을 추가합니다.
apiVersion: apps/v1
kind: Deployment
.....
containers:
- name: servers
image: <AWS_ACCOUNT>.dkr.ecr.<AWS_REGION>.amazonaws.com/mycontainer:latest
imagePullSecrets:
- name: regcred
k3sctl apply -f my-depl.yaml 으로 Deployment 리소스를 적용하고 k3sctl get pod 로 해당 내용이 적용되었는지 확인하면 됩니다.
후기
일반적으로 로컬에서 재미로 도커데스크탑으로 쿠버네티스를 접했지만, 알아갈 수록 상당히 어려운 분야라고 생각합니다. 다만 정식 도큐먼트가 상당히 잘 서술되어 있고 블로그, 교재들도 많기 때문에 나 같은 일반 개발자도 무리없이 환경을 구성할 수 있는 것 같다.
출처
- https://www.padok.fr/en/blog/minikube-kubeadm-kind-k3s
- https://medium.com/@danieltse/pull-the-docker-image-from-aws-ecr-in-kubernetes-dc7280d74904
- https://cobain.me/2020/07/14/K3s-On-Mac.html
- https://levelup.gitconnected.com/kubernetes-cluster-with-k3s-and-multipass-7532361affa3
- https://kubernetes.io/ko/docs/tasks/configure-pod-container/pull-image-private-registry/