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)
4.5 策略生效验证步骤
应用策略后,按以下步骤验证:
- 应用策略:
kubectl apply -f allow-monitoring-to-backend.yaml - 检查策略状态:
kubectl get ciliumnetworkpolicies,确认STATUS为Success。 - 查看端点身份:
kubectl exec -n kube-system <cilium-agent-pod> -- cilium endpoint list,确认backend和monitoring Pod的身份ID。 - 策略追踪:
kubectl exec -n kube-system <cilium-agent-pod> -- cilium policy trace -s app=monitoring -d app=backend -dport 9000,预期输出Final verdict: ALLOWED。 - 实际连通性测试:从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 实时观察策略判决日志。