4. Cilium 高级策略:L7 HTTP/gRPC 策略、DNS策略、基于身份的安全策略
在云原生灾备与蓝绿发布场景中,基础网络策略(L3/L4)仅能控制“能否连通”,无法感知应用层流量内容。Cilium 基于 eBPF 的高级策略引擎允许在 L7 层对 HTTP/gRPC 请求进行细粒度控制,同时通过 DNS 策略管理外部访问,并利用基于身份的安全模型简化大规模集群的权限管理。本章将深入解析这三种高级策略的核心机制与配置方法。
4.1 L7 HTTP/gRPC 策略:应用层流量管控
L7 策略使 Cilium 能够检查 HTTP 方法、路径、头部以及 gRPC 服务方法,实现“零信任”应用层访问控制。在灾备切换或蓝绿发布期间,可通过 L7 策略精确引导流量,例如仅允许特定版本的客户端访问新版服务。
4.1.1 HTTP 策略规则
HTTP 策略通过 http 字段定义,支持 method、path、host 和 headers 匹配。以下示例仅允许 GET 请求访问 /api/v1/ 路径,并校验请求头中的 X-Version 字段。
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "l7-http-restrict"
spec:
endpointSelector:
matchLabels:
app: frontend
ingress:
- fromEndpoints:
- matchLabels:
app: gateway
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
- method: "GET"
path: "/api/v1/.*"
headers:
- "X-Version: v2"
- method:匹配 HTTP 方法(GET/POST/PUT/DELETE 等),支持通配符
*。 - path:使用正则表达式匹配 URL 路径,如
/api/v1/.*。 - headers:匹配请求头键值对,支持精确匹配或前缀匹配。
- host:可选,匹配 HTTP Host 头部,用于多域名场景。
4.1.2 gRPC 策略规则
gRPC 策略通过 grpc 字段定义,匹配 service 和 method。以下策略仅允许调用 payment.PaymentService 的 ProcessPayment 方法。
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "l7-grpc-restrict"
spec:
endpointSelector:
matchLabels:
app: payment-service
ingress:
- fromEndpoints:
- matchLabels:
app: order-service
toPorts:
- ports:
- port: "50051"
protocol: TCP
rules:
grpc:
- service: "payment.PaymentService"
method: "ProcessPayment"
version: v2)创建独立的 L7 策略。当新版本验证通过后,通过更新策略中的 fromEndpoints 或 headers 条件,逐步将流量从旧版本迁移至新版本,实现零中断切换。
4.2 DNS 策略:安全控制外部访问
云原生应用常需访问外部服务(如数据库、API 网关)。Cilium 的 DNS 策略允许基于域名而非 IP 地址控制出站流量,解决了传统网络策略中外部 IP 动态变化的管理难题。在灾备场景中,DNS 策略可确保流量仅流向已验证的外部端点,防止 DNS 劫持或错误解析导致的数据泄露。
4.2.1 DNS 策略配置
DNS 策略通过 toFQDNs 字段定义,支持精确域名、通配符和正则表达式。以下策略仅允许 app 标签的 Pod 访问 api.example.com 和 *.trusted-domain.io。
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "dns-external-access"
spec:
endpointSelector:
matchLabels:
app: worker
egress:
- toFQDNs:
- matchName: "api.example.com"
- matchPattern: "*.trusted-domain.io"
toPorts:
- ports:
- port: "443"
protocol: TCP
4.2.2 DNS 策略与缓存机制
Cilium 内置 DNS 代理,自动拦截 Pod 的 DNS 查询并缓存解析结果。策略中的域名会在首次解析后生成对应的 IP 规则,并随 TTL 自动更新。下表总结了 DNS 策略的关键行为:
| 特性 | 说明 | 灾备场景价值 |
|---|---|---|
| 域名匹配 | 支持 matchName(精确)和 matchPattern(通配符) |
允许灾备站点使用相同域名,策略无需修改 |
| DNS 代理 | 拦截 Pod DNS 请求,缓存解析结果 | 减少外部 DNS 查询,提升灾备切换时的响应速度 |
| TTL 感知 | 根据 DNS TTL 自动更新 IP 规则 | 外部端点 IP 变更时自动适配,避免策略失效 |
| 通配符限制 | 仅支持前缀通配符(如 *.example.com) |
防止过度宽松的匹配,降低安全风险 |
4.3 基于身份的安全策略:简化大规模集群管理
传统 Kubernetes 网络策略依赖 IP 地址或标签选择器,在 Pod 频繁重建或跨集群迁移时,IP 变化会导致策略维护成本激增。Cilium 引入基于身份(Identity)的安全模型,为每个 Pod 分配唯一的安全身份标识,策略直接绑定身份而非 IP,大幅提升可管理性。
4.3.1 身份分配机制
Cilium 根据 Pod 的标签组合计算安全身份。当 Pod 标签发生变化时,身份自动更新,策略即时生效。身份在集群范围内唯一,支持跨节点、跨集群使用。
# 查看 Pod 的安全身份
kubectl exec -n kube-system cilium-xxxxx -- cilium identity list
# 输出示例:
# ID LABELS
# 1234 k8s:app=frontend; k8s:version=v2
# 5678 k8s:app=backend; k8s:version=v1
4.3.2 基于身份的策略示例
以下策略允许身份为 app=frontend 且 version=v2 的 Pod 访问 app=backend 的 Pod,无需关心 Pod 的 IP 地址。
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "identity-based-access"
spec:
endpointSelector:
matchLabels:
app: backend
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
version: v2
toPorts:
- ports:
- port: "80"
protocol: TCP
4.3.3 身份策略与灾备迁移
在跨集群灾备迁移场景中,基于身份的策略优势尤为突出。下图展示了身份策略如何简化迁移流程:
4.4 三种高级策略对比与选型
在实际灾备与蓝绿发布场景中,需要根据流量类型和安全需求选择合适的策略类型。下表总结了三种策略的核心差异:
| 策略类型 | 控制层级 | 匹配依据 | 典型场景 | 灾备优势 |
|---|---|---|---|---|
| L7 HTTP/gRPC | 应用层(L7) | HTTP 方法/路径/头部、gRPC 服务/方法 | API 网关、微服务间调用 | 按版本精确控制流量,支持蓝绿发布灰度 |
| DNS 策略 | 传输层(L3/L4) | 域名、通配符 | 外部服务访问、数据库连接 | 域名不变即可迁移,无需关心外部 IP 变化 |
| 基于身份策略 | 网络层(L3/L4) | 安全身份 ID(基于标签) | 大规模集群、跨集群迁移 | 身份跨集群一致,策略零修改迁移 |
4.5 策略组合与最佳实践
在复杂的灾备场景中,通常需要组合使用多种策略。以下是一个综合示例,展示如何为蓝绿发布环境配置完整的策略体系:
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "blue-green-combined"
spec:
endpointSelector:
matchLabels:
app: backend
ingress:
# 基于身份:仅允许 frontend 访问
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
# L7 策略:仅允许 GET /api/v2/,并校验版本头
- method: "GET"
path: "/api/v2/.*"
headers:
- "X-Version: blue"
egress:
# DNS 策略:仅允许访问灾备数据库域名
- toFQDNs:
- matchName: "db-dr.example.com"
toPorts:
- ports:
- port: "5432"
protocol: TCP
- 分层防御:先使用基于身份的策略控制 Pod 间连通性,再叠加 L7 策略细化应用层权限。
- 最小权限原则:DNS 策略中避免使用
*通配符,优先使用matchName精确匹配。 - 版本标签化:为每个服务版本打上
version标签,便于身份策略按版本隔离。 - 灾备预配置:在灾备集群中提前创建相同的身份策略,确保迁移后策略自动生效。
- 策略审计:定期使用
cilium policy trace命令验证策略路径,避免配置错误。