multipass 를 활용하여 Ubuntu 20.04 에 k3s 구성하기

Jung-taek Lim
6 min readDec 21, 2020

사실 구글링해가면서 삽질한 거 정리하는 거라 내용은 없다. 디테일도 일단 없다. 새로 세팅한 데스크탑을 개발용도로 활용하려고 하는 거라 일단 돌아가게 만드는 게 목표이고, Kubernetes In Action 서적을 보면서 지식이 비는 부분들을 나중에 메꿀 계획이다. 그래서 거의 커맨드와 레퍼런스 (남겨뒀으면?) 수준으로 작성하려고 한다.

Kafka, S3 (MinIO), docker private repository 정도 셋업하고 이걸 활용해서 Spark 쿼리를 실행하는 것까지 우선 해 보았다. (그래서 노드가 상당히 많다. 32G 머신인데 32G 더 달아야되나 고민중…) 이번 문서에서는 k3s 셋업만 다뤄보려고 한다.

사실 삽질 과정은 지루한데 정리하면 뭐 없다. 우선 노드들을 띄우자.

multipass launch --name k3s-master --cpus 2 --mem 2048M --disk 20G
multipass launch --name k3s-node1 --cpus 1 --mem 2048M --disk 20G
multipass launch --name k3s-node2 --cpus 1 --mem 2048M --disk 20G
multipass launch --name k3s-node3 --cpus 1 --mem 2048M --disk 20G
multipass launch --name k3s-node4 --cpus 1 --mem 2048M --disk 20G
multipass launch --name k3s-minio --cpus 1 --mem 5120M --disk 100G

k3s-master 가 k3s 의 마스터로 사용할 노드이고 나머지는 워커 노드들이다. minio 노드만 메모리를 5G 로 할애했는데, minio pod 이 실행에 4G 를 요구해서 메모리를 충분히 할애했다. S3 지원하는 거면 뭐든 저기에 때려넣을 예정이라 디스크도 좀 더 줬다.

모두 실행하고 나서 아래 명령을 실행해 재확인하자.

multipass listName                    State             IPv4             Image
primary Stopped -- Ubuntu 20.04 LTS
k3s-master Running 10.38.12.80 Ubuntu 20.04 LTS
k3s-minio Running 10.38.12.221 Ubuntu 20.04 LTS
k3s-node1 Running 10.38.12.210 Ubuntu 20.04 LTS
k3s-node2 Running 10.38.12.20 Ubuntu 20.04 LTS
k3s-node3 Running 10.38.12.116 Ubuntu 20.04 LTS
k3s-node4 Running 10.38.12.95 Ubuntu 20.04 LTS
multipass info --all...

정상적으로 가상머신들이 구성되었다.

마스터 노드를 구성하자. 사실 직접 할 게 거의 없다. k3s 가 정말 편한 시스템인 듯 하다.

multipass exec k3s-master -- /bin/bash -c "curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="644" sh -"

설치가 완료되었으면 토큰 정보를 얻어야 한다. 워커 노드들 설치할 때 마스터 노드로 연결해 주기 위해 필요하다.

multipass exec k3s-master -- /bin/bash -c "sudo cat /var/lib/rancher/k3s/server/node-token"

출력되는 정보를 잘 복사해 두자.

모든 워커 노드들에 아래의 명령으로 k3s 를 설치한다. 여기서 K3S_TOKEN 자리에 위에서 얻은 정보를 기입하고, K3S_URL 에 마스터 노드의 IP 를 넣어준다.

multipass exec k3s-node1 -- /bin/bash -c "curl -sfL https://get.k3s.io | K3S_TOKEN=\"<토큰 정보>\" K3S_URL=https://<마스터 노드 IP>:6443 sh -"

k3s-node1 자리만 노드 이름으로 바꾸어 모두 설치한다. (스크립트 파일이던 배쉬 셸로 콘솔에서 하던 수작업하던 모두 자유)

다음으로, 호스트 서버에 Kubernetes client 가 없으면 설치해 준다.

sudo snap install kubectl --classic

(snap 이던 linuxbrew 던 직접 설치던 상관없을 것 같다.)

이제 설치한 k3s 를 호스트 서버에서 접근할 수 있는 과정을 거친다.

multipass transfer k3s-master:/etc/rancher/k3s/k3s.yaml ~/config
mkdir -p ~/.kube
mv ~/config ~/.kube/config

kubectl 이 읽는 기본 설정 파일 위치에 k3s 설정 파일을 복사한다. 이미 다른 k8s 클러스터를 접근할 수 있게 설정했다면 덮어쓰지 말고 기존 파일에 섹션 별로 나누어 복사한 다음 이름/컨텍스트들 적당히 겹치지 않게 수정하자.

k8s API 주소가 127.0.0.1 로 되어 있을 것이므로 마스터 노드 IP 로 수정해준다.

저장하고 나와서 아래의 명령을 실행한다.

kubectl get nodesNAME         STATUS   ROLES    AGE     VERSION
k3s-node3 Ready <none> 4d22h v1.19.5+k3s1
k3s-minio Ready <none> 4d22h v1.19.5+k3s1
k3s-master Ready master 4d22h v1.19.5+k3s1
k3s-node2 Ready <none> 4d22h v1.19.5+k3s1
k3s-node4 Ready <none> 2d10h v1.19.5+k3s2
k3s-node1 Ready <none> 4d22h v1.19.5+k3s1

이런 식으로 출력되면 정상적으로 설치가 된 것이다. (AGE 는 훨씬 짧을 것이다. 셋업한 지 5일만에 정리하는 거라;;)

다음으로 Kubernetes 계의 mdir 인 k9s 를 설치한다. 학습하기엔 방해가 되는 유틸리티겠지만 있어야 고생을 면한다.

linuxbrew 로 설치했다. 왜 snap 으로 설치하지 않았는지는 잊어버렸다. 아마 실행할 때마다 sudo 를 필요로 했던 것 같다.

먼저 linuxbrew 설치…

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >> /home/heartsavior/.zshrc

두번째는 zsh 쓰면 .zshrc, bash 쓰면 .bash_profile, 기타 셸은 거기에 맞게 넣어준다.

이제 k9s 설치…

brew install k9s

k9s 를 실행해서 뭔가 리스트들이 뜨면 성공이다. :nodes 했을 때 아까 kubectl get nodes 와 같은 결과가 나오면 된다. .kube/config 의 기본 컨텍스트가 설치한 k3s 이기 때문에 기본으로 k3s 클러스터의 정보가 나타나게 된다. 여러 컨텍스트들이 있다면 물론 전환해 가며 사용 가능하다. k9s 사용 방법은 구글링하거나 명령들 키가 나와 있으니 쉽게 사용 가능하다.

--

--