Skip to content

IPAM 与网络策略 ​

支持的版本: Cilium 1.18 最后更新: February 23, 2026

实验环境设置 ​

要跟随本文档中的示例操作,您需要以下工具和环境:

必需工具 ​

  • kubectl v1.31 或更高版本
  • 一个可用的 Kubernetes 集群(EKS、minikube、kind 等)
  • Cilium CLI

IPAM 和 Network Policy 实验设置 ​

bash
# 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.yaml

IP 地址管理(IPAM)策略 ​

关键概念:IPAM(IP Address Management)是负责分配、跟踪和管理 IP 地址的系统。

IPAM 是负责分配、跟踪和管理 IP 地址的系统。Cilium 支持多种 IPAM 模式,可灵活配置以匹配不同的环境和需求。

Cilium IPAM 架构 ​

Cilium IPAM 模式: ​

  1. Cluster Pool:

    • 默认 IPAM 模式
    • 在整个集群中集中分配 IP 地址
    • 可配置单个或多个 IP Pool
    • 简单易用
  2. Kubernetes Host Scope:

    • 为每个节点分配 IP 地址范围
    • 节点从自身范围中分配 IP 地址
    • 无需集中协调
    • 防止节点之间发生 IP 冲突
  3. 基于 CRD 的 IPAM:

    • 通过 CiliumIPPool 自定义资源定义 IP Pool
    • 将 IP Pool 分配给特定 namespace 或 Pod
    • 细粒度的 IP 地址管理
    • 动态 IP Pool 管理
  4. AWS ENI(Elastic Network Interface):

    • AWS VPC ENI 集成
    • 为 Pod 分配原生 VPC IP 地址
    • 无 Overlay Network 的 VPC 原生网络
    • 针对 AWS 环境优化
  5. 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 配置:

yaml
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 配置:

yaml
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 集成流程: ​

  1. Pod 创建:Kubernetes 请求创建 Pod
  2. CNI 调用:kubelet 调用 Cilium CNI 插件
  3. IP Allocation 请求:Cilium 向 IPAM 模块请求 IP 地址
  4. IP Allocation:IPAM 分配可用的 IP 地址
  5. 网络设置:Cilium 配置 Pod 的网络 namespace
  6. 状态存储:存储 IP 分配信息
  7. Pod 启动:Pod 使用已配置的网络启动

Cilium Cluster Pool 配置: ​

yaml
# 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 示例: ​

yaml
# 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: production

AWS ENI IPAM 配置: ​

yaml
# 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
  • 简单易用

工作原理:

  1. Cilium agent 从集群范围的 IP Pool 中分配 IP 地址。
  2. 已分配的 IP 地址存储在 Kubernetes CRD 中。
  3. IP 地址分配信息在集群中的所有节点之间共享。

2. Kubernetes Host Scope ​

Kubernetes Host Scope IPAM 为每个节点分配 IP 地址范围,节点从自身范围中分配 IP 地址。

主要特性:

  • 按节点分配 IP 地址范围
  • 无需集中协调
  • 防止节点之间发生 IP 冲突
  • 可扩展性更强

工作原理:

  1. Kubernetes 为每个节点分配一个 PodCIDR。
  2. Cilium 从节点的 PodCIDR 中分配 IP 地址。
  3. 每个节点独立管理自己的 IP 地址范围。

3. Multi-Pool - Beta ​

Multi-Pool IPAM 支持定义多个 IP Pool,并将特定 Pool 分配给特定工作负载。

主要特性:

  • 定义和管理多个 IP Pool
  • 按 namespace、Pod 或节点分配 IP Pool
  • 细粒度的 IP 地址管理
  • 支持多种网络需求

工作原理:

  1. 使用 CiliumIPPool CRD 定义多个 IP Pool。
  2. 使用 Selector 将特定 Pool 分配给特定工作负载。
  3. 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 原生工作流集成

工作原理:

  1. IP 地址 Pool 信息存储在 CiliumNode CRD 中。
  2. Cilium agent 从 CRD 读取 IP 地址分配信息。
  3. 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 结构(关键字段) ​

yaml
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 node
  • spec.addresses[].ip:节点的实际 IP 地址。配置静态路由时用作下一跳。
  • spec.ipam.podCIDRs:Cilium Operator 为该节点分配的 Pod CIDR 列表。

查询命令 ​

bash
# 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

脚本使用 ​

bash
# 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 示例: ​

yaml
# 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: TCP

L7 HTTP Policy 示例: ​

yaml
# 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 示例: ​

yaml
# 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 示例: ​

yaml
# 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

Network Policy 最佳实践: ​

  1. 应用 Default Deny Policy:

    • 阻止所有未被明确允许的流量
    • 应用最小权限原则
  2. 渐进式方法:

    • 从观察模式开始以评估影响
    • 逐步应用并强化 Policy
  3. 使用基于 Label 的 Selector:

    • 使用基于 Label 的 Selector,而不是 IP 地址
    • 在动态环境中提供灵活性
  4. Policy 分层:

    • 组合基础 Policy 和特定 Policy
    • 实现关注点分离和可维护性
  5. Policy 测试和验证:

    • 在应用 Policy 前进行测试
    • 持续进行 Policy 验证和监控

多集群场景 ​

Cilium 为多个 Kubernetes 集群之间的网络和安全提供了强大功能。这支持跨集群 Service 通信、Network Policy 强制执行和负载均衡。

多集群连接模型: ​

  1. Global Services:

    • 在多个集群中公开 Service
    • 跨集群负载均衡
    • 自动故障转移和高可用性
  2. Cluster Mesh:

    • 集群之间直接连接
    • 跨集群 Network Policy
    • 统一可观测性
  3. 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 设置: ​

bash
# 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-a

Global Service 定义: ​

yaml
# 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: ​

yaml
# 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

返回主页

测验 ​

为测试您在本章所学的内容,请尝试 主题测验。

向文档提问

按 Enter 发送,按 Shift+Enter 换行。