스터디 이야기/25' Cilium

Cilium IPAM Mode와 IPAM 모드 변경 실습

lakescript 2025. 7. 28. 16:24
728x90

 

IPAM

IPAM이란?

흔히 IPAM (IP Address Management)은 네트워크에서 IP 주소를 정리하고 관리하는 시스템을 말합니다.

 

IPAM 예시

기업에서 직원용 PC에 IP 자동 할당
기업에서 직원용 PC에 IP를 할당할 때에 IPAM에서 DHCP 서버와 연동해 사용 가능한 IP 주소 풀을 정의하고, PC를 네트워크에 연결하면 DHCP가 자동으로 IP를 할당하고 IPAM이 기록합니다.

학교에서 학생들의 기기에 대한 IP 추적
IPAM에서 각 교실이나 사용자 그룹별로 서브넷을 나누고 IP를 예약합니다. 그 후 기기 접속 시 IPAM은 할당된 IP와 접속 이력을 저장해 누가 언제 사용했는지 추적이 가능합니다.

 

Cilium에서의 IPAM

Cilium은 Kubernetes 네트워크를 구성할 때, Pod에 할당되는 IP 주소를 자체적으로 관리할 수 있는 IPAM기능이 있습니다. Cilium IPAM은 클러스터 환경에 따라 다양한 모드를 지원하고, 각 모드는 IP 주소의 할당 주체와 동작 방식이 다릅니다.

 

Cilium IPAM Mode

Cilium IPAM은 Container에 할당되는 IP 주소를 관리하는 기능이며, 여러 모드를 통해 다양한 클러스터에 구성할 수 있습니다.

 

참고

Feature Kubernetes Host Scope Cluster Scope (default) Multi-Pool (Beta) CRD-backed AWS ENI
Tunnel routing
Direct routing
CIDR Configuration Kubernetes Cilium Cilium External External (AWS)
Multiple CIDRs per cluster N/A N/A
Multiple CIDRs per node N/A N/A
Dynamic CIDR/IP allocation

 

이 중 kuberenetes host scope, Cluster Scope, Multi-Pool에 대해서만 살펴보도록 하겠습니다.

 

Kubernetes Host Scope

 

 

kubernetes가 각 node에 Pod CIDR을 할당하고, Cilium Agent가 해당 범위 내에서 Pod에 IP를 할당하는 Cilium IPAM Mode입니다. 이때, Kubernetes node의 spec.podCIDRs나 annotation을 통해 CIDR 정보를 수집 합니다.

 

Cluster Scope

 

Cluster Scope는 Cilium IPAM Mode에서 기본 값으로, Cilium Operator가 CiliumNode CRD를 통해 각 Node에 IP 풀을 분배하여 각 Node는 자신에게 할당된 CIDR 내에서만 IP를 할당합니다.

그로인해 Kubernetes의 spec.podCIDR를 사용하지 않아도 되며, 중앙 집중형 IP 관리가 가능합니다.

 

 

Multi-Pool 

 

Multi‑Pool IPAM 모드는 다양한 Pod/Namespace별 설정에 따라 유연하게 여러 IP Pool에서 IP를 할당할 수 있습니다. 

 

 ipam.cilium.io/ip-pool=  annotation이 Pod에 있으면 해당 Pool에서 IP 할당하며, Pod에 annotation이 없고, 네임스페이스에 해당 annotation이 있을 경우 네임스페이스의 Pool에서 할당합니다. 하지만 둘 다 없으면 default Pool에서 할당합니다.

 

하지만 아직 Beta단계로 터널 모드와 IPsec을 지원하지 않고, IP가 중복이 되지 않습니다.

 

실습

Kuberentes Host Scope에서 Cluster Scope로 Cilium IPAM Mode를 변경하는 실습을 진행해보겠습니다. 

 

실습 환경 구성

실습 환경 소개

vagrant를 통해 k8s-ctr, k8s-w1, router로 총 3개의 실습 환경을 구성합니다.

 

이때, router는 loop1/loop2 dump 인터페이스 배치되고, 사내망 10.10.0.0/16대역과 통신하며, kubernetes cluster에 join 되지 않은 서버입니다.

 

구성 확인

kubectl cluster-info dump | grep -m 2 -E "cluster-cidr|service-cluster-ip-range"

 

cluster의 service ip를 확인해보겠습니다.

 

 

service의 ip가 10.96.0.0/16이고, pod의 cidr은 10.244.0.0/16인 것을 확인할 수 있습니다.

 

kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.podCIDR}{"\n"}{end}'

 

pod의 ip 대역을 확인해보겠습니다.

 

 

k8s-ctr은 10.244.0.0/24, k8s-w1은 10.244.1.0/24인 것을 알 수 있습니다.

 

kubectl get ciliumnode -o json | grep podCIDRs -A2

 

위 값들을 cilium node에서 확인해보겠습니다.

 

 

마찬가지로 10.244.0.0/24, 10.244.1.0/24 인 것을 알 수 있습니다.

 

IPAM Mode 변경 실습

현재 IPAM Mode 확인

cilium config view | grep ^ipam

 

 

cilium config에서 ipam mode를 확인해보겠습니다.

 

 

 

 

ipam: kubernetes 설정은 Cilium이 Kubernetes 노드의 PodCIDR 정보를 사용해 IP를 할당하는 모드라는 것을 의미합니다. 위에서 살펴본 바와 같이 Cilium IPAM의 Kubernetes mode는 Kubernetes가 각 노드에 Pod CIDR을 할당하고, Cilium은 해당 CIDR 범위 내에서 각 Pod에 IP를 할당합니다.

 

 

IPAM Mode 변경

helm upgrade cilium cilium/cilium --namespace kube-system --reuse-values \
--set ipam.mode="cluster-pool" --set ipam.operator.clusterPoolIPv4PodCIDRList={"172.20.0.0/16"} --set ipv4NativeRoutingCIDR=172.20.0.0/16

 

Cilium IPAM Mode를 Cluster Scope로 변경하면서 CIDR 설정을 172.20.0.0/16 대역으로 변경해보도록 하겠습니다.

 

 

 

Cilium Agent 및 Operator 재시작

kubectl -n kube-system rollout restart deploy/cilium-operator # 오퍼레이터 재시작 필요
kubectl -n kube-system rollout restart ds/cilium

 

변경된 IPAM Mode를 적용하기 위해서 Cilium Agent와 Operator를 재시작합니다.

 

IPAM Mode 변경 확인

cilium config view | grep ^ipam

 

 

Cilium IPAM Mode가 cluster-pool로 변경된 것을 확인할 수 있습니다.

 

변경된 node 확인

kubectl get ciliumnode -o json | grep podCIDRs -A2

위 명령어를 통해 ciliumnode의 podCIDR을 확인해보겠습니다.

 

 

ciliumnode의 podCIDR 대역이 172.20.0.0/16으로 변경되어 있어야 하는데, 아직 그대로 인 것을 확인할 수 있습니다.

 

즉, 처음 cluster를 구성할 때 IPAM Mode가 kubernetes 였기 때문에 Kubernetes가 각 노드에 podCIDR을 이미 할당했고, Cilium은 해당 정보를 기반으로 CiliumNode 리소스를 생성하고 초기화했었습니다. 이후 cluster-pool로 변경해도 기존 CiliumNode 상태 및 IP 할당 정보는 자동으로 초기화되지 않기 때문에 이를 변경하기 위해선  CiliumNode 리소스의 초기화 및 Pod 재배포까지 필요한 대작업입니다.

 

즉, 처음 Cluster를 구성할 때 Cilium IPAM 모드가 kubernetes였기 때문에, Kubernetes가 각 노드에 podCIDR을 할당했고, Cilium은 이를 기반으로 CiliumNode 리소스를 생성하고 초기화했습니다. 이후 Cilium IPAM 모드를 cluster-pool로 변경해도 기존 CiliumNode의 상태와 IP 할당 정보는 자동으로 갱신되지 않기 때문에, 새로운 CIDR(cluster-pool 방식)을 반영하려면 CiliumNode 리소스를 수동으로 초기화하고, 필요한 경우 Pod 재배포를 포함한 재구성이 필요합니다.

 

 

Cilium Node 삭제 및 Agent 재시작

kubectl delete ciliumnode k8s-w1

 

먼저, k8s-w1의 cilium node를 삭제하겠습니다.

 

kubectl -n kube-system rollout restart ds/cilium

 

그 후 cilium agent를 재시작합니다.

 

 

podCIDR 확인

kubectl get ciliumnode -o json | grep podCIDRs -A2

 

k8s-w1의 Cilium Node를 삭제하고 cilium agent를 재시작하고 난 후 Cilium Node의 podCIDR을 확인해보겠습니다.

 

 

위와 같이 podCIDR의 대역폭이 변경된 것을 확인할 수 있습니다.

 

Pod에 할당된 IP 확인

kubectl get pod -A -owide | grep 10.244.

 

위 명령어를 통해 전체 Pod의 IP를 확인해보겠습니다.

 

 

변경된 Pod의 IP도 있지만 이전의 Pod IP를 그대로 갖고 있는 Pod들도 존재합니다. (직접 restart하는 것 밖에 해결책이 없습니다.)

 

정리

운영중인 환경에서 IPAM mode를 변경하는 것은 매우 리스크가 크기 때문에 Cluster 생성시 고려해야 합니다. 위 실습에서 살펴보았듯 처음에 구성했었던 IPAM Mode인 Kubernetes에서 cluster-pool로 변경해도 기존의 CiliumNode 리소스 및 IP 할당 정보는 자동으로 갱신되지 않기 때문에, 수동 초기화 및 Pod 재배포가 필요했습니다. 만약, 운영중인 환경이었다면 서비스에 큰 중단이 있을 작업이었습니다.

 

이에 Cilium 공식 문서에서도 다음과 같이 경고하고 있습니다.

Don’t change the IPAM mode of an existing cluster. Changing the IPAM mode in a live environment may cause persistent disruption of connectivity for existing workloads. The safest path to change IPAM mode is to install a fresh Kubernetes cluster with the new IPAM configuration

기존 클러스터의 IPAM 모드를 변경하지 마세요. 라이브 환경에서 IPAM 모드를 변경하면 기존 워크로드의 지속적인 연결 중단이 발생할 수 있습니다. IPAM 모드를 변경하는 가장 안전한 방법은 새로운 IPAM 구성으로 새로운 Kubernetes 클러스터를 설치하는 것입니다.

 

즉, IPAM 모드 변경이 필요한 경우에는 기존 클러스터가 아닌 새 클러스터에서 IPAM 설정을 처음부터 적용하는 것이 가장 안전한 방법입니다.

 

 

더보기

이 내용은 CloudNet@에서 진행하는 Cilium 스터디를 참여하면서 공부하는 내용을 기록하며, CloudNet@에서 제공해주는 자료들을 바탕으로 작성되었습니다.

728x90