본문 바로가기

DevOps/Kubernetes

[Ubuntu 22.04] Kubernetes Cluster 구축 - 3편

0. 들어가며

 지난 포스팅을 통해 Kubernetes 클러스터를 구축해 보았다. 그러나 CNI(Container Network Interface)가 설치되지 않아 각 노드의 상태가 NotReady인 것을 확인하였다.

 

[Ubuntu 22.04] Kubernetes Cluster 구축 - 2편

0. 들어가며 [Ubuntu 22.04] Kubernetes Cluster 구축 - 1편에서 이어지는 내용으로 전편을 참고한 후 해당 포스팅을 보는 것을 추천드린다. [Ubuntu 22.04] Kubernetes Cluster 구축 - 1편 0. 들어가며 Kubernetes 강의를

tech-recipe.tistory.com

 이번 포스팅에서는 Kubernetes 클러스터에 필수 Plug-in인 CNI에 대해 살펴보고 어떻게 구성할 수 있는지 알아보도록 하겠다.

 

1. CNI란?

  Kubernetes 클러스터에는 수많은 Pod들이 생성과 삭제를 반복한다. 어떠한 이유로 Pod가 작동 불능 상태가 되면 Kubernetes 클러스터는 이를 감지하고 Pod를 폐기한 후 새로운 Pod를 실행시킨다. Pod는 각각 고유의 IP 주소를 가지고 있지만, 이는 고정적인 것이 아니기 때문에 Pod가 새로 생성되면 이 주소 역시 변하게 된다. 이러한 유동적인 IP 주소를 관리자가 직접 관리하는 것은 거의 불가능한 일이다.

 게다가 Kuberntes는 멀티 노드 환경에서 구현되기 때문에 각 Pod들 간의 통신에 있어 노드를 넘나들어야 하는 경우도 빈번하다. 이런 경우에 각 Pod들이 서로 통신하기 위한 오버레이 네트워크가 필요하게 된다. 이 외에도 여러 가지 문제점들이 있는데 이를 해결하기 위해 만들어진 컨테이너 네트워킹 제어를 위한 표준이 바로 CNI라 생각하면 된다.

[사진 1] CNCF의 여러 프로젝트 중 CNI와 관련된 Plug-in

 CNCF Lnadscape에서 확인해 보면 CNI만 해도 여러 종류가 있다. 각 CNI는 각각의 기능과 특징에 차이는 있어 어떤 CNI를 사용해야 할지부터가 고민이다. 여러 Kubernetes 강의에서 자주 등장하는 Calico가 대표적인데 그 외에도 VMware에서 후원하는 Antrea도 있고, Flannel, Weave net 등 여러 가지가 있다.

 이 중, 이번 포스팅에 사용하게 될 CNI는 Cilium이다. 이를 선택하게 된 이유는 우선 CNCF에서 밀어주는 프로젝트이기도 하고, 현재 개인적으로 진행하는 프로젝트에 On-Premise 환경에서 BGP를 사용하여 LoadBalancer 기능을 사용할 수 있기 때문이기도 하다. (참고로 Calico 역시 BGP를 기반으로 하고 있어 On-Premise 환경에서 LoadBalancer 기능을 사용할 수 있다.)

 

2. 설치 진행

 1) Helm

 

Helm

Helm - The Kubernetes Package Manager.

helm.sh

 Kubernetes에는 여러가지 Add-on들이 존재한다. 이를 쉽게 설치하고 사용하기 위한 툴인 Helm이라는 것이 있는데, 이를 이용해 Cilium 설치를 간단히 수행해 보고자 한다. 먼저 Helm을 설치해 보자.

curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list

sudo apt-get update
sudo apt-get install helm

 Helm chart 설치는 비교적 간단하다. 위 다섯 줄 명령어를 차례로 실행시켜 줌으로써 Helm 설치가 완료된다.

 

 2) Cilium repo 추가 및 설치

 

Installation using Helm — Cilium 1.14.2 documentation

If you are running an ACK cluster, you should delete the ACK CNI. Cilium will manage ENIs instead of the ACK CNI, so any running DaemonSet from the list below has to be deleted to prevent conflicts. Note If you are using ACK with Flannel (DaemonSet kube-fl

docs.cilium.io

 위 링크를 통해 Cilium 설치를 확인할 수 있다. 공식 문서를 참고하는 것이 조금 더 도움이 될 것 같아 링크를 첨부했다. 아래는 그 내용을 정리한 것이다.

helm repo add cilium https://helm.cilium.io/
#helm의 cilium repo 추가

helm install cilium cilium/cilium --version 1.14.2 \
  --namespace kube-system
#cilium 설치

NAME: cilium
LAST DEPLOYED: Sun Oct 15 05:56:57 2023
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
You have successfully installed Cilium with Hubble.

Your release version is 1.14.2.

For any further help, visit https://docs.cilium.io/en/v1.14/gettinghelp

[사진 2] Helm의 Cilium repo 추가 및 설치

 cilium 컨테이너가 모두 배포되는데 약간의 시간이 소요된다. 잠시 후 kubectl get pods -A 명령어를 실행해 보면 cilium 컨테이너들이 설치된 것을 볼 수 있고, 더하여 core-dns Pod들이 정상 작동 하는 것도 확인할 수 있다.

[사진 3] Kubernetes Pod와 Node 모두 정상 작동하는 모습 확인

 

 3) Cilium CLI 설치

 위 설치 과정만으로도 Cilium은 훌륭하게 작동한다. 그러나 더 Cilium의 더 많은 기능을 사용하기 위해서는 Cilium CLI를 설치해야 한다. 설치 방법은 역시 간단하다.

CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}

 위 명령어를 각각 한 줄씩 입력해 주면 설치가 완료된다. 설치가 잘 되었는지 확인하기 위해서 아래 명령어를 실행해 보면 다음과 같은 결과를 얻을 수 있다.

cilium status --wait

    /¯¯\
 /¯¯\__/¯¯\    Cilium:             OK
 \__/¯¯\__/    Operator:           OK
 /¯¯\__/¯¯\    Envoy DaemonSet:    disabled (using embedded mode)
 \__/¯¯\__/    Hubble Relay:       disabled
    \__/       ClusterMesh:        disabled

Deployment             cilium-operator    Desired: 2, Ready: 2/2, Available: 2/2
DaemonSet              cilium             Desired: 4, Ready: 4/4, Available: 4/4
Containers:            cilium             Running: 4
                       cilium-operator    Running: 2
Cluster Pods:          2/2 managed by Cilium
Helm chart version:    1.14.2
Image versions         cilium             quay.io/cilium/cilium:v1.14.2@sha256:6263f3a3d5d63b267b538298dbeb5ae87da3efacf09a2c620446c873ba807d35: 4
                       cilium-operator    quay.io/cilium/operator-generic:v1.14.2@sha256:52f70250dea22e506959439a7c4ea31b10fe8375db62f5c27ab746e3a2af866d: 2

[사진 4] Cilim CLI를 통한 Cilium 상태 확인

 

3. 마무리

 3편에 결친 긴 포스팅을 통해 Kubernetes 클러스터를 On-Premise 환경에서 구축해 보았다. 물론 누군가 만들어둔 스크립트를 명령어 한 번의 실행을 통해 Kubernetes 클러스터를 쉽게 구축할 수도 있을 것이다. 그 방법이 확실하게 더 편하고 쉬운 방법임에는 틀림이 없다. 또한, 직접 Kubernetes 클러스터를 구축한다고 하여 Kubernetes를 모두 이해할 수 있는 것은 절대로 아니겠지만, 그럼에도 이러한 수고로운 과정을 통해 Kubernetes에 대한 이해가 한층 올라갈 수 있다고 생각한다.

 

 그러면 긴 포스팅을 이쯤 마무리하도록 하겠다.