IPAM 与网络策略
支持的版本: Cilium 1.18 最后更新: February 23, 2026
实验环境设置
要跟随本文档中的示例操作,您需要以下工具和环境:
必需工具
- kubectl v1.31 或更高版本
- 一个可用的 Kubernetes 集群(EKS、minikube、kind 等)
- Cilium CLI
IPAM 和 Network Policy 实验设置
# Check Cilium status
cilium status --wait
# Check current IPAM configuration
kubectl -n kube-system get configmap cilium-config -o yaml | grep -E 'ipam|allocator'
# Create namespace for network policy testing
kubectl create namespace policy-test
# Deploy test application
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 Pool
- 简单易用
Kubernetes Host Scope:
- 为每个节点分配 IP 地址范围
- 节点从自身范围中分配 IP 地址
- 无需集中协调
- 防止节点之间发生 IP 冲突
基于 CRD 的 IPAM:
- 通过 CiliumIPPool 自定义资源定义 IP Pool
- 将 IP Pool 分配给特定 namespace 或 Pod
- 细粒度的 IP 地址管理
- 动态 IP Pool 管理
AWS ENI(Elastic Network Interface):
- AWS VPC ENI 集成
- 为 Pod 分配原生 VPC IP 地址
- 无 Overlay Network 的 VPC 原生网络
- 针对 AWS 环境优化
Azure IPAM:
- Azure VNET 集成
- 为 Pod 分配原生 VNET IP 地址
- 针对 Azure 环境优化
IPAM 组件:
- IP Pool:可供分配的 IP 地址范围
- IP Allocation:将 IP 地址分配给 Endpoint
- IP Release:回收未使用的 IP 地址
- IP Conflict Detection:防止 IP 地址冲突
- IP Reservation:为特定用途预留 IP 地址
IPAM 注意事项:
- Address Space Size:所需 IP 地址数量
- Network Segmentation:子网和 CIDR 块设计
- Scalability:考虑未来增长
IPAM 配置示例
Cluster Pool 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"- Cloud Integration:与云提供商网络集成
- IPv4 vs IPv6:单栈或双栈配置
Kubernetes 和 Cilium IPAM 集成
Cilium 与 Kubernetes 紧密集成,以便为 Pod 和 Service 分配及管理 IP 地址。
Kubernetes IPAM 集成流程:
- Pod 创建:Kubernetes 请求创建 Pod
- CNI 调用:kubelet 调用 Cilium CNI 插件
- IP Allocation 请求:Cilium 向 IPAM 模块请求 IP 地址
- IP Allocation:IPAM 分配可用的 IP 地址
- 网络设置:Cilium 配置 Pod 的网络 namespace
- 状态存储:存储 IP 分配信息
- Pod 启动:Pod 使用已配置的网络启动
Cilium Cluster Pool 配置:
# cilium-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cilium-config
namespace: kube-system
data:
# Cluster pool IPAM mode
ipam: "cluster-pool"
# IPv4 CIDR range
cluster-pool-ipv4-cidr: "10.0.0.0/8"
cluster-pool-ipv4-mask-size: "24"
# IPv6 CIDR range (optional)
cluster-pool-ipv6-cidr: "fd00::/104"
cluster-pool-ipv6-mask-size: "120"
# Enable dual stack
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 address blocks
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 mode
ipam: "eni"
# AWS ENI configuration
enable-endpoint-routes: "true"
auto-create-cilium-node-resource: "true"
# ENI tags (optional)
eni-tags: "{\"team\": \"platform\"}"
# Prefix delegation (optional)
enable-prefix-delegation: "true"
eni-prefix-delegation-enabled: "true"IPAM 模式详解
1. Cluster Scope - 默认模式
Cluster Scope IPAM 是 Cilium 的默认 IPAM 模式,可在整个集群中集中分配 IP 地址。
主要特性:
- 集中式 IP 地址分配
- 保证整个集群中的 IP 地址唯一性
- 可配置单个或多个 IP Pool
- 简单易用
工作原理:
- Cilium agent 从集群范围的 IP Pool 中分配 IP 地址。
- 已分配的 IP 地址存储在 Kubernetes CRD 中。
- IP 地址分配信息在集群中的所有节点之间共享。
2. Kubernetes Host Scope
Kubernetes Host Scope IPAM 为每个节点分配 IP 地址范围,节点从自身范围中分配 IP 地址。
主要特性:
- 按节点分配 IP 地址范围
- 无需集中协调
- 防止节点之间发生 IP 冲突
- 可扩展性更强
工作原理:
- Kubernetes 为每个节点分配一个 PodCIDR。
- Cilium 从节点的 PodCIDR 中分配 IP 地址。
- 每个节点独立管理自己的 IP 地址范围。
3. Multi-Pool - Beta
Multi-Pool IPAM 支持定义多个 IP Pool,并将特定 Pool 分配给特定工作负载。
主要特性:
- 定义和管理多个 IP Pool
- 按 namespace、Pod 或节点分配 IP Pool
- 细粒度的 IP 地址管理
- 支持多种网络需求
工作原理:
- 使用 CiliumIPPool CRD 定义多个 IP Pool。
- 使用 Selector 将特定 Pool 分配给特定工作负载。
- Cilium 根据定义的规则从适当的 Pool 中分配 IP 地址。
4. Azure IPAM
Azure IPAM 与 Azure VNET 集成,为 Pod 分配原生 VNET IP 地址。
主要特性:
- Azure VNET 原生 IP 地址分配
- Azure Network Security Group 集成
- Azure 网络优化
5. Azure Delegated IPAM
Azure Delegated IPAM 是一种将 IP 地址管理委派给 Azure CNI 的模式。
主要特性:
- 与 Azure CNI 集成
- Azure 管理的 IP 地址分配
- 利用 Azure 网络功能
6. 基于 CRD 的 IPAM
基于 CRD 的 IPAM 使用 Kubernetes CRD 管理 IP 地址分配。
主要特性:
- 通过 Kubernetes CRD 管理 IP 地址
- 声明式 IP 地址分配
- 与 Kubernetes 原生工作流集成
工作原理:
- IP 地址 Pool 信息存储在 CiliumNode CRD 中。
- Cilium agent 从 CRD 读取 IP 地址分配信息。
- IP 地址分配状态在 CRD 中更新。
通过 CiliumNode CR 查询每个节点的 PodCIDR
在 Cilium 的 cluster-pool IPAM 模式中,每个节点的 Pod 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 # Node IP (used as next hop for static routes)
type: InternalIP
ipam:
podCIDRs:
- 10.85.0.0/25 # Pod CIDR allocated to this nodespec.addresses[].ip:节点的实际 IP 地址。配置静态路由时用作下一跳。spec.ipam.podCIDRs:Cilium Operator 为该节点分配的 Pod CIDR 列表。
查询命令
# List all CiliumNodes
kubectl get ciliumnodes
# Query node IP and PodCIDR in table format
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脚本使用
# Extract routing table information using jq
kubectl get ciliumnodes -o json | jq -r \
'.items[] | "\(.metadata.name)\t\(.spec.addresses[0].ip)\t\(.spec.ipam.podCIDRs[0])"'
# Auto-generate static route commands (useful for EKS Hybrid Nodes, etc.)
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 - 网络配置。
Network Policy 设计与实现
Cilium Network Policy 提供了强大的机制,可在 L3-L7 层控制微服务之间的通信。这些 Policy 扩展了 Kubernetes NetworkPolicy API,可提供更细粒度的控制。
Network Policy 基本概念:
- Endpoint Selector:定义 Policy 所适用的 Endpoint
- Ingress Rules:控制入站流量
- Egress Rules:控制出站流量
- L3/L4 Policy:基于 IP 地址和端口的过滤
- L7 Policy:感知应用层协议的过滤
L3/L4 Network Policy 示例:
# 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 Policy 示例:
# 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 Policy 示例:
# 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 的 Policy 示例:
# 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: TCPNetwork Policy 最佳实践:
应用 Default Deny Policy:
- 阻止所有未被明确允许的流量
- 应用最小权限原则
渐进式方法:
- 从观察模式开始以评估影响
- 逐步应用并强化 Policy
使用基于 Label 的 Selector:
- 使用基于 Label 的 Selector,而不是 IP 地址
- 在动态环境中提供灵活性
Policy 分层:
- 组合基础 Policy 和特定 Policy
- 实现关注点分离和可维护性
Policy 测试和验证:
- 在应用 Policy 前进行测试
- 持续进行 Policy 验证和监控
多集群场景
Cilium 为多个 Kubernetes 集群之间的网络和安全提供了强大功能。这支持跨集群 Service 通信、Network Policy 强制执行和负载均衡。
多集群连接模型:
Global Services:
- 在多个集群中公开 Service
- 跨集群负载均衡
- 自动故障转移和高可用性
Cluster Mesh:
- 集群之间直接连接
- 跨集群 Network Policy
- 统一可观测性
Remote Nodes:
- 将远程集群中的节点显示为本地节点
- 集群之间透明通信
- 单一网络 namespace 模拟
Cilium Cluster Mesh 架构:
+-------------------+ +-------------------+
| Cluster A | | Cluster B |
| | | |
| +---------------+ | | +---------------+ |
| | Service A | | | | Service B | |
| | (Global) | | | | (Global) | |
| +-------+-------+ | | +-------+-------+ |
| | | | | |
| +---v---+ | | +---v---+ |
| | eBPF | | | | eBPF | |
| +---+---+ | | +---+---+ |
| | | | | |
| +-------v-------+ | | +-------v-------+ |
| | Cilium | |<------>| | Cilium | |
| | Clustermesh | | | | Clustermesh | |
| +---------------+ | | +---------------+ |
| | | |
+-------------------+ +-------------------+Cilium Cluster Mesh 设置:
# Enable Cluster Mesh on Cluster A
cilium clustermesh enable --context cluster-a
# Enable Cluster Mesh on Cluster B
cilium clustermesh enable --context cluster-b
# Connect clusters
cilium clustermesh connect --context cluster-a --destination-context cluster-b
# Check status
cilium clustermesh status --context cluster-aGlobal Service 定义:
# 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跨集群 Network Policy:
# 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测验
为测试您在本章所学的内容,请尝试 主题测验。