Cilium 网络策略
数据路径策略
Cilium 用 eBPF 替代 kube-proxy 后,NodePort/LoadBalancer 的南北向流量有三种转发策略 ,通过 loadBalancer.mode 控制
SNAT 模式(默认)
数据包到 LB 节点后做源地址转换,backend 回包先回到 LB 节点再做反向 SNAT 转发给客户端。
适用场景:底层网络不支持 DSR(如 AWS 默认开了源/目 IP 检查)、不想动 MTU、图省事
优点:通用性最强,不需要底层网络配合
缺点:backend 看不到真实客户端 IP;回程多一跳
典型用例:公有云环境、跨复杂网络、客户端 IP 保留不敏感的业务
DSR 模式(Direct Server Return)
LB 节点把包转发给 backend 时不改写源 IP,backend 收到后直接回客户端,回程不经过 LB 节点。
适用场景:
需要保留真实客户端 IP(如 DNS 日志、审计、基于 client IP 的限流/过滤)
追求最低延迟(回程少一跳)
裸金属 / 物理网络能关掉源 IP 校验
代价:
需要把 service IP/port 编码进包里(IPv4 Option / IPv6 DestOpt / Geneve option),MTU 要降
跨子网走 Geneve 隧道才能 DSR;同 L2 native-routing 才支持 OPT dispatch
AWS/Azure 等公有云默认源 IP 检查会丢包,需关掉
注意:
DSR 的 service annotation(service.cilium.io/forwarding-mode)只能在 Service 创建时打,中途改会断连接
Hybrid 模式(TCP DSR + UDP SNAT)
TCP 走 DSR,UDP 走 SNAT——推荐的折中方案
适用场景:TCP 是主传输(Web、API、DB),UDP 主要是 DNS 等辅助流量
优点:拿到了 TCP 的 DSR 延迟收益,又不用降 MTU(UDP 走 SNAT 不编 service info)
典型用例:绝大多数微服务集群的默认选择
# Hybrid 模式安装(kube-proxy-free 环境)
helm install cilium cilium/cilium --version 1.20.0 \
--namespace kube-system \
--set routingMode=native \
--set kubeProxyReplacement=true \
--set loadBalancer.mode=hybrid \
--set k8sServiceHost=${API_SERVER_IP} \
--set k8sServicePort=${API_SERVER_PORT}
模式选择速查
| 场景 | 模式 | 配套动作 |
| 通用、不动 MTU、不关心 client IP | SNAT | 默认,啥也不做 |
| 要 client IP + 最低延迟、裸金属 | DSR | 降 MTU 或走 Geneve;关掉底层源 IP 校验 |
| 生产默认、TCP 为主 | Hybrid | 推荐 |
安全策略
Cilium 把 Kubernetes NetworkPolicy 从 L3/L4 扩展到 L7 ,分三层
L3/L4 策略(基础隔离)
按身份(label)+ 端口/协议过滤
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "rule1"
spec:
endpointSelector:
matchLabels:
org: empire
class: deathstar
ingress:
- fromEndpoints:
- matchLabels:
org: empire
toPorts:
- ports:
- port: "80"
protocol: TCP
适用场景 :
基础零信任:阻止未授权 Pod 访问
命名空间隔离、默认拒绝
多租户集群的租户间隔离
性能敏感:eBPF 直接丢包,开销极小
L7 策略(应用层精细控制)
按HTTP method/path、gRPC、Kafka topic、DNS FQDN 过滤 :
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "l7-policy"
spec:
endpointSelector:
matchLabels:
org: empire
class: deathstar
ingress:
- fromEndpoints:
- matchLabels:
org: empire
toPorts:
- ports:
- port: "80"
protocol: TCP
rules:
http:
- method: "POST"
path: "/v1/request-landing"
适用场景 :
微服务 API 安全:"只允许 checkout 服务 POST /api/v1/charge 到 payment 服务"
零信任精确授权:即使 Pod 被攻破,攻击者只能调用明确定义过的 API
敏感操作保护:限制 DELETE /admin/*、Kafka 特定 topic 的生产消费
出站管控:按 FQDN 而非 IP 限制 egress(IP 会变,域名稳定)
代价:L7 走 Envoy proxy 拦截,性能开销高于 L3/L4,但换来的是协议级语义 。
综合场景推荐
|
集群类型
|
kubeProxyReplacement
|
转发模式
|
安全策略
|
|---|---|---|---|
|
裸金属大集群(百/千节点)
|
true
|
hybrid 或 dsr
|
L3/L4 基线 + 敏感服务 L7
|
|
公有云生产集群
|
true
|
snat(云网络不支持 DSR)
|
L3/L4 + 关键服务 L7
|
|
中小集群(< 50 节点)
|
视 Service 数量定,多则开
|
hybrid
|
L3/L4 默认拒绝
|
|
开发/测试集群
|
可不开
|
snat
|
按需,不强制
|
|
多租户平台
|
true
|
hybrid
|
L3/L4 租户隔离 + L7 敏感 API
|
|
边缘/IoT 资源受限
|
不建议开
|
—
|
Flannel 等更轻量
|

浙公网安备 33010602011771号