这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Kubernetes NetworkPolicy 控制 Pod 之间以及 Pod 与外部的通信,是东西向流量零信任治理的基础。
24.1 默认行为
没有 NetworkPolicy 时,Pod 通常可以互相访问。可以先加默认拒绝:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: shop
spec:
podSelector: {}
policyTypes:
- Ingress
24.2 放行入口
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-web-to-order
namespace: shop
spec:
podSelector:
matchLabels:
app: order
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: shop
podSelector:
matchLabels:
app: web
ports:
- protocol: TCP
port: 8080
24.3 出口策略
policyTypes:
- Egress
egress:
- to:
- namespaceSelector: {}
ports:
- protocol: UDP
port: 53
出口策略会影响 DNS、镜像拉取、外部 API 和数据库连接,上线必须逐步验证。
24.4 依赖 CNI
NetworkPolicy 由 CNI 插件实现。Flannel 基础模式等实现不支持或不能完整支持 NetworkPolicy,Calico、Cilium 等更常用。
24.5 排查
kubectl get networkpolicy -A
kubectl describe networkpolicy allow-web-to-order -n shop
kubectl exec -it debug -- nc -vz order-service 8080
| 问题 | 排查 |
|---|---|
| 全部不通 | 默认拒绝 |
| DNS 不通 | egress 未放行 UDP/TCP 53 |
| 外部 API 不通 | 出口策略 |
| 跨命名空间不通 | namespaceSelector |
| 策略不生效 | CNI 支持 |
本章小结
NetworkPolicy 用于缩小攻击面。生产可以从关键命名空间默认拒绝开始,逐步放行白名单,并验证 CNI 支持、DNS、出口和审计。
思考题
- 没有 NetworkPolicy 时 Pod 能否互访?
- Ingress 和 Egress 策略分别管什么?
- 为什么 DNS 常被误伤?
- NetworkPolicy 是否由 kube-proxy 实现?
- 如何渐进式落地默认拒绝?