AWS VPC CNI 플러그인과 체이닝하기
AWS VPC CNI 플러그인과 체이닝하기 (AWS VPC CNI plugin)
AWS VPC CNI 플러그인과 함께 Cilium을 설정하는 방법을 설명할게요. 이 하이브리드 모드에서는 AWS VPC CNI 플러그인이 가상 네트워크 장치 설정과 ENI를 통한 IP 주소 관리(IPAM)를 담당해요.
본문
이 가이드는 AWS VPC CNI 플러그인과 함께 Cilium을 설정하는 방법을 설명해요. 이 하이브리드 모드에서 AWS VPC CNI 플러그인은 가상 네트워크 장치 설정과 ENI를 통한 IP 주소 관리(IPAM)를 담당해요. 특정 파드에 초기 네트워킹이 설정된 후, Cilium CNI 플러그인은 AWS VPC CNI 플러그인이 설정한 네트워크 장치에 eBPF 프로그램을 붙여 네트워크 정책을 강제하고, 로드밸런싱을 수행하며, 암호화를 제공해요.
참고: 다른 CNI 플러그인과 체이닝할 때는 일부 고급 Cilium 기능이 제한될 수 있어요.
영상: Cilium의 고급 기능이 필요하다면 완전히 Cilium으로 마이그레이션하는 것을 고려해 보세요. 이 과정에 도움을 얻으려면, Meltwater에서 AWS VPC CNI 플러그인에서 Cilium으로 프로덕션 Kubernetes 클러스터를 마이그레이션한 방법을 소개하는 두 Principal Engineer의 강연을 볼 수 있어요.
중요: Cilium과의 호환성을 보장하려면 AWS VPC CNI 플러그인 버전 1.11.2 이상을 실행 중인지 확인하세요. 위 예시처럼 더 오래된 버전을 실행 중이라면 다음으로 업그레이드할 수 있어요.
AWS에 클러스터 설정하기
EKS 클러스터를 설정하려면 Cilium Quick Installation 가이드의 지침을 따르거나, AWS에 Kubernetes 클러스터를 설정하는 다른 선호 방식을 사용해도 돼요.
aws-vpc-cni-k8s 플러그인이 설치되어 있는지 확인하세요. EKS 클러스터를 생성했다면 이미 설치돼 있을 거예요. 또한 플러그인 버전이 위에서 말한 대로 최신인지 확인하세요.
Helm 저장소를 설정해요.
Helm Repository
helm repo add cilium https://helm.cilium.io/
Cilium 차트는 OCI 레지스트리(Quay.io 및 Docker Hub)에서도 사용할 수 있어요. 추가 설정 없이 oci:// URL로 직접 설치할 수 있어요. 차트 서명 검증과 digest 기반 설치를 포함한 자세한 내용은 OCI Registry 섹션을 참고하세요.
Helm으로 Cilium을 배포해요.
Helm Repository
helm install cilium cilium/cilium --version 1.20.2 \
--namespace kube-system \
--set cni.chainingMode=aws-cni \
--set cni.exclusive=false \
--set enableIPv4Masquerade=false \
--set routingMode=native
OCI Registry
helm install cilium oci://quay.io/cilium/charts/cilium 1.20.2 \
--namespace kube-system \
--set cni.chainingMode=aws-cni \
--set cni.exclusive=false \
--set enableIPv4Masquerade=false \
--set routingMode=native
이렇게 하면 AWS VPC CNI 플러그인과의 체이닝이 활성화돼요. ENI IP 주소가 VPC에서 직접 라우팅될 수 있으므로 터널링도 비활성화돼요. 같은 이유로 마스커레이딩도 비활성화할 수 있어요.
기존 파드 재시작하기
새 CNI 체이닝 구성은 이미 클러스터에서 실행 중인 파드에는 적용되지 않아요. 기존 파드는 연결이 가능하고 Cilium이 그쪽으로는 로드밸런싱하지만, 그쪽에서 나가는 트래픽에 대해서는 로드밸런싱하지 않아요. 정책 강제도 적용되지 않아요. 이런 이유로, 체이닝 구성을 적용받으려면 이 파드들을 재시작해야 해요.
다음 명령으로 어떤 파드를 재시작해야 하는지 확인할 수 있어요.
for ns in $(kubectl get ns -o jsonpath='{.items[*].metadata.name}'); do
ceps=$(kubectl -n "${ns}" get cep \
-o jsonpath='{.items[*].metadata.name}')
pods=$(kubectl -n "${ns}" get pod \
-o custom-columns=NAME:.metadata.name,NETWORK:.spec.hostNetwork \
| grep -E '\s(<none>|false)' | awk '{print $1}' | tr '\n' ' ')
ncep=$(echo "${pods} ${ceps}" | tr ' ' '\n' | sort | uniq -u | paste -s -d ' ' -)
for pod in $(echo $ncep); do
echo "${ns}/${pod}";
done
done
설치 검증 (Validate the Installation)
Cilium CLI의 최신 버전을 설치해요. Cilium CLI는 Cilium 설치, Cilium 설치 상태 검사, 그리고 다양한 기능(예: clustermesh, Hubble)의 활성화/비활성화에 사용할 수 있어요.
Linux
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}
macOS
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)
참고: 연결성 테스트는 일부 파드에서 열려 있는 파일이 너무 많아 배포에 실패할 수도 있어요. 이런 오류가 보이면 호스트 머신의 inotify 리소스 한도를 늘려 보세요 (즉, "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
파드 간 연결성을 테스트하려면 "connectivity-check"를 배포할 수 있어요. 이를 위한 별도 네임스페이스를 만드는 것을 권장해요.
kubectl create ns cilium-test
다음으로 검사(check)를 배포하면 돼요.
kubectl apply -n cilium-test -f https://raw.githubusercontent.com/cilium/cilium/1.20.2/examples/kubernetes/connectivity-check/connectivity-check.yaml
이것은 다양한 연결성 경로로 서로 연결되는 일련의 배포(deployment)들을 배포해요. 연결성 경로에는 서비스 로드밸런싱 유무와 다양한 네트워크 정책 조합이 포함돼요. 파드 이름은 연결성 변형을 나타내며, 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
참고: 연결성 검사를 단일 노드 클러스터에 배포하면, 멀티 노드 기능을 확인하는 파드는 Pending 상태로 남아 있어요. 이는 정상이에요. 이 파드들은 성공적으로 스케줄링되려면 최소 2개의 노드가 필요하기 때문이에요.
테스트가 끝나면 cilium-test 네임스페이스를 제거하세요.
kubectl delete ns cilium-test
고급 (Advanced)
파드용 보안 그룹 활성화 (EKS)
Cilium은 지원되는 클러스터에서 체이닝 모드로 실행될 때 EKS의 security groups for pods 기능과 함께 사용할 수 있어요. 이 기능을 활성화하려면 아래 지침을 따르세요.
중요: 다음 가이드는 jq와 AWS CLI가 설치·구성되어 있어야 해요.
AmazonEKSVPCResourceController 관리 정책이 EKS 클러스터와 연결된 IAM 역할에 부착되어 있는지 확인하세요.
export EKS_CLUSTER_NAME="my-eks-cluster" # Change accordingly
export EKS_CLUSTER_ROLE_NAME=$(aws eks describe-cluster \
--name "${EKS_CLUSTER_NAME}" \
| jq -r '.cluster.roleArn' | awk -F/ '{print $NF}')
aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController \
--role-name "${EKS_CLUSTER_ROLE_NAME}"
그런 다음, 위에서 말한 대로 클러스터에서 실행 중인 AWS VPC CNI 플러그인 버전이 최신인지 확인하세요.
kubectl -n kube-system get ds/aws-node \
-o jsonpath='{.spec.template.spec.containers[0].image}'
602401143452.dkr.ecr.us-west-2.amazonaws.com/amazon-k8s-cni:v1.7.10
다음으로, 파드용 보안 그룹을 활성화하기 위해 kube-system/aws-node DaemonSet을 패치해요.
kubectl -n kube-system patch ds aws-node \
-p '{"spec":{"template":{"spec":{"initContainers":[{"env":[{"name":"DISABLE_TCP_EARLY_DEMUX","value":"true"}],"name":"aws-vpc-cni-init"}],"containers":[{"env":[{"name":"ENABLE_POD_ENI","value":"true"}],"name":"aws-node"}]}}}}'
kubectl -n kube-system rollout status ds aws-node
롤아웃이 완료된 후, 클러스터의 모든 노드는 vps.amazonaws.com/has-trunk-attached 라벨이 true로 설정되어 있어야 해요.
kubectl get nodes -L vpc.amazonaws.com/has-trunk-attached
NAME STATUS ROLES AGE VERSION HAS-TRUNK-ATTACHED
ip-192-168-111-169.eu-west-2.compute.internal Ready <none> 22m v1.19.6-eks-49a6c0 true
ip-192-168-129-175.eu-west-2.compute.internal Ready <none> 22m v1.19.6-eks-49a6c0 true
이 시점부터 모든 것이 준비된 상태예요. 실제로 보안 그룹을 파드에 연결하는 방법에 대한 자세한 내용은 공식 문서를 참조하세요.
다음 단계 (Next Steps)
-
Hubble Observability 설정
-
CLI로 네트워크 플로우 검사
-
Service Map과 Hubble UI
-
Identity-Aware 및 HTTP-Aware 정책 강제
-
Cluster Mesh 설정