[Kubernetes] k3s를 이용해 single node 쿠버네티스 클러스터 구축하기
업무 관련으로 Kubernetes를 사용하려고 준비중이다. 하지만 쿠버네티스를 "사용"하는 것과 "설치"하는것은 많은 차이가 있다. 사용하면서 알아야 할 개념이 60이라면, 설치하면서 알아야 할 개념은 80, 운영까지 포함해야 100이 된다고 생각한다. 즉, 단순히 사용만 할 것인데, 나머지 40까지의 개념을 알아야 할까?
그래서 Kubernetes 쪽 세상에서는 단순하게 사용할 수 있도록 하기 위해서 여러 쉬운 도구를 제공한다. 그 중에서 유명한게 minikube
, k3d
, kind
, k3s
등이 있다. 4 개를 대충 사용해 봤고, 처음에는 k3d
로 클러스터를 구축해 봤었다. k3d
는 docker container에 k3s
가 설치되어 kubernetes를 구축하는 형태이다. 그러므로 반드시 docker를 따로 설치해야 했다. 그리고 가장 문제가 되었던것은 설명서가 너무 간단하게 되어 있어서, 무언가 궁금한것을 찾아 보려고 해도 찾을 방법이 없었다. 또한 테스트 해 봤던 시기에는 공식 홈페이지( https://k3d.io/ )의 설명은 3.x 설명이었는데, release된 버젼은 2.x 대였다. 오늘 확인해 보니 저번주에 3.0 이 release가 되었네?? 그래도 관심이 있는 사람이라면, k3d 홈페이지를 방문해서 확인해 보는것도 나쁘지는 않겠다.
k3d
를 찾아서 조사를 하다가, 원래 대상으로 생각하지 않았던 k3s
를 조사하게 되었고 설치 및 구성이 편하기 때문에 이 글에서는 k3s
를 이용하여 single node cluster(컴퓨터 1대)를 구축하거나, 혹은 multi node cluster(컴퓨터 여러대)를 구축하는 법에 대해서 적어 보도록 하겠다. ( 쿠버네티스쪽 세상에서 "node"라고 이야기 하는것들은 그냥 컴퓨터라고 생각하면 된다. )
k3s
는 Rancher라는 회사에서 쿠버네티스를 경량화 시켜 둔 것이다. ( https://rancher.com/docs/k3s/latest/en/ ) 쿠버네티스를 영어로 쓰면 kubernetes 라고 쓰는데, 이걸 일일이 적기 힘드니깐 k와 s사이에 8글자가 있다고 해서 k8s
라고 줄여서 적는다. 그렇다면 k3s
는 뭐냐? k8s
보다 가볍게 만들었다고 k3s
라는 이름을 지어 둔 것이다.
어떻게 읽어야 하는지도 가이드를 해 주지 않았다. 그래서 나는 '케이쓰리에스'라고 읽고 있다. 우리나라에서는 이걸 보통 어떻게 읽어야 하는지 알면 좀 알려 주세요. ㅎㅎ.
Kubernetes에는 수 많은 기능들이 포함되어 있고, 또한 수많은 플러그인들이 따로 존재한다. 하지만, k3s
는 이를 단순화 시켜, 잘 사용하지 않는 기능들이나, 각종 실험적인 기능들을 제거 했고, 또한 몇가지 꼭 필요한 플러그인들을 기본적으로 포함시켜서 배포하고 있기 때문에, 단순히 설치하는것만으로도 어렵지 않게 쿠버네티스를 운영해 볼 수 있도록 해 두었다. k3s
를 선택해 소개하는것도 이 때문이다.
우선 간단하게 쿠버네티스 클러스터의 구조를 이야기 하고, 거기에 맞춰서 쿠버네티스 클러스터를 구축해 보는법에 대해서 알아 보자. 쿠버네티스는 관리를 위한 master
와 실제 서비스가 동작하는 worker
로 이루어진다. ( 더 자세히는 etcd
라던지, api-server
라던지 하는것들도 있는데 굳이 여기에서는 설명하지는 않는다. ) 당연히 single node cluster(컴퓨터 1대로 만드는 클러스터)의 경우, 한 대의 컴퓨터가 master와 worker의 역할을 모두 하는것이고, multi node cluster(컴퓨터를 여러개 묶어서 만드는 클러스터)의 경우, master와 worker가 분리되어 있는 형태다. master가 worker를 조종하는 역할이므로, master가 1대만 있고, 그 1대가 죽어버리면 쿠버네티스 클러스터 전체가 동작하지 않을테니 보통 3대를 둔다.
우선 single node cluster를 구축하는 방법을 알아 보자.
여기서는 vultr에서 VM Instance를 만들어서 테스트 하는 것을 설명하겠지만, 자신의 Ubuntu 서버가 있다면 그곳에 그냥 설치해도 된다. vultr에서 VM Instance 를 생성하는 방법은 이미 작성한 글이 있으니 그곳을 참고하도록 하자. ( https://blog.ggaman.com/1019 ) 링크가 클릭하기 귀찮을 수도 있으니 이곳에서도 대충 기록하도록 하겠다.
Vultr ( https://my.vultr.com/ ) 에 로그인 한 뒤, Products -> Deploy Instance
를 눌러 새로운 인스턴스를 생성하는 화면을 띄우자.
지금은 single node cluster를 만들어 볼 것이다. 즉, master와 worker가 같은 컴퓨터에 있을테니, 좀 넉넉한 크기의 인스턴스를 생성해 주도록 하자. Cloud Computer -> Asia -> Seoul ( 서울이 Sold out이면 Tokyo ) -> Ubuntu 18.04
를 선택하고, VM Instance는 한달에 $40가 소모되는 인스턴스를 고르자. ( 4core, 8GB RAM, 4TB Traffic, 160GB SSD ) 비용이 매우 크게 느껴질 수 있는데, 1시간에 100원이 안되니깐, 크게 걱정할 필요는 없다.
1시간에 100원이 부담스럽다면, $20의 비용이 드는 인스턴스를 생성해도 상관없다. $20짜리 인스턴스는 1시간에 50원이 든다. 사실 k3s는 훨씬 더 작은 환경에서도 돌아 가지만, 그렇다고 하더라도 그 보다 작은 사이즈는 추천하지 않는다. 1 vCPU를 사용하기 때문에 속도가 좀 느리고, "이렇게 쉽게 뭘 할 수 있다고?" 라는것을 테스트 하기에는 사양이 딸린다. ( https://rancher.com/docs/k3s/latest/en/installation/installation-requirements/ )
VM Instance type을 고른 뒤에, 화면 아래쪽에 있는 Deploy now 버튼을 눌러 인스턴스를 생성하도록 하자.
약 1분정도 기다리면 VM Instance가 생성된다. Products -> Instances
를 누른 뒤에, VM 목록중에 생성된 "Cloud Instance"를 클릭하여 서버의 정보를 확인하자. 그리고 IP Address
와 username
, password
를 확인 한 뒤 ssh로 접속하자. password 옆에 있는 눈 모양 아이콘을 누르면 password를 볼 수 있고, 겹쳐진 종이 모양을 누르면 암호를 복사할 수 있다.
ssh에 접속하고 나면 명령어 딱 1개만 치면 k3s 가 설치 된다. 하지만 나중을 위해서 아래중 두번째 명령을 이용해서 설치하도록 하자.
curl -sfL https://get.k3s.io | sh -s -
curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
몇가지 shell script와 k3s 라는 바이너리를 다운받게 되는데, 용량은 약 50Mbyte 정도 된다. 일반적으로는 약 15초 ~ 30초 정도 지나면 설치가 완료되나, 다운로드 속도가 느린 경우에는 50Mbyte 정보를 다운 받는 시간을 기다려야 한다. 지금 이 문서를 작성하면서 테스트를 하고 있는데, 지금은.. 왜 그런지 느리네... 흠.. 원래는 이렇게 느리지 않았는데... 아무튼 좀 기다리면 곧 설치가 된다.
잘 설치 되었는지 확인하자. 원래 kubernetes를 관리하기 위해선 kubectl
이라는 프로그램을 설치해 사용한다. 하지만 k3s를 설치하면 굳이 kubectl
을 직접 설치하지 않아도 된다. k3s kubectl
이라는 명령을 통해서 kubectl
을 실행 시킬 수 있다. k3s kubectl nodes
명령을 이용해서 kubernetes cluster가 잘 설치 되었는지 확인해 보자. ( kubectl get nodes
명령은 쿠버네티스에 몇개의 node(컴퓨터) 가 있는지 확인할 수 있는 명령이다. )
k3s kubectl get all -A
명령을 이용해서 쿠버네티스에 pod나 service, loadbalancer 가 잘 설정되어 있는지도 확인해 보자.
kind
에서는 LoadBalancer
를 사용하려고 하면 private IP 대역이 잡혀 서비스를 직접 돌려서 테스트하기 쉽지 않은데, k3s의 경우에는 traefik
이 같이 설치되고 LoadBalancer
의 external ip가, 지금 설치된 컴퓨터의 IP를 가지게 되므로 실제 서비스를 올린뒤 접속해서 테스트 해보기 좋다.
kubectl
명령이 필요할 때마다 k3s kubectl
이라고 치면 귀찮으니, 쉽게 alias를 만들 수도 있지만 그냥 kubectl
을 설치하도록 하자. 설치하는 방법도 여러가지가 있다. snap
을 이용해서 설치하는게 제일 편하긴 하지만, snap
은 home directory 위치에 따라서 또 다른 설정이 필요할 수도 있으므로, 여기에서는 그냥 package manager 즉, apt-get
을 이용해서 설치하는 방법을 가이드 한다. 물론 이 내용은 공식 홈페이지에서도 찾을 수 있다. ( https://kubernetes.io/docs/tasks/tools/install-kubectl/ )
sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl
kubectl을 설치한 직후에 바로 kubectl get nodes
명령을 사용하면 예전과를 다르게 에러 메세지가 발생하는 경우가 있다. kubectl은 사용자 홈 디렉토리에 .kube/config
파일을 읽어 kubernetes 환경 설정 정보로 사용하기 때문이다. 하지만 k3s를 설치하면 kubernetes 환경 설정 정보가 /etc/rancher/k3s/k3s.yaml
위치에 있다. 그러므로 이를 복사해 주어야 한다. 아래 명령을 수행하려면 k3s
를 설치할때 --write-kubeconfig-mode 644
명령을 줘야 root 권한이 아니더라도 별 문제 없이 수행 할 수 있다.
mkdir .kube # 이미 디렉토리가 만들어져 있는 경우도 있다.
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
설명이 길고 이것저것 실행해 보느라 길어보이지만, 정리해 보면 아래 명령어 한줄이면 single node cluster kubernetes를 구축할 수 있다.
curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
모든 테스트가 끝나면 깔끔하게 삭제하고 싶을것이다. 아래의 명령을 이용하면 k3s를 삭제하면서 kubernetes의 모든 것들을 삭제할 수 있다. k3s를 설치할 때 각종 스크립트가 설치 된다는 정보가 있는데 그곳에 스크립트 파일의 위치를 보여 주고 있다. 궁금하다면 스크롤을 올려서 설치 스크린샷에 아래의 스크립트가 있는것을 확인해 보자.
/usr/local/bin/k3s-uninstall.sh
글이 너무 길어지니 여기서 1차 정리를 하고, multi node cluster를 구축하는것은 다음글에서 다루도록 하겠다. 궁금하면 오백원..은 아니고, https://k3s.io/ 에 가면 agent 설치하는 설명이 있는데, 그곳을 먼저 봐도 되겠다. ㅋㅋ