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,以及入站规则如何筛选来源端点:
3.4 策略生效验证
部署策略后,必须验证其是否按预期工作。推荐使用以下步骤进行验证:
- 检查策略状态:
kubectl get cnp -n default确认策略已创建。 - 查看策略详情:
kubectl describe cnp allow-frontend -n default检查Status字段是否为Success。 - 连通性测试:使用
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 生效的简化流程:
验证技巧:使用
cilium endpoint list 查看每个端点的 Identity 和 Policy Enforcement 状态。如果 Enforcement 为 disabled,说明策略未正确应用到该端点。