IPAM 및 네트워크 정책
지원 버전: Cilium 1.18
마지막 업데이트: 2026년 2월 23일
실습 환경 설정
이 문서의 예제를 따라하기 위해서는 다음과 같은 도구와 환경이 필요합니다:
필수 도구
- kubectl v1.31 이상
- 작동하는 Kubernetes 클러스터 (EKS, minikube, kind 등)
- Cilium CLI
IPAM 및 네트워크 정책 실습 설정
# Cilium 상태 확인
cilium status --wait
# 현재 IPAM 구성 확인
kubectl -n kube-system get configmap cilium-config -o yaml | grep -E 'ipam|allocator'
# 네트워크 정책 테스트를 위한 네임스페이스 생성
kubectl create namespace policy-test
# 테스트 애플리케이션 배포
kubectl -n policy-test apply -f https://raw.githubusercontent.com/cilium/cilium/v1.14/examples/minikube/http-sw-app.yamlIP 주소 관리(IPAM) 전략
핵심 개념: IPAM(IP Address Management)은 IP 주소의 할당, 추적 및 관리를 담당하는 시스템입니다.
IPAM은 IP 주소의 할당, 추적 및 관리를 담당하는 시스템입니다. Cilium은 다양한 IPAM 모드를 지원하여 다양한 환경과 요구 사항에 맞게 유연하게 구성할 수 있습니다.
Cilium IPAM 아키텍처
Cilium IPAM 모드:
클러스터 풀(Cluster Pool):
- 기본 IPAM 모드
- 클러스터 전체에서 중앙 집중식으로 IP 주소 할당
- 단일 또는 여러 IP 풀 구성 가능
- 간단하고 사용하기 쉬움
쿠버네티스 호스트 범위(Kubernetes Host Scope):
- 각 노드에 IP 주소 범위 할당
- 노드는 자체 범위 내에서 IP 주소 할당
- 중앙 조정 필요 없음
- 노드 간 IP 충돌 방지
CRD 기반 IPAM:
- CiliumIPPool 커스텀 리소스를 통한 IP 풀 정의
- 특정 네임스페이스 또는 포드에 IP 풀 할당
- 세분화된 IP 주소 관리
- 동적 IP 풀 관리
AWS ENI(Elastic Network Interface):
- AWS VPC ENI 통합
- 포드에 네이티브 VPC IP 주소 할당
- 오버레이 네트워크 없이 VPC 네이티브 네트워킹
- AWS 환경에 최적화
Azure IPAM:
- Azure VNET 통합
- 포드에 네이티브 VNET IP 주소 할당
- Azure 환경에 최적화
IPAM 구성 요소:
- IP 풀: 할당 가능한 IP 주소 범위
- IP 할당: 엔드포인트에 IP 주소 할당
- IP 릴리스: 사용하지 않는 IP 주소 회수
- IP 충돌 감지: IP 주소 충돌 방지
- IP 예약: 특정 용도로 IP 주소 예약
IPAM 고려 사항:
- 주소 공간 크기: 필요한 IP 주소 수
- 네트워크 분할: 서브넷 및 CIDR 블록 설계
- 확장성: 향후 성장 고려
IPAM 구성 예제
클러스터 풀 IPAM 구성:
apiVersion: v1
kind: ConfigMap
metadata:
name: cilium-config
namespace: kube-system
data:
ipam: "cluster-pool"
cluster-pool-ipv4-cidr: "10.0.0.0/16"
cluster-pool-ipv4-mask-size: "24"
enable-ipv4: "true"
enable-ipv6: "false"AWS ENI IPAM 구성:
apiVersion: v1
kind: ConfigMap
metadata:
name: cilium-config
namespace: kube-system
data:
ipam: "eni"
enable-ipv4: "true"
enable-ipv6: "false"
eni-tags: "{\"cluster\": \"eks-cluster\"}"
ec2-api-endpoint: "ec2.us-west-2.amazonaws.com"- 클라우드 통합: 클라우드 제공업체 네트워킹과의 통합
- IPv4 vs IPv6: 단일 또는 이중 스택 구성
Kubernetes와 Cilium IPAM 통합
Cilium은 Kubernetes와 긴밀하게 통합되어 포드 및 서비스에 IP 주소를 할당하고 관리합니다.
Kubernetes IPAM 통합 흐름:
- 포드 생성: Kubernetes가 포드 생성 요청
- CNI 호출: kubelet이 Cilium CNI 플러그인 호출
- IP 할당 요청: Cilium이 IPAM 모듈에 IP 주소 요청
- IP 할당: IPAM이 사용 가능한 IP 주소 할당
- 네트워크 설정: Cilium이 포드의 네트워크 네임스페이스 구성
- 상태 저장: IP 할당 정보 저장
- 포드 시작: 네트워크가 구성된 포드 시작
Cilium 클러스터 풀 구성:
# cilium-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cilium-config
namespace: kube-system
data:
# 클러스터 풀 IPAM 모드
ipam: "cluster-pool"
# IPv4 CIDR 범위
cluster-pool-ipv4-cidr: "10.0.0.0/8"
cluster-pool-ipv4-mask-size: "24"
# IPv6 CIDR 범위 (선택 사항)
cluster-pool-ipv6-cidr: "fd00::/104"
cluster-pool-ipv6-mask-size: "120"
# 이중 스택 활성화
enable-ipv4: "true"
enable-ipv6: "true"CRD 기반 IPAM 예제:
# cilium-ippool.yaml
apiVersion: "cilium.io/v2alpha1"
kind: CiliumIPPool
metadata:
name: "production-pool"
spec:
ipv4:
cidr: "10.10.0.0/16"
blockSize: 27 # 32 IP 주소 블록
selector:
matchLabels:
environment: productionAWS ENI IPAM 구성:
# cilium-aws-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cilium-config
namespace: kube-system
data:
# AWS ENI IPAM 모드
ipam: "eni"
# AWS ENI 구성
enable-endpoint-routes: "true"
auto-create-cilium-node-resource: "true"
# ENI 태그 (선택 사항)
eni-tags: "{\"team\": \"platform\"}"
# 프리픽스 위임 (선택 사항)
enable-prefix-delegation: "true"
eni-prefix-delegation-enabled: "true"IPAM 모드 심층 분석
1. 클러스터 스코프(Cluster Scope) - 기본 모드
클러스터 스코프 IPAM은 Cilium의 기본 IPAM 모드로, 클러스터 전체에서 중앙 집중식으로 IP 주소를 할당합니다.
주요 특징:
- 중앙 집중식 IP 주소 할당
- 클러스터 전체에서 IP 주소 고유성 보장
- 단일 또는 여러 IP 풀 구성 가능
- 간단하고 사용하기 쉬움
작동 방식:
- Cilium 에이전트는 클러스터 전체 IP 풀에서 IP 주소를 할당합니다.
- 할당된 IP 주소는 Kubernetes CRD에 저장됩니다.
- IP 주소 할당 정보는 클러스터 내 모든 노드에서 공유됩니다.
2. Kubernetes 호스트 스코프(Kubernetes Host Scope)
Kubernetes 호스트 스코프 IPAM은 각 노드에 IP 주소 범위를 할당하고, 노드는 자체 범위 내에서 IP 주소를 할당합니다.
주요 특징:
- 노드별 IP 주소 범위 할당
- 중앙 조정 필요 없음
- 노드 간 IP 충돌 방지
- 향상된 확장성
작동 방식:
- Kubernetes는 각 노드에 PodCIDR을 할당합니다.
- Cilium은 노드의 PodCIDR에서 IP 주소를 할당합니다.
- 각 노드는 자체 IP 주소 범위를 독립적으로 관리합니다.
3. 멀티 풀(Multi-Pool) - 베타
멀티 풀 IPAM은 여러 IP 풀을 정의하고 특정 워크로드에 특정 풀을 할당할 수 있는 기능을 제공합니다.
주요 특징:
- 여러 IP 풀 정의 및 관리
- 네임스페이스, 포드 또는 노드별 IP 풀 할당
- 세분화된 IP 주소 관리
- 다양한 네트워크 요구 사항 지원
작동 방식:
- CiliumIPPool CRD를 사용하여 여러 IP 풀을 정의합니다.
- 선택기를 사용하여 특정 워크로드에 특정 풀을 할당합니다.
- Cilium은 정의된 규칙에 따라 적절한 풀에서 IP 주소를 할당합니다.
4. Azure IPAM
Azure IPAM은 Azure VNET과 통합하여 포드에 네이티브 VNET IP 주소를 할당합니다.
주요 특징:
- Azure VNET 네이티브 IP 주소 할당
- Azure 네트워크 보안 그룹 통합
- Azure 네트워킹 최적화
5. Azure 위임 IPAM(Azure Delegated IPAM)
Azure 위임 IPAM은 Azure CNI에 IP 주소 관리를 위임하는 모드입니다.
주요 특징:
- Azure CNI와의 통합
- Azure에서 관리하는 IP 주소 할당
- Azure 네트워킹 기능 활용
6. CRD 기반 IPAM
CRD 기반 IPAM은 Kubernetes CRD를 사용하여 IP 주소 할당을 관리합니다.
주요 특징:
- Kubernetes CRD를 통한 IP 주소 관리
- 선언적 IP 주소 할당
- Kubernetes 네이티브 워크플로우 통합
작동 방식:
- CiliumNode CRD에 IP 주소 풀 정보를 저장합니다.
- Cilium 에이전트는 CRD에서 IP 주소 할당 정보를 읽습니다.
- IP 주소 할당 상태는 CRD에 업데이트됩니다.
CiliumNode CR을 활용한 노드별 PodCIDR 조회
Cilium의 cluster-pool IPAM 모드에서는 각 노드에 할당된 파드 CIDR 정보가 CiliumNode CR에 기록됩니다. 이 CR은 정적 라우트 구성, IPAM 디버깅, 네트워크 트러블슈팅에서 권위 있는 소스로 활용됩니다.
참고: Kubernetes Node 객체의
spec.podCIDR은 CiliumNode CR의spec.ipam.podCIDRs와 다를 수 있습니다. Cilium 환경에서는 항상 CiliumNode CR을 기준으로 합니다.
CiliumNode CR 구조 (주요 필드)
apiVersion: cilium.io/v2
kind: CiliumNode
metadata:
name: hybrid-node-001
spec:
addresses:
- ip: 10.80.1.10 # 노드 IP (정적 라우트의 넥스트 홉으로 사용)
type: InternalIP
ipam:
podCIDRs:
- 10.85.0.0/25 # 이 노드에 할당된 파드 CIDRspec.addresses[].ip: 노드의 실제 IP 주소. 정적 라우트 구성 시 넥스트 홉으로 사용됩니다.spec.ipam.podCIDRs: Cilium Operator가 이 노드에 할당한 파드 CIDR 목록.
조회 명령어
# 모든 CiliumNode 목록 조회
kubectl get ciliumnodes
# 노드 IP와 PodCIDR을 테이블 형태로 조회
kubectl get ciliumnodes -o custom-columns='\
NAME:.metadata.name,\
NODE_IP:.spec.addresses[0].ip,\
POD_CIDR:.spec.ipam.podCIDRs[0]'출력 예시:
NAME NODE_IP POD_CIDR
hybrid-node-001 10.80.1.10 10.85.0.0/25
hybrid-node-002 10.80.1.11 10.85.0.128/25
hybrid-node-003 10.80.1.12 10.85.1.0/25스크립팅 활용
# jq를 사용하여 라우팅 테이블 생성에 필요한 정보 추출
kubectl get ciliumnodes -o json | jq -r \
'.items[] | "\(.metadata.name)\t\(.spec.addresses[0].ip)\t\(.spec.ipam.podCIDRs[0])"'
# 정적 라우트 명령 자동 생성 (EKS Hybrid Nodes 등에서 활용)
kubectl get ciliumnodes -o json | jq -r \
'.items[] | "ip route add \(.spec.ipam.podCIDRs[0]) via \(.spec.addresses[0].ip)"'활용 사례: EKS Hybrid Nodes 환경에서 BGP 없이 정적 라우트를 구성할 때 이 정보를 사용합니다. 자세한 내용은 EKS Hybrid Nodes - 네트워크 구성을 참조하세요.
네트워크 정책 설계 및 구현
Cilium 네트워크 정책은 L3-L7 계층에서 마이크로서비스 간 통신을 제어하는 강력한 메커니즘을 제공합니다. 이러한 정책은 Kubernetes NetworkPolicy API를 확장하여 더 세분화된 제어를 제공합니다.
네트워크 정책 기본 개념:
- 엔드포인트 선택기: 정책이 적용되는 엔드포인트 정의
- 인그레스 규칙: 들어오는 트래픽 제어
- 이그레스 규칙: 나가는 트래픽 제어
- L3/L4 정책: IP 주소 및 포트 기반 필터링
- L7 정책: 애플리케이션 계층 프로토콜 인식 필터링
L3/L4 네트워크 정책 예제:
# l3-l4-policy.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "l3-l4-policy"
spec:
endpointSelector:
matchLabels:
app: backend
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
egress:
- toEndpoints:
- matchLabels:
app: database
toPorts:
- ports:
- port: "3306"
protocol: TCPL7 HTTP 정책 예제:
# l7-http-policy.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "l7-http-policy"
spec:
endpointSelector:
matchLabels:
app: backend
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
- method: "GET"
path: "/api/v1/users"
- method: "POST"
path: "/api/v1/users"
headers:
- "Content-Type: application/json"L7 Kafka 정책 예제:
# l7-kafka-policy.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "l7-kafka-policy"
spec:
endpointSelector:
matchLabels:
app: kafka-broker
ingress:
- fromEndpoints:
- matchLabels:
app: kafka-client
toPorts:
- ports:
- port: "9092"
protocol: TCP
rules:
kafka:
- apiKey: "Produce"
topic: "allowed-topic-1"
- apiKey: "Fetch"
topic: "allowed-topic-1"
- apiKey: "CreateTopics"
topic: "allowed-topic-.*"
apiVersions: ["0", "1"]DNS 기반 정책 예제:
# dns-policy.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "dns-policy"
spec:
endpointSelector:
matchLabels:
app: client
egress:
- toEndpoints:
- matchLabels:
"k8s:io.kubernetes.pod.namespace": kube-system
"k8s:k8s-app": kube-dns
toPorts:
- ports:
- port: "53"
protocol: UDP
- port: "53"
protocol: TCP
- toFQDNs:
- matchName: "api.example.com"
- matchPattern: "*.googleapis.com"
toPorts:
- ports:
- port: "443"
protocol: TCP네트워크 정책 모범 사례:
기본 거부 정책 적용:
- 명시적으로 허용되지 않은 모든 트래픽 차단
- 최소 권한 원칙 적용
점진적 접근 방식:
- 관찰 모드로 시작하여 영향 평가
- 점진적으로 정책 적용 및 강화
레이블 기반 선택기 사용:
- IP 주소 대신 레이블 기반 선택기 사용
- 동적 환경에서 유연성 제공
정책 계층화:
- 기본 정책과 특정 정책 조합
- 관심사 분리 및 유지 관리 용이성
정책 테스트 및 검증:
- 정책 적용 전 테스트
- 지속적인 정책 검증 및 모니터링
멀티 클러스터 시나리오
Cilium은 여러 Kubernetes 클러스터 간의 네트워킹 및 보안을 위한 강력한 기능을 제공합니다. 이를 통해 클러스터 간 서비스 통신, 네트워크 정책 적용 및 로드 밸런싱이 가능합니다.
멀티 클러스터 연결 모델:
글로벌 서비스:
- 여러 클러스터에 걸쳐 서비스 노출
- 클러스터 간 로드 밸런싱
- 자동 장애 조치 및 고가용성
클러스터 메시:
- 클러스터 간 직접 연결
- 클러스터 간 네트워크 정책
- 통합 관찰 가능성
원격 노드:
- 원격 클러스터의 노드를 로컬로 표시
- 클러스터 간 투명한 통신
- 단일 네트워크 네임스페이스 시뮬레이션
Cilium Cluster Mesh 아키텍처:
+-------------------+ +-------------------+
| 클러스터 A | | 클러스터 B |
| | | |
| +---------------+ | | +---------------+ |
| | 서비스 A | | | | 서비스 B | |
| | (글로벌) | | | | (글로벌) | |
| +-------+-------+ | | +-------+-------+ |
| | | | | |
| +---v---+ | | +---v---+ |
| | eBPF | | | | eBPF | |
| +---+---+ | | +---+---+ |
| | | | | |
| +-------v-------+ | | +-------v-------+ |
| | Cilium | |<------>| | Cilium | |
| | Clustermesh | | | | Clustermesh | |
| +---------------+ | | +---------------+ |
| | | |
+-------------------+ +-------------------+Cilium Cluster Mesh 설정:
# 클러스터 A에서 Cluster Mesh 활성화
cilium clustermesh enable --context cluster-a
# 클러스터 B에서 Cluster Mesh 활성화
cilium clustermesh enable --context cluster-b
# 클러스터 연결
cilium clustermesh connect --context cluster-a --destination-context cluster-b
# 상태 확인
cilium clustermesh status --context cluster-a글로벌 서비스 정의:
# global-service.yaml
apiVersion: v1
kind: Service
metadata:
name: global-service
annotations:
io.cilium/global-service: "true"
spec:
selector:
app: global-app
ports:
- port: 80
targetPort: 8080
type: ClusterIP클러스터 간 네트워크 정책:
# cross-cluster-policy.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "cross-cluster-policy"
spec:
endpointSelector:
matchLabels:
app: backend
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
io.kubernetes.pod.namespace: frontend-ns
io.cilium.k8s.policy.cluster: cluster-a
toPorts:
- ports:
- port: "8080"
protocol: TCP퀴즈
이 장에서 배운 내용을 테스트하려면 주제 퀴즈를 풀어보세요.