跳到主要内容

Kubernetes 网络策略实战:微服务安全隔离与流量控制

为什么需要网络策略

默认情况下,Kubernetes 集群中所有 Pod 彼此可达,这在多租户或零信任要求下极易造成横向移动。NetworkPolicy 允许我们在 L3/L4 维度定义谁可以与谁通信,从而实现微服务隔离、数据库防护和出口控制。本指南涵盖:

  • NetworkPolicy 语法与常见字段
  • 默认拒绝策略、白名单策略的写法
  • Calico/Cilium 等 CNI 的高级特性
  • 东西向(Pod↔Pod)与南北向(Pod↔外部)的典型场景
  • 调试工具与常见踩坑

基础概念速览

元素说明
podSelector选择被保护的 Pod(“目标”)
policyTypesIngress/Egress,定义入口或出口流量
ingress / egress规则数组,描述允许的来源/目的地及端口
namespaceSelector依据命名空间标签来匹配流量
ipBlock允许/拒绝某个 CIDR 段(通常用于南北向)

启用 prerequisites:只有支持 NetworkPolicy 的 CNI(Calico、Cilium、Weave、Kube-router 等)才能生效;Flannel 默认不支持,需要额外插件。

典型策略模板

1. 默认拒绝(Zero Trust 起点)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: prod
spec:
podSelector: {}
policyTypes:
- Ingress

这条策略会阻止 namespace prod 中所有 Pod 接收任何入站流量,需要再叠加白名单策略。

2. 仅允许后端访问数据库

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-allow-backend
namespace: prod
spec:
podSelector:
matchLabels:
app: mysql
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
tier: backend
ports:
- protocol: TCP
port: 3306

3. 限制 Pod 访问外网

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: egress-only-internal
namespace: prod
spec:
podSelector:
matchLabels:
app: payment
policyTypes:
- Egress
egress:
- to:
- namespaceSelector:
matchLabels:
env: prod
ports:
- protocol: TCP
port: 443

若需完全禁止访问互联网,可不写 egress 规则并添加 policyTypes: [Egress],同时通过 ipBlock with except 列出允许的内网网段。

4. 跨命名空间访问控制

- from:
- namespaceSelector:
matchLabels:
team: web
podSelector:
matchLabels:
app: frontend

通过 namespaceSelector 与 podSelector 组合,可实现“team=web 的 frontend 允许访问 prod/db”。

Calico/Cilium 高级用法

功能CalicoCilium
L7 HTTP/GPRC 规则✅(Calico Enterprise)✅(通过 Envoy/L7Policy)
全局网络策略✅ (GlobalNetworkPolicy)
DNS 策略
eBPF 加速选配内置

示例:Calico GlobalNetworkPolicy 实现跨 namespace 默认拒绝:

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: default-deny
spec:
selector: all()
types:
- Ingress
- Egress

Cilium 还可结合 CiliumNetworkPolicy 做 L7 策略:

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: reviews-allow-bookinfo
spec:
endpointSelector:
matchLabels:
app: reviews
ingress:
- fromEndpoints:
- matchLabels:
app: productpage
toPorts:
- ports:
- port: "9080"
protocol: TCP
rules:
http:
- method: GET
path: /reviews

测试与故障排查

  1. kubectl exec + curl
    kubectl exec deploy/backend -- curl -s http://mysql.prod.svc.cluster.local:3306
  2. kubectl describe netpol:查看策略是否被正确解析。
  3. CNI 日志:在 Calico 中查看 calico-node 日志,Cilium 则查看 cilium-agent
  4. 抓包:使用 kubectl sniff/tcpdump 检查是否有 DROP。
  5. 常见问题
    • 忘记创建默认拒绝策略,导致 NetworkPolicy 不生效(因为未匹配任何 Pod)。
    • 只配置了 ingress 未配置 egress,Pod 依然可以主动访问其他服务。
    • ServiceAccount/Namespace 标签变化未及时同步,需关注 GitOps 流程。

总结

NetworkPolicy 是 Kubernetes 零信任网络的基础。通过“默认拒绝 + 精准放行”的组合、配合 Calico/Cilium 等 CNI 的增强特性,可以有效阻断横向渗透、保护核心数据资产。下一篇将聚焦 Secret/External Secrets Operator,构建端到端的敏感信息管理体系。