외부 etcd와 함께 Cilium 설치하기
외부 etcd와 함께 Cilium 설치하기
이 가이드는 외부 etcd를 사용해 Kubernetes에 Cilium을 설정하는 단계를 안내해요. 외부 etcd를 쓰면 성능이 더 좋아져서 규모가 큰 환경에 적합해요.
본문
외부 etcd를 사용해 Kubernetes에 Cilium을 설정하는 단계를 하나씩 살펴볼게요. 외부 etcd를 사용하면 성능이 더 좋고, 대규모 환경에 적합해요.
설치 중 문제가 생기면 Troubleshooting 섹션을 참고하거나 Cilium Slack에서 도움을 받아 보세요.
언제 kvstore가 필요한가요?
Cilium Quick Installation 섹션과 달리, 이 가이드는 Cilium이 etcd 같은 외부 kvstore를 사용하도록 설정하는 방법을 다뤄요. kvstore가 꼭 필요한지 고민된다면, kvstore를 써야 하는 경우는 다음과 같아요.
- Kubernetes 이벤트로 인한 상태 전파 오버헤드가 크게 관찰되는 환경에서 실행 중인 경우
- Cilium이 상태를 Kubernetes 커스텀 리소스(CRD)에 저장하고 싶지 않은 경우
- Scalability report에서 테스트한 것보다 더 많은 Pod와 노드로 클러스터를 운영하는 경우
요구사항
Kubernetes 환경이 요구사항을 충족하는지 확인하세요.
- Kubernetes >= 1.16
- Linux kernel >= 5.10 또는 그에 준하는 커널
- CNI 모드의 Kubernetes
- 모든 워커 노드에 eBPF 파일시스템이 마운트되어 있어야 함
- 권장:
kube-controller-manager에서 PodCIDR 할당(--allocate-node-cidrs) 활성화 (권장)
Kubernetes 환경을 준비하는 자세한 방법은 Requirements 섹션을 참고하세요.
또한 버전 3.4.0 이상의 외부 etcd가 필요해요.
Kvstore와 Cilium의 의존성
외부 kvstore를 사용할 때는 Cilium과 kvstore 사이의 순환 의존성을 끊는 게 중요해요. kvstore Pod가 같은 클러스터 안에서 pod 네트워크를 사용해 실행 중이라면 kvstore는 Cilium에 의존하게 돼요. 하지만 Cilium도 kvstore에 의존하므로 순환 의존성이 생기죠. 이 의존성을 끊는 권장 방법은 두 가지예요.
- kvstore를 클러스터 밖이나 별도로 관리되는 클러스터에 배포한다.
- pod 스펙에
hostNetwork: true를 지정해서 kvstore Pod를 호스트 네트워크로 배포한다.
Cilium 설정하기
외부 kvstore를 사용할 때는 ConfigMap에 외부 kvstore 주소를 설정해야 해요. 기본 YAML을 내려받아 Helm으로 구성해 보세요.
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 \
--set etcd.enabled=true \
--set "etcd.endpoints[0]=http://etcd-endpoint1:2379" \
--set "etcd.endpoints[1]=http://etcd-endpoint2:2379" \
--set "etcd.endpoints[2]=http://etcd-endpoint3:2379"
helm install cilium oci://quay.io/cilium/charts/cilium 1.20.2 \
--namespace kube-system \
--set etcd.enabled=true \
--set "etcd.endpoints[0]=http://etcd-endpoint1:2379" \
--set "etcd.endpoints[1]=http://etcd-endpoint2:2379" \
--set "etcd.endpoints[2]=http://etcd-endpoint3:2379"
Cilium이 상태를 Kubernetes 커스텀 리소스(CRD)에 저장하고 싶지 않다면 identityAllocationMode를 설정하는 것도 고려해 보세요.
--set identityAllocationMode=kvstore
선택사항: SSL 인증서 구성하기
etcd의 루트 인증 기관(CA)과 클라이언트 측 키·인증서로 Kubernetes 시크릿을 생성해요.
kubectl create secret generic -n kube-system cilium-etcd-secrets \
--from-file=etcd-client-ca.crt=ca.crt \
--from-file=etcd-client.key=client.key \
--from-file=etcd-client.crt=client.crt
Helm 템플릿 생성을 조정해 etcd에 SSL을 활성화하고 etcd 엔드포인트 URL에 http 대신 https를 사용해요.
helm install cilium cilium/cilium --version 1.20.2 \
--namespace kube-system \
--set etcd.enabled=true \
--set etcd.ssl=true \
--set "etcd.endpoints[0]=https://etcd-endpoint1:2379" \
--set "etcd.endpoints[1]=https://etcd-endpoint2:2379" \
--set "etcd.endpoints[2]=https://etcd-endpoint3:2379"
helm install cilium oci://quay.io/cilium/charts/cilium 1.20.2 \
--namespace kube-system \
--set etcd.enabled=true \
--set etcd.ssl=true \
--set "etcd.endpoints[0]=https://etcd-endpoint1:2379" \
--set "etcd.endpoints[1]=https://etcd-endpoint2:2379" \
--set "etcd.endpoints[2]=https://etcd-endpoint3:2379"
설치 검증하기
최신 버전의 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