kubeadm으로 Cilium 설치하기
kubeadm으로 Cilium 설치하기
이 가이드는 kubeadm으로 만든 Kubernetes 클러스터에 Cilium을 배포하는 방법을 다뤄요.
본문
kubeadm으로 만든 Kubernetes 클러스터에 Cilium을 배포하는 방법을 설명할게요.
시스템에 kubeadm을 설치하려면 공식 kubeadm 문서를 참고하세요. 공식 문서에는 여기서 언급하지 않은 kubeadm의 추가 옵션도 설명돼 있어요.
Cilium의 kube-proxy replacement를 사용하고 싶다면 Kubernetes Without kube-proxy 가이드를 따르고 이 가이드는 건너뛰어도 돼요.
클러스터 생성하기
컨트롤 플레인에서 다음을 실행해 초기화해요.
kubeadm init
참고
Cilium의 kube-proxy replacement를 사용하려면 kubeadm이 kube-proxy 배포 단계를 건너뛰어야 하므로
--skip-phases=addon/kube-proxy옵션으로 실행해야 해요.kubeadm init --skip-phases=addon/kube-proxy자세한 내용은 Kubernetes Without kube-proxy 가이드를 참고하세요.
그다음 kubeadm init이 반환한 토큰과 컨트롤 플레인 노드 IP 주소를 지정해 워커 노드를 조인해요.
kubeadm join <..>
Cilium 배포하기
Helm 저장소를 설정해요.
helm repo add cilium https://helm.cilium.io/
Cilium 차트는 OCI 레지스트리(Quay.io와 Docker Hub)에서도 사용할 수 있어요. 별도 설정 없이 oci:// URL로 바로 설치하면 됩니다.
차트 서명 검증과 digest 기반 설치는 OCI Registry 섹션을 참고하세요.
Helm으로 Cilium 릴리스를 배포해요.
helm install cilium cilium/cilium --version 1.20.2 \
--namespace kube-system
helm install cilium oci://quay.io/cilium/charts/cilium 1.20.2 \
--namespace kube-system
설치 검증하기
최신 버전의 Cilium CLI를 설치해요. Cilium CLI는 Cilium 설치, 설치 상태 점검, 다양한 기능(예: clustermesh, Hubble) 활성화/비활성화에 사용할 수 있어요.
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_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "arm64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-darwin-${CLI_ARCH}.tar.gz{,.sha256sum}
shasum -a 256 -c cilium-darwin-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-darwin-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-darwin-${CLI_ARCH}.tar.gz{,.sha256sum}
전체 releases 페이지를 참고하세요.
Cilium이 제대로 설치됐는지 확인하려면 다음을 실행해요.
$ cilium status --wait
/¯\
/¯\__/¯\ Cilium: OK
\__/¯\__/ Operator: OK
/¯\__/¯\ Hubble: disabled
\__/¯\__/ ClusterMesh: disabled
\__/
DaemonSet cilium Desired: 2, Ready: 2/2, Available: 2/2
Deployment cilium-operator Desired: 2, Ready: 2/2, Available: 2/2
Containers: cilium-operator Running: 2
cilium Running: 2
Image versions cilium quay.io/cilium/cilium:v1.9.5: 2
cilium-operator quay.io/cilium/operator-generic:v1.9.5: 2
클러스터가 올바른 네트워크 연결을 갖췄는지 확인하려면 다음 명령을 실행해요.
$ cilium connectivity test
ℹ️ Monitor aggregation detected, will skip some flow validation steps
✨ [k8s-cluster] Creating namespace for connectivity check...
(...)
---------------------------------------------------------------------------------------------------------------------
📋 Test Report
---------------------------------------------------------------------------------------------------------------------
✅ 69/69 tests successful (0 warnings)
참고
연결성 테스트는 Pod 중 하나에 열린 파일이 너무 많아 배포에 실패할 수 있어요. 이런 오류가 보이면 호스트 머신의
inotify리소스 한도를 늘리세요 (Pod errors due to "too many open files").
축하해요! 이제 Cilium이 동작하는 완전한 Kubernetes 클러스터가 갖춰졌어요. 🎉
Cilium과 필요한 컴포넌트들이 설치되는 과정을 다음과 같이 모니터링할 수 있어요.
$ kubectl -n kube-system get pods --watch
NAME READY STATUS RESTARTS AGE
cilium-operator-cb4578bc5-q52qk 0/1 Pending 0 8s
cilium-s8w5m 0/1 PodInitializing 0 7s
coredns-86c58d9df4-4g7dd 0/1 ContainerCreating 0 8m57s
coredns-86c58d9df4-4l6b2 0/1 ContainerCreating 0 8m57s
모든 컴포넌트가 뜨기까지 몇 분이 걸릴 수 있어요.
cilium-operator-cb4578bc5-q52qk 1/1 Running 0 4m13s
cilium-s8w5m 1/1 Running 0 4m12s
coredns-86c58d9df4-4g7dd 1/1 Running 0 13m
coredns-86c58d9df4-4l6b2 1/1 Running 0 13m
Pod 사이의 연결을 테스트하려면 "connectivity-check"를 배포할 수 있어요. 이를 위해 별도 네임스페이스를 만드는 것을 권장해요.
kubectl create ns cilium-test
다음 명령으로 체크를 배포해요.
kubectl apply -n cilium-test -f https://raw.githubusercontent.com/cilium/cilium/1.20.2/examples/kubernetes/connectivity-check/connectivity-check.yaml
이 단계는 다양한 연결 경로를 사용해 서로 연결되는 일련의 deployment들을 배포해요. 연결 경로에는 서비스 로드밸런싱 유무와 다양한 네트워크 정책 조합이 포함돼요. Pod 이름은 연결 변형(variant)을 나타내고, readiness와 liveness 게이트는 테스트의 성공 여부를 나타내요.
$ kubectl get pods -n cilium-test
NAME READY STATUS RESTARTS AGE
echo-a-76c5d9bd76-q8d99 1/1 Running 0 66s
echo-b-795c4b4f76-9wrrx 1/1 Running 0 66s
echo-b-host-6b7fc94b7c-xtsff 1/1 Running 0 66s
host-to-b-multi-node-clusterip-85476cd779-bpg4b 1/1 Running 0 66s
host-to-b-multi-node-headless-dc6c44cb5-8jdz8 1/1 Running 0 65s
pod-to-a-79546bc469-rl2qq 1/1 Running 0 66s
pod-to-a-allowed-cnp-58b7f7fb8f-lkq7p 1/1 Running 0 66s
pod-to-a-denied-cnp-6967cb6f7f-7h9fn 1/1 Running 0 66s
pod-to-b-intra-node-nodeport-9b487cf89-6ptrt 1/1 Running 0 65s
pod-to-b-multi-node-clusterip-7db5dfdcf7-jkjpw 1/1 Running 0 66s
pod-to-b-multi-node-headless-7d44b85d69-mtscc 1/1 Running 0 66s
pod-to-b-multi-node-nodeport-7ffc76db7c-rrw82 1/1 Running 0 65s
pod-to-external-1111-d56f47579-d79dz 1/1 Running 0 66s
pod-to-external-fqdn-allow-google-cnp-78986f4bcf-btjn7 1/1 Running 0 66s
참고
단일 노드 클러스터에 연결성 체크를 배포하면 멀티노드 기능을 확인하는 Pod들은
Pending상태로 남아요. 이는 해당 Pod들이 성공적으로 스케줄되려면 노드가 최소 2개 필요하기 때문이에요. 정상적인 현상이에요.
테스트가 끝나면 cilium-test 네임스페이스를 삭제해요.
kubectl delete ns cilium-test
다음 단계
- Setting up Hubble Observability
- Inspecting Network Flows with the CLI
- Service Map & Hubble UI
- Identity-Aware and HTTP-Aware Policy Enforcement
- Setting up Cluster Mesh