IT/Kubernetes

[Kubernetes] kubeadm을 이용해 Kubernetes 클러스터를 구축해보자

wookiist 2021. 6. 21. 00:10

프롤로그

지난 포스트 "[containerd] containerd를 CRI 런타임으로 하는 Kubernetes 클러스터를 구축해보자" 에 이어서 이번엔 Kubernetes 클러스터를 구축해보겠습니다. 본 포스트에선 이미 CRI 런타임이 설치되어 있다고 가정하고 kubeadm을 이용해 클러스터를 구축합니다. 만약 CRI 런타임이 설치되어 있지 않다면, 위 포스트를 참고하여 CRI 런타임부터 설치해주세요!

추가로, 이 포스트는 개발 환경에서 사용하기 위해 간단하게 구축하는 방법을 소개합니다. 실제 프로덕션 환경에서 사용하셔서는 안 됩니다!

추가에 추가로, 가장 간단하게 로컬에 Kubernetes 클러스터를 구축하는 방법은 minikube를 사용하시거나 docker for mac 등을 사용하셔서 해당 프로그램에서 제공하는 Kubernetes 클러스터 구축 기능을 이용하시는게 제일 편합니다!!!! 간단하게만 사용하실 생각이시면, 방금 소개 드린 두 방법을 활용해볼 것을 심각하게 고민해주세요!

요구사항

  • 본 과정은 ubuntu 18.04에서 진행하였습니다.
  • 각 노드는 2GiB 이상의 RAM을 탑재하고 있어야 합니다. 이보다 적은 노드가 있을 경우, 애플리케이션을 정상적으로 운용하지 못할 수도 있습니다.
  • control 노드는 적어도 2 CPU를 탑재하고 있어야 합니다.
  • 클러스터 내의 모든 노드는 서로 네트워크로 연결되어 있어야 합니다. 외부망 또는 내부망 어떤 것을 사용하여도 좋습니다.

Kubernetes 패키지 설치

모든 노드에 Kubernetes 클러스터 구축에 필요한 패키지를 설치합니다. 큰 흐름은 여기를 따라갑니다. control 노드를 제외한 worker 노드에는 kubectl 패키지는 설치하지 않아도 괜찮습니다.

# apt 패키지 인덱스를 업데이트하고, Kubernetes apt 저장소가 필요로 하는 패키지를 설치합니다.
$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https ca-certificates curl

# Google Cloud public signing key를 다운로드합니다.
$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

# Kubernetes apt 저장소를 등록합니다.
$ 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

# apt 패키지를 업데이트하고, kubelet, kubeadm, kubectl을 설치합니다.
# 그리고 kubelet, kubeadm, kubectl이 자동으로 업그레이드 되는 일이 없게끔 버전을 고정합니다.
$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl

kubeadm을 이용한 클러스터 구축

control 노드 초기화

control 노드의 IP가 192.168.56.100 이라고 가정하고 다음을 진행합니다. 만약 IP가 다르다면 해당하는 IP를 넣어주시면 됩니다.

$ sudo kubeadm init \
--apiserver-cert-extra-sans=192.168.56.100 \
--control-plane-endpoint=192.168.56.100:6443

구축 과정이 정상적으로 종료되었다면, 아래와 같은 문구가 화면에 출력될 것입니다. 아래 문구 중 가장 아래에 있는 kubeadm join 명령어 부분은 꼭 어딘가에 기록해두어주세요! 추후 사용할 일이 있습니다.

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a Pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  /docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

kubectl 설정하기

kubectl 명령어를 non-root 유저가 사용할 수 있도록 아래의 과정을 수행해줍니다. 아래 내용은 위에서 보여드린대로 control 노드 초기화 단계에서 마지막에 출력된 명령어의 상단에 위치합니다.

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

Pod 네트워크 애드온 설치

Kubernetes 공식 문서에선 다음의 내용을 찾을 수 없습니다. 어느 한쪽으로 치우치지 않기 위함이라고 하는데요. 저희는 calico를 사용하도록 하겠습니다.

$ curl https://docs.projectcalico.org/manifests/calico.yaml -O
$ kubectl apply -f calico.yaml

worker 노드 추가

control 노드를 초기화하면서 마지막에 출력된 명령어를 가지고 worker 노드를 추가합니다. worker 노드를 추가하는 명령어는 가장 아래에 있는 다음 명령어 입니다.

$ sudo kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

이 명령어를 worker 노드로 등록할 노드에 원격 접속하여 실행해줍니다. 정상적으로 등록되었다면 kubectl get nodes 명령어를 실행했을 때, 새로운 노드가 추가되어 있을 것입니다.

설치 검증하기

정상적으로 노드도 추가되고, 클러스터 구축이 완료되었는지 확인할 차례입니다. control 노드에서 다음의 명령어를 수행합니다.

$ kubectl get nodes
NAME                STATUS   ROLES                  AGE   VERSION
containerd-test     Ready    control-plane,master   40d   v1.21.0
containerd-test-2   Ready    <none>                 40d   v1.21.0

위와 같이 노드의 STATUS가 Ready로 잘 나타난다면, 정상적으로 추가된 것입니다. 이제 Kubernetes에서 할 수 있는 많은 것들에 도전해보세요!

추후 계획

사실 이렇게 설치하는 방법은 나중에 노드를 추가할 때나, 다른 클러스터를 구축할 때 활용하기 어렵습니다. 너무 간략하게만 소개드린 것 같아서 아쉬운 마음이 크네요. 제가 사내 Kubernetes 클러스터를 구축할 때는 kubeadm의 config 파일들을 생성하고, 인증서 파일들도 직접 만들어서 등록하는 방식을 이용합니다. 이 방법에 대해선 7월 즈음에 다뤄보도록 하겠습니다.

참고

마무리

여기까지 따라오시느라 고생이 많으셨습니다. 만약 이 튜토리얼이 도움이 되셨다면 글 좌측 하단의 하트❤를 눌러주시면 감사하겠습니다.

혹시라도 튜토리얼에 이상이 있거나, 이해가 가지 않으시는 부분, 또는 추가적으로 궁금하신 내용이 있다면 주저 마시고 댓글💬을 남겨주세요! 빠른 시간 안에 답변을 드리겠습니다 😊

반응형