본문 바로가기
DevOps/cilium

[Cilium study] IPAM 모드

by 서어켜엉 2025. 7. 31.

IPAM 이란?

IP Address Management : 네트워크 엔드포인트에 대한 IP 할당 및 관리 

Feature Kuberntes
Host scope
Cluster Scope
(default)
Multi Pool CRD-backed AWS ENI...
Tunnel routing O O X X X
Direct routing O O O O O
CIDR
configuration
Kubernetes Cilium Cilium External External(AWS)
Muitlple CIDRs
per cluster
X O O N/A N/A
Multiple CIDRs
per node
X X O N/A N/A
Dynamic CIDR/IP
allocation
X X O O O

 

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

위 문구를 우선적으로 기억하고 아래 IPAM 모드를 알아보자. 이유는 실습을 통해서 알아볼 예정.

 

Kubernetes Host Scope mode

  • Kubernetes 호스트 범위 IPAM 모드는 ipam: Kubernetes 에서 활성화 도미ㅕ 클러스터의 각 개별 노드에 주소 할당을 위임한다.
  • IP는 Kubernetes에 의해 각 노드에 연결된 PodCIDR 범위에서 할당된다.
  • 이 모드에서는 Cilium 에이전트가 Kubernetes v1.Node 객체를 통해 PodCIDR 범위가 다음 방법 중 하나를 통해 활성화된 모든 주소 패밀리에 대해 제공될 때까지 시작 시 대기한다.
# 클러스터 정보 확인
kubectl cluster-info dump | grep -m 2 -E "cluster-cidr|service-cluster-ip-range"
#                            "--service-cluster-ip-range=10.96.0.0/16",
#                            "--cluster-cidr=10.244.0.0/16",

# ipam 모드 확인
cilium config view | grep ^ipam
# ipam                                              kubernetes

# 각 노드 별 Pod 에 할당되는 IPAM (PodCIDR) 정보 확인.
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.podCIDR}{"\n"}{end}'
k8s-ctr 10.244.0.0/24
k8s-w1  10.244.1.0/24

# --allocate-node-cidrs=true 설정 확인
# kube-controller-manager에서 CIDR을 자동 할당
kc describe pod -n kube-system kube-controller-manager-k8s-ctr
...
    Command:
      kube-controller-manager
      --allocate-node-cidrs=true
      --cluster-cidr=10.244.0.0/16
      --service-cluster-ip-range=10.96.0.0/16
...

kubectl get ciliumnode -o json | grep podCIDRs -A2

# 파드 정보 : 상태, 파드 IP 확인
kubectl get ciliumendpoints.cilium.io -A

 

k8s-ctr node의 ipam podCIDR 범위는 10.244.0.0/24

k8s-w1 node의 ipam podCIDR 범위는 10.244.1.0/24

 

현재 kubectl get ciliumendpoints.cilium.io -A 에서 출력된 엔드포인트들은 전부 k8s-ctr node 에 있는 것을 확인.

Sample application 배포

위 내용 실습 및 Cluster Scope로 마이그레이션 실습

cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webpod
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webpod
  template:
    metadata:
      labels:
        app: webpod
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - sample-app
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: webpod
        image: traefik/whoami
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: webpod
  labels:
    app: webpod
spec:
  selector:
    app: webpod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP
EOF


# k8s-ctr 노드에 curl-pod 파드 배포
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: curl-pod
  labels:
    app: curl
spec:
  nodeName: k8s-ctr
  containers:
  - name: curl
    image: nicolaka/netshoot
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
EOF

 

배포 및 통신 확인

 

kubectl get ep webpod -owide 로 webpod 서비스의 Endpoint 를 출력하면

하나는 k8s-ctr node, 하나는 k8s-w1 node에 있는 것을 확인할 수 있다.

 

 

Cluster Scope 

  • 클러스터 범위 IPAM 모드는 각 노드에 노드별 PodCIDR을 할당하고 각 노드에 호스트 범위 할당기를 사용하여 IP를 할당한다.
  • 따라서 이 모드는 Kubernetes Host Scope 모드와 유사하다.
  • 차이점은 Kubernetes가 Kubernetes v1.Node 리소스를 통해 노드별 podCIDR을 할당하는 대신,
    Cilium 운영자가 v2.CiliumNode 리소스(CRD)를 통해 노드별 podCIDR을 관리한다는 점이다.
  • 이 모드의 장점은 Kubernetes가 노드별 podCIDR을 나눠주도록 구성되는 것에 의존하지 않는다는 점이다. - ???
  • 최소 마스크 길이는 /30이며 권장 최소 마스크 길이는 /29 이상이다. 2개 주소는 예약됨 (네트워크, 브로드캐스트 주소)
  • 10.0.0.0/8 이 default podCIDR 이다. clusterPoolIPv4PodCIDRList
# Cluster scope 로 설정 변경
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

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

# 변경 확인
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.podCIDR}{"\n"}{end}'
cilium config view | grep ^ipam

 

 

kubectl get ciliumnode -o json | grep podCIDRs -A2
kubectl get ciliumendpoints.cilium.io -A

 

ipam 모드는 변경이 됐지만 실제 pod들의 IP는 여전히 10.244. 대역을 사용중이다.

 

# Cilium CRD 삭제 및 재생성
kubectl delete ciliumnode k8s-w1
kubectl -n kube-system rollout restart ds/cilium
kubectl get ciliumnode -o json | grep podCIDRs -A2
kubectl get ciliumendpoints.cilium.io -A

kubectl delete ciliumnode k8s-ctr
kubectl -n kube-system rollout restart ds/cilium
kubectl get ciliumnode -o json | grep podCIDRs -A2
kubectl get ciliumendpoints.cilium.io -A

 

cilium CRD를 삭제하고 재생성을 했다. podCIDRs가 172.20.1.0/24 대역으로 변경됐다.

하지만 여전히 일부 pod들은 10.244. IP 대역을 사용 중이다. 일부 Pod는 제대로 running 상태를 유지하지 못하는 상황.

 

# 직접 Rollout restart
kubectl -n kube-system rollout restart deploy/hubble-relay deploy/hubble-ui
kubectl -n cilium-monitoring rollout restart deploy/prometheus deploy/grafana
kubectl rollout restart deploy/webpod
kubectl delete pod curl-pod

#
cilium hubble port-forward &

# k8s-ctr 노드에 curl-pod 재배포
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: curl-pod
  labels:
    app: curl
spec:
  nodeName: k8s-ctr
  containers:
  - name: curl
    image: nicolaka/netshoot
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
EOF

# pod IP 변경 확인
kubectl get ciliumendpoints.cilium.io -A

pod 들의 IP 가 172.20.x.x 대역으로 변경된 것을 확인했다.

 

실습 시작 전에 기존 kubernetes 클러스터의 IPAM 모드를 변경하지말고, 새로 생성하라는 문구를 보고 시작을 했다.

실제로 IPAM 모드를 변경해보니, IP가 자동으로 변경되지 않고, 직접 rollout restart 를 해줘야지만 적용이 되는 것을 확인했다.

이처럼 운영중인 Kubernetes 클러스터의 IPAM 모드를 변경하면 서비스 운영에 장애가 발생할 수 있기 때문에 신중하게 진행해야 한다.