👉 이 게시글은 도커 / 쿠버네티스 온라인 부트캠프 with 카카오엔터프라이즈 강의를 바탕으로 작성되었습니다.
VM(Virtual Machine)을 바탕으로 쿠버네티스 클러스터를 구축해보도록 하겠습니다. 해당 실습에서는 총 4대의 ubuntu 기반 VM을 사용하며, 아래 그림과 같이 총 1개의 master node와 3개의 worker node로 구성된 쿠버네티스 클러스터를 구축합니다.
관리자 권한으로 접속한 뒤 apt
를 update함과 동시에 docker runtime을 설치합니다. docker runtime은 docker가 효율적으로 실행될 수 있는 환경을 마련해주는 소프트웨어라고 생각하시면 되겠습니다. 모든 인스턴스에서 다음 명령어를 실행합니다.
$ sudo -i
$ apt update && apt install -y docker.io
설치가 완료되었으면 docker info
명령을 통해 각 머신에 설치된 도커의 정보를 확인해보도록 하겠습니다.
정상적으로 설치가 되었다면 위와 같이 도커 시스템의 정보가 출력됩니다.
다음은 kubeadm, kubelet, kubectl이라 불리는 3개의 패키지를 설치해야 합니다. 각 패키지의 역할은 다음과 같습니다.
- kubeadm : 클러스터를 부트스트랩(클러스터를 구축하고 실행하는 과정)하는 명령
- kubelet : 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행
- kubectl : 클라이언트와 클러스터의 api 기반 통신을 지원
아래의 설치 과정을 모든 노드에서 실행하도록 하겠습니다.
$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https ca-certificates curl
$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
$ echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl
설치 과정에서 사용되는 명령이 많으므로, 이를 스크립트로 만들면 여러 노드에서도 간단하게 설치를 진행할 수 있습니다. 위의 모든 명령들을 텍스트 편집기에 순서대로 복사 & 붙여넣기 한 뒤에, 최상단과 최하단에 아래와 같이 명령을 추가합니다.
이후, 전체 내용을 복사한 후에 터미널에서 붙여넣기하면 다음과 같이 스크립트가 생성됩니다.
이제 해당 스크립트를 실행시켜주기만 하면 됩니다. 참 쉽죠?
$ bash kube_install.sh
설치가 완료되었다면 kubeadm 버전을 확인해보도록 하겠습니다.
설치가 잘 완료되었네요. 다음 단계로 넘어가도록 하겠습니다.
kubelet과 컨테이너 런타임의 cgroup 드라이버가 일치하지 않으면 kubelet 프로세스가 정상적으로 동작하지 않으므로 이를 일치시켜주는 작업이 필요합니다. 설치된 환경에서의 cgroup 이름을 먼저 확인해보도록 하겠습니다.
$ docker info | grep -i cgroup
cgroup의 이름이 cgroupfs로 설정되어 있는 것을 확인할 수 있습니다. kubelet은 systemd
를 사용하기 때문에, 반드시 이를 매칭시켜주어야 합니다.
/etc/docker/daemon.json
을 다음 내용으로 생성해준 뒤, 도커 서비스를 재시동하도록 하겠습니다.
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
이 작업 역시 위에서 진행했던 방식과 마찬가지로 스크립트를 생성하여 진행하겠습니다.
모든 인스턴스에서 위 내용을 복사 & 붙여넣기 후, cgroup을 확인해보겠습니다.
위와 같이 systemd
로 변경되었으면 성공입니다.
본격적으로 클러스터 구성을 위한 작업을 진행하도록 하겠습니다.
먼저, 마스터 노드로 구성할 인스턴스에서 해당 명령을 실행합니다. 본 실습에서는 하나의 마스터 노드로만 클러스터를 구성하기 때문에 추가적인 설정 없이 진행합니다.
$ kubeadm init
해당 명령을 통해 마스터 노드가 구성되었습니다. 초기화가 정상적으로 진행되었으면 아래 메시지가 터미널에 출력됩니다.
먼저, 각각의 인스턴스에서 사용자 설정을 아래 명령을 통해 진행합니다.
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
맨 마지막에 있는 kubeadm join
명령을 워커 노드로 구성하고자 하는 인스턴스에서 실행하면 클러스터에 각각의 인스턴스들이 워커 노드로 조인하게 됩니다. 다음 명령을 통해 클러스터가 어떻게 구성되었는지 확인해보겠습니다.
$ kubectl get nodes
1개의 마스터 노드와 3개의 워커 노드로 이루어진 클러스터가 정상적으로 구축된 것을 확인할 수 있습니다. 하지만 모든 노드의 상태가 NotReady이므로, 추가적인 작업이 필요합니다. 이제 마지막 단계로 넘어가도록 하겠습니다.
클러스터 내부의 통신망을 구축하기 위해서는 CNI를 설치해야 합니다. CNI는 클러스터에서 컨테이너간 통신을 할 수 있도록 도와줍니다. 마스터 노드에서 실행하면 워커 노드에까지 자동적으로 설치가 되므로, 마스터 노드에서만 설치를 진행하도록 하겠습니다.
https://kubernetes.io/docs/concepts/cluster-administration/addons/
위 링크에서 Calico
, Antrea
등 다양한 종류의 오버레이 네트워크를 확인하실 수 있습니다. 본 실습에서는 Weave Net
으로 구성하도록 하겠습니다
$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
설치 후 약 1~2분 뒤에 다시 kubectl get nodes
명령을 실행해보면,
위와 같이 모든 노드가 Ready 상태로 바뀐 것을 확인할 수 있습니다.
수고하셨습니다! 1개의 마스터 노드와 3개의 워커 노드로 구성된 클러스터 구축이 성공적으로 완료되었습니다.
덱드