4. 编写第一条CiliumNetworkPolicy:基于Pod标签的Ingress规则、端口与协议匹配、策略生效验证

4.1 策略模型与核心概念

CiliumNetworkPolicy(CNP)是Cilium提供的Kubernetes自定义资源(CRD),用于定义基于身份(Identity)的网络访问控制。与传统的Kubernetes NetworkPolicy相比,CNP支持L3/L4/L7层过滤,并且原生感知Pod标签、服务标识与CIDR。

本章聚焦于最基础的Ingress规则:允许特定来源(基于Pod标签)访问目标Pod的指定端口与协议。这是所有Cilium策略的起点,也是故障排查中最常验证的规则类型。

关键概念: Cilium使用Endpoint Identity而非IP地址作为策略决策依据。当Pod标签匹配时,Cilium自动分配安全身份,策略基于身份进行匹配,而非静态IP。这避免了IP漂移导致的策略失效。

4.2 实验环境与目标Pod

假设集群中已部署以下两个应用:

应用 命名空间 标签 监听端口 协议
frontend default app=frontend 8080 TCP
backend default app=backend 9000 TCP
monitoring default app=monitoring (客户端) —

目标:编写一条CiliumNetworkPolicy,仅允许 app=monitoring 的Pod访问 app=backend 的Pod的TCP 9000端口,拒绝其他所有流量。

4.3 编写第一条CiliumNetworkPolicy

以下YAML定义了一条完整的Ingress规则:

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: allow-monitoring-to-backend
  namespace: default
spec:
  endpointSelector:
    matchLabels:
      app: backend
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: monitoring
    toPorts:
    - ports:
      - port: "9000"
        protocol: TCP
字段解析:
  • endpointSelector:策略作用的目标Pod,此处为 app=backend。
  • fromEndpoints:允许的来源端点,基于标签 app=monitoring 匹配。
  • toPorts:允许的目标端口与协议,此处为TCP 9000。
  • 未显式定义的流量默认被拒绝(Cilium默认拒绝模式)。

4.4 策略生效流程(内联SVG)

CiliumNetworkPolicy Ingress 策略生效流程 CiliumNetworkPolicy Ingress 策略生效流程 1. 提交 CNP YAML 2. Cilium Agent 解析策略 3. 身份(Identity)映射 4. BPF 规则写入内核 关键点 • 策略基于身份而非IP • 标签变化触发身份重算 • BPF 规则实时生效 验证手段 • cilium endpoint list • cilium policy trace • 实际连通性测试

4.5 策略生效验证步骤

应用策略后,按以下步骤验证:

  1. 应用策略:kubectl apply -f allow-monitoring-to-backend.yaml
  2. 检查策略状态:kubectl get ciliumnetworkpolicies,确认 STATUS 为 Success。
  3. 查看端点身份:kubectl exec -n kube-system <cilium-agent-pod> -- cilium endpoint list,确认backend和monitoring Pod的身份ID。
  4. 策略追踪:kubectl exec -n kube-system <cilium-agent-pod> -- cilium policy trace -s app=monitoring -d app=backend -dport 9000,预期输出 Final verdict: ALLOWED。
  5. 实际连通性测试:从monitoring Pod访问backend的9000端口,预期成功;从frontend Pod访问同一端口,预期超时或被拒绝。
常见陷阱:
  • 命名空间隔离:如果来源和目标不在同一命名空间,需在 fromEndpoints 中额外指定 matchLabels 或使用 fromEndpoints 的 matchNamespaces 字段。
  • 端口格式:端口必须为字符串(加引号),协议必须大写(TCP/UDP/SCTP)。
  • 默认拒绝:Cilium在未定义策略时默认允许集群内通信;一旦应用任何策略,未显式允许的流量将被拒绝。

4.6 策略验证结果对比表

测试场景 来源Pod 目标Pod 目标端口 预期结果 验证命令
允许的访问 app=monitoring app=backend TCP 9000 允许 curl backend:9000
拒绝:来源不匹配 app=frontend app=backend TCP 9000 拒绝 curl backend:9000
拒绝:端口不匹配 app=monitoring app=backend TCP 8080 拒绝 curl backend:8080
拒绝:协议不匹配 app=monitoring app=backend UDP 9000 拒绝 nc -u backend 9000

4.7 故障排查常用命令速查

  • 查看策略列表:kubectl get cnp -A
  • 查看策略详情:kubectl describe cnp <policy-name> -n <namespace>
  • 查看端点身份:cilium endpoint list
  • 策略追踪(CLI):cilium policy trace -s <source-label> -d <dest-label> -dport <port>
  • 实时监控策略命中:cilium monitor -t policy-verdict
  • 查看BPF策略映射:cilium bpf policy list <endpoint-id>
最佳实践: 在编写任何生产策略前,先使用 cilium policy trace 进行离线验证,避免因策略错误导致现网服务中断。同时建议在测试环境使用 cilium monitor 实时观察策略判决日志。