4. Cilium 网络策略基础:Identity 概念、Endpoint 选择器、L3/L4 网络策略、L7 HTTP 策略
Cilium 的网络策略模型基于 eBPF 实现,其核心设计理念是 Identity(身份) 而非传统的 IP 地址。在 Kubernetes 环境中,Pod 的 IP 是动态且频繁变化的,Cilium 通过为每个 Endpoint(Pod)分配一个安全身份标识,使得网络策略能够稳定地绑定到工作负载的标签上,从而实现更灵活、更细粒度的访问控制。
4.1 Identity 概念与 Endpoint 选择器
Cilium 的 Identity 是一个 64 位的数字标识符,由 Cilium Agent 根据 Pod 的标签组合(Label Selector)计算得出。具有相同标签集合的 Pod 会被分配相同的 Identity。当 Pod 的标签发生变化时,其 Identity 也会随之更新。
Endpoint 选择器 是 Cilium 网络策略中用于匹配目标工作负载的核心机制。它基于 Kubernetes 标签选择器(Label Selector)来定义策略的生效范围,而不是传统的 IP 或 CIDR。
| 概念 | 说明 | 示例 |
|---|---|---|
| Identity | 基于 Pod 标签组合生成的唯一安全标识,用于替代 IP 地址进行策略匹配。 | app=frontend,env=prod → Identity: 12345 |
| Endpoint Selector | 使用 matchLabels 或 matchExpressions 选择目标 Endpoint。 |
matchLabels: { app: backend } |
| Node Selector | 将策略作用范围限定在特定节点上的 Endpoint。 | matchLabels: { node-role: worker } |
4.2 L3/L4 网络策略
L3/L4 网络策略是 Cilium 中最基础的访问控制策略,工作在 OSI 模型的网络层和传输层。它允许你基于 源/目的 Identity、IP、端口 和 协议 来定义流量规则。
与 Kubernetes 原生 NetworkPolicy 相比,Cilium 的 L3/L4 策略提供了更强的表达能力,例如支持 端口范围、ICMP 协议以及 基于 Identity 的精细化控制。
策略结构示例
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
| 策略层级 | 匹配维度 | 典型场景 |
|---|---|---|
| L3 | 源/目的 Identity、CIDR、Node | 允许特定微服务访问,拒绝外部 IP 段 |
| L4 | 端口、协议(TCP/UDP/SCTP/ICMP) | 只允许 80/443 端口流量,禁止 SSH 访问 |
| L3+L4 | Identity + 端口 + 协议组合 | 仅允许 frontend 访问 backend 的 8080 端口 |
4.3 L7 HTTP 策略
Cilium 的 L7 HTTP 策略允许你在应用层(HTTP/HTTPS/gRPC)对流量进行深度检查和过滤。它基于 eBPF 在数据路径上直接解析应用层协议,无需引入额外的代理(如 Envoy),从而实现了高性能的七层策略执行。
L7 策略可以匹配 HTTP 的 方法(Method)、路径(Path)、主机(Host) 以及 头部(Headers),为微服务间的 API 调用提供精确的访问控制。
L7 HTTP 策略示例
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: l7-http-policy
spec:
endpointSelector:
matchLabels:
app: api-gateway
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "80"
protocol: TCP
rules:
http:
- method: "GET"
path: "/api/v1/users"
- method: "POST"
path: "/api/v1/orders"
headers:
- "X-Request-Source: web"
| 匹配字段 | 说明 | 示例值 |
|---|---|---|
| method | HTTP 请求方法 | GET, POST, PUT, DELETE |
| path | 请求路径,支持精确匹配和通配符 | /api/v1/*, /healthz |
| host | 请求的 Host 头部 | api.example.com |
| headers | 自定义 HTTP 头部匹配 | X-Version: v2 |
4.4 策略优先级与默认行为
Cilium 的网络策略遵循 白名单(Whitelist) 模型。默认情况下,所有流量都被拒绝,只有显式定义的规则才会允许流量通过。当存在多条策略时,Cilium 会按照以下优先级进行评估:
- L7 策略 优先级最高,如果 L7 规则匹配,则直接执行允许或拒绝。
- L3/L4 策略 次之,如果 L7 未匹配,则回退到 L3/L4 规则。
- 默认拒绝 作为兜底,如果没有任何策略匹配,流量将被丢弃。
4.5 策略调试与验证
在编写和部署 Cilium 网络策略后,可以使用以下命令进行调试和验证:
# 查看当前 Endpoint 及其 Identity
kubectl exec -n kube-system ds/cilium -- cilium endpoint list
# 查看特定 Pod 的策略执行状态
kubectl exec -n kube-system ds/cilium -- cilium endpoint get <pod-ip>
# 实时监控策略命中情况
kubectl exec -n kube-system ds/cilium -- cilium monitor -t policy-verdict
# 使用 Hubble 可视化流量与策略
hubble observe --from-pod default/frontend-xxx --to-pod default/backend-yyy