3. Cilium基础策略:创建第一个CiliumNetworkPolicy、理解标签选择器与端点选择器、策略生效验证

3.1 策略对象与核心概念

CiliumNetworkPolicy(CNP)是 Kubernetes 集群中用于定义 L3/L7 网络准入规则的 CRD 资源。与原生 NetworkPolicy 相比,CNP 支持基于身份(Identity)的标签选择器,而非仅依赖 IP 地址或 CIDR。理解以下三个核心概念是编写策略的基础:

概念 说明 YAML 字段
端点选择器 通过 Pod 标签选择策略生效的目标 Pod(即被保护的端点) spec.endpointSelector.matchLabels
入站规则 定义允许哪些来源访问目标 Pod spec.ingress.fromEndpoints
出站规则 定义目标 Pod 允许访问哪些目的地 spec.egress.toEndpoints
关键区别:Kubernetes 原生 NetworkPolicy 使用 podSelector 和 namespaceSelector;Cilium 统一使用 endpointSelector,且支持更丰富的标签匹配表达式(matchLabels / matchExpressions)。

3.2 创建第一个 CiliumNetworkPolicy

以下示例创建一个名为 allow-frontend 的 CNP,保护带有 app=backend 标签的 Pod,仅允许带有 app=frontend 标签的 Pod 访问其 8080 端口。

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: allow-frontend
  namespace: default
spec:
  endpointSelector:
    matchLabels:
      app: backend
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: frontend
    toPorts:
    - ports:
      - port: "8080"
        protocol: TCP
部署命令:kubectl apply -f allow-frontend.yaml

3.3 标签选择器与端点选择器详解

端点选择器是 CNP 的入口点,决定了策略“保护谁”。标签选择器支持两种模式:

  • 精确匹配(matchLabels):所有指定标签必须完全匹配。
  • 表达式匹配(matchExpressions):支持 In、NotIn、Exists、DoesNotExist 操作符。

下面的 SVG 展示了标签选择器如何将策略绑定到目标 Pod,以及入站规则如何筛选来源端点:

CiliumNetworkPolicy 标签选择器与端点选择器工作流 CiliumNetworkPolicy allow-frontend endpointSelector 目标 Pod app=backend ingress fromEndpoints app=frontend 来源 Pod app=frontend toPorts: 8080/TCP 仅匹配标签的 Pod 被允许 不匹配则流量被拒绝

3.4 策略生效验证

部署策略后,必须验证其是否按预期工作。推荐使用以下步骤进行验证:

  1. 检查策略状态:kubectl get cnp -n default 确认策略已创建。
  2. 查看策略详情:kubectl describe cnp allow-frontend -n default 检查 Status 字段是否为 Success。
  3. 连通性测试:使用 kubectl exec 从不同标签的 Pod 发起 curl 请求。
常见故障:如果策略状态显示 Failure,通常是因为 endpointSelector 未匹配到任何 Pod,或标签拼写错误。使用 kubectl get pods --show-labels 确认目标 Pod 的标签。

以下表格总结了验证过程中常用的命令及其预期输出:

验证步骤 命令 预期结果
策略列表 kubectl get cnp 显示 allow-frontend,AGE 正常
策略状态 kubectl describe cnp allow-frontend Status: Success,Enforced: true
允许访问 kubectl exec frontend-pod -- curl -s backend-pod:8080 返回 HTTP 200 或应用正常响应
拒绝访问 kubectl exec unauthorized-pod -- curl -s backend-pod:8080 连接超时或拒绝(无响应)

3.5 策略生效的底层机制

Cilium 通过 eBPF 程序将策略编译为 BPF 映射,挂载到对应端点的网络栈中。下面的 SVG 展示了从 YAML 应用到 eBPF 生效的简化流程:

CiliumNetworkPolicy 生效流程 kubectl apply YAML → API Server Cilium Agent Watch CRD 变化 策略编译 标签 → Identity eBPF 加载 BPF Map 更新 关键点:策略在节点本地生效 每个节点上的 Cilium Agent 独立处理本节点 Pod 的策略 总耗时通常 < 1s,策略更新不影响已有连接 新连接立即受新策略约束
验证技巧:使用 cilium endpoint list 查看每个端点的 Identity 和 Policy Enforcement 状态。如果 Enforcement 为 disabled,说明策略未正确应用到该端点。