0. 들어가며
지난 포스팅을 통해 Kubernetes 클러스터를 구축해 보았다. 그러나 CNI(Container Network Interface)가 설치되지 않아 각 노드의 상태가 NotReady인 것을 확인하였다.
이번 포스팅에서는 Kubernetes 클러스터에 필수 Plug-in인 CNI에 대해 살펴보고 어떻게 구성할 수 있는지 알아보도록 하겠다.
1. CNI란?
Kubernetes 클러스터에는 수많은 Pod들이 생성과 삭제를 반복한다. 어떠한 이유로 Pod가 작동 불능 상태가 되면 Kubernetes 클러스터는 이를 감지하고 Pod를 폐기한 후 새로운 Pod를 실행시킨다. Pod는 각각 고유의 IP 주소를 가지고 있지만, 이는 고정적인 것이 아니기 때문에 Pod가 새로 생성되면 이 주소 역시 변하게 된다. 이러한 유동적인 IP 주소를 관리자가 직접 관리하는 것은 거의 불가능한 일이다.
게다가 Kuberntes는 멀티 노드 환경에서 구현되기 때문에 각 Pod들 간의 통신에 있어 노드를 넘나들어야 하는 경우도 빈번하다. 이런 경우에 각 Pod들이 서로 통신하기 위한 오버레이 네트워크가 필요하게 된다. 이 외에도 여러 가지 문제점들이 있는데 이를 해결하기 위해 만들어진 컨테이너 네트워킹 제어를 위한 표준이 바로 CNI라 생각하면 된다.
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
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 추가 및 설치
위 링크를 통해 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
cilium 컨테이너가 모두 배포되는데 약간의 시간이 소요된다. 잠시 후 kubectl get pods -A 명령어를 실행해 보면 cilium 컨테이너들이 설치된 것을 볼 수 있고, 더하여 core-dns Pod들이 정상 작동 하는 것도 확인할 수 있다.
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
3. 마무리
3편에 결친 긴 포스팅을 통해 Kubernetes 클러스터를 On-Premise 환경에서 구축해 보았다. 물론 누군가 만들어둔 스크립트를 명령어 한 번의 실행을 통해 Kubernetes 클러스터를 쉽게 구축할 수도 있을 것이다. 그 방법이 확실하게 더 편하고 쉬운 방법임에는 틀림이 없다. 또한, 직접 Kubernetes 클러스터를 구축한다고 하여 Kubernetes를 모두 이해할 수 있는 것은 절대로 아니겠지만, 그럼에도 이러한 수고로운 과정을 통해 Kubernetes에 대한 이해가 한층 올라갈 수 있다고 생각한다.
그러면 긴 포스팅을 이쯤 마무리하도록 하겠다.
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] HAProxy와 Keepalived를 활용한 Kubernetes API 클러스터 HA 구현 - 2편 (1) | 2023.10.22 |
---|---|
[Ubuntu 22.04] Kubernetes Cluster 구축 - 2편 (0) | 2023.10.15 |
[Ubuntu 22.04] Kubernetes Cluster 구축 - 1편 (0) | 2023.10.15 |
[Kubernetes] HAProxy와 Keepalived를 활용한 Kubernetes API 클러스터 HA 구현 - 1편 (0) | 2023.09.13 |