본문 바로가기

공부/컴퓨터

[Kubernetes] k3s를 이용해 multi node 쿠버네티스 클러스터 구축하기

반응형

이전 글에서는 k3s를 이용하여 쉽게 single node kubernetes cluster를 구축하는 법을 알아 보았다. ( https://blog.ggaman.com/1018 ) 이번 글에서는 k3s를 이용해서 multi node kubernetes cluster를 구축하는 법을 알아 보겠다. 즉, 컴퓨터 여러대를 묶어서 사용하겠다는것이다. 이전의 글을 보고 왔으면 크게 할 일이 없지만 몇가지 사소하게 설정이 필요한 부분이 있어서 이 글도 따로 작성하게 되었다.

이전글에도 적어 두었지만, 쿠버네티스는 master nodeworker node로 구분되고, master node가 worker node를 조작한다고 설명했다. 그렇기 때문에 실제 서비스가 돌아가는곳은 worker node이므로, master node의 성능이 매우 좋을 필요는 없다. 이전 글에서는 single node kubernetes cluster를 구축했기 때문에 master node와 worker node가 같은 장비였으므로, 좀 좋은 스펙을 가진 VM Instance를 생성하여 구성해 보았다.

이 글에서는 multi node cluster 를 구축하는것을 보여주려고 한다.

우선 vultr에서 master용 VM Instance를 몇개 만들어 보자. https://my.vultr.com/deploy/ 에 접근한 뒤에, Products -> Cloud Compute -> Asia -> Seoul -> Ubuntu 18.04 를 선택하자. $20 짜리 Instance 를 고른다. ( 2vCPU, 4GB, 3TB Traffic, 80GB SSD ) 시간당 가격은 50원 정도이다. vultr에 대한 사용법을 알고 싶다면 https://blog.ggaman.com/1019 링크의 내용을 참고하면 된다.

왜 $20짜리를 고르라고 하냐면, k3s 홈페이지에서 그렇게 안내하고 있기 때문이다. ^_^

https://rancher.com/docs/k3s/latest/en/installation/installation-requirements/

multi node cluster는 "안정성"과 "확장성"을 위해서 사용하는데, DB(etc, PostgreSQL, MySQL)를 따로 분리해서 설치하는것을 추천하고 있다. 하지만 우리는 "간단하게" 사용하기 위해서 설치하는것이므로, 여기에서 굳이 확인하지 않았다. 참고로, 아직 실험적인 기능을 사용하면 DQLite를 사용해서 DB에 대한 고민을 덜 해도 될 듯 하다. 관심이 있다면 다음 링크를 이용해서 확인해 보도록 하자.

Embedded DB 를 사용하면 굳이 DB를 따로 설치할 필요가 없다. 다만, 실험적인 기능인것을 알고 써야겠지?

(2021년 2월 21일 추가 ) k3s v1.19.5+k3s1 버젼부터는 embedded etcd를 정식 지원하도록 변경되었다. 그러므로 Dqlite를 사용하는 경우 업그레이드에 문제가 있을 수 있다.

( https://rancher.com/docs/k3s/latest/en/installation/ha-embedded/ )

k3s에 대한 설명이 좀 길었으니, 이제 다시 vultr 화면으로 돌아 가자. master는 총 3대를 만들어야 한다. 중요한 것은 server의 hostname을 모두 다르게 설정해야 한다는것이다. 서버의 이름이 같으면 클러스터 구축이 제대로 되지 않는다. 반드시 서로 다른 이름을 주고 VM Instance 를 생성하도록 하자. 이렇게 3개의 인스턴스를 생성하면 1시간에 약 100원이 소모된다.

hostname을 반드시 각자 다른 이름으로 지정해서 띄우도록 하자

이전 게시물에서 설명한 방법으로, IP, username, password 를 이용하여 ssh에 접속하도록 하자. ( https://blog.ggaman.com/1018 )

k3s를 이용하여 쿠버네티스 클러스터를 설치하는것은 이전에 이야기 했다시피 하나의 명령어만 실행하면 끝난다. 우선 master-1 서버에 아래의 명령을 이용해서 k3s를 설치하도록 하자. 여기서는 실험적(experimental) 기능이긴 하지만 DQLite를 이용하는 방법을 써 보도록 하자.

curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644 --cluster-init

당연히 별 문제 없이 실행되었을 것이다. 이제 kubectl 명령을 통해서 몇개의 node가 kubernetes cluster로 묶여 있는지 확인해 보자. 당연히 1대의 컴퓨터에서만 k3s를 설치 했으므로, 1대만 출력 될 것이다.

아직 1대의 node만 연결된 cluster

우리의 목적은 총 3대의 master node를 만드는것이므로, 나머지 2대를 master node로 만들어 보도록 하자. k3s를 설치하게 되면 기본적으로 master node로 설치된다. 그리고 나머지 2대를 처음 설치만 master node에 연결하는 형태로 master node를 늘릴 수 있게 된다. master-1 서버에서 아래의 명령을 이용해서 TOKEN 값을 얻자. TOKEN은 /var/lib/rancher/k3s/server/node-token 위치에 있다.

cat /var/lib/rancher/k3s/server/node-token

이제 master-2master-3의 서버에 ssh를 접속하여 아래의 명령을 실행하면 master node들이 늘어나게 된다. MASTER-1-IP 에 master-1의 ip를, NODE_TOKEN은 위 명령을 이용해서 얻은 값을 적어주면 된다. ( master-1 에서 설치할 때는 --cluster-init 을 넣어 줬지만, 나머지 2대의 서버에 실행시킬 아래 명령에는 그 값이 없다는것에 주의해야 한다. )

curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644 --server https://MASTER-1-IP:6443 --token NODE_TOKEN

내 환경에서는 아래와 같이 입력하였다.

curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644 --server https://158.247.192.125:6443 --token K1081d886e341e3172b0c9f14e920652df428c0c0c5ba00fa040661c3a2018443a2::server:8883b89d6fdd7d48f7ab0b29c6479177

master-2master-3에서 위 명령을 설치한 이후에 다시 master-1에 와서 kubecl get nodes 명령을 입력해 master node가 몇개로 변했는지 확인해 보자.

master가 3개로 변했다!!!!

위 과정을 거쳐 master가 총 3개가 생성되었다. master를 3개나 만들어 두었으니, 한대쯤은 죽어도 kubernetes 가 잘 운영 될 것이다.

master를 여러개 만들었으니, 이제 worker 들도 여러개를 등록해 보자. k3s에서는 workeragent 라는 이름으로 부른다. agent를 등록하는 방법도 매우 간단하다. agent를 위한 VM Instance를 더 만들도록 하자. 이 때도 각 VM의 이름을 다르게 줘야 한다는것을 잊지 말자. 이번에는 VM Instance를 생성할때, $40 ( 4 vCPU, 8GB ) 4개를 생성하겠다. 1시간에 약 300원이 소모된다. worker에 더 많은 서비스들이 동작할 것이기 때문에 높게 잡아서 진행하는것이다. 만약 테스트를 위해서라면 $20 짜리를 4개를 생성해도 된다. 약 150원 정도 소모 된다. 그것도 부담되면 2개만 생성해도 된다. ^^ 중요한것은 이름을 다르게 줘야 한다는것이다.

worker도 이름을 다르게 주자

worker를 모두 생성하고 나면, worker-1에서 worker-4까지 모든 worker에 ssh로 접속하여 아래의 명령을 날려 주도록 하자. 아까 master-2, master-3 에 날려준 형태와 비슷하긴 한데, 옵션이 아니라 환경변수로 master-1의 주소와, master-1의 TOKEN 정보를 전달하는 형식이다.

curl -sfL https://get.k3s.io | K3S_URL=https://158.247.192.125:6443 K3S_TOKEN=K1081d886e341e3172b0c9f14e920652df428c0c0c5ba00fa040661c3a2018443a2::server:8883b89d6fdd7d48f7ab0b29c6479177 sh -

agent를 설치하고 나면 제일 마지막에 k3s-agent 가 잘 실행되었다고 출력 된다.

모든 worker에서 위 명령을 실행 뒤, master-1의 kubectl get nodes 명령을 실행해 몇개의 node가 cluster로 묶였는지 확인해 보자. ( 반드시 master-1에서 실행할 필요는 없다. master 중 아무데서나 실행해도 된다. )

기존 master 3개에, worker 4개가 추가 되었다.

이번에도 마찬가지로 주저리 설명이 길었지만, 실제로 worker에서 실행해야 하는 명령은 아래와 비슷한 단 한줄의 명령이다.

curl -sfL https://get.k3s.io | K3S_URL=https://$(MASTER-1-IP):6443 K3S_TOKEN=$(MASTER-1-TOKEN) sh -

이로써 k3s를 이용해서 multi node cluster를 구성하는것까지 해 보았다. 이렇게 k3s는 kubernetes를 쉽게 설치하여 사용할 수 있는 방법을 제공한다. 심지어 multi node cluster 역시 쉽게 구성할 수 있도록 제공해 준다.

이렇게 구성된 kubernetes cluster를 편리하게 관리할 수 있게 해 주는 Rancher라는 서비스도 있다. 다만 Rancher를 사용하려면 kubernetes 에 대하여 어느 정도는 알고 있어야 한다. 그렇기 때문에 Rancher를 사용하기 전에 Kubernetes를 사용하는것에 대해서 공부를 해야 한다. 편리하게 해 준다는거지, 모르는데도 잘 동작하게 해 주지는 않는다. 

이 블로그에서 kubernetes 자료를 만들어 업데이트 할지는 모르겠다. 설명해야 할 게 너무 많고, 기반 지식도 어느정도는 필요하기 때문에 되도록이면, 책을 구매해서 보는것을 추천한다. 사실 내가 잘 모른다. ㅎㅎ. 혹시 docker 라는것도 잘 모른다면, docker와 kubernetes를 동시에 다루는 책도 있으니, 그런 책을 사서 보는것도 좋을 것이다. 보통 책에서는 minikube 로 kubernetes 환경을 만들어서 설명한다. 그 때 minikube가 아니라, k3s를 이용하여 구축해 보면 더 좋은 경험을 해 볼 수 있을것이라 생각한다.

반응형