在Kubernetes中,使用NetworkPolicy控制服务间通信的步骤如下:
-
确认CNI插件支持:
- 确保集群网络插件(如Calico、Cilium)支持NetworkPolicy,否则规则不生效。
-
定义Pod标签:
- 为需管控的服务Pod添加标签(如
app: backend
),便于策略匹配。
- 为需管控的服务Pod添加标签(如
-
编写NetworkPolicy YAML:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-frontend-to-backend spec: podSelector: matchLabels: app: backend # 目标后端Pod policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: frontend # 允许来自前端Pod的流量 ports: - protocol: TCP port: 8080 # 仅开放后端服务端口
-
应用策略:
kubectl apply -f policy.yaml -n <namespace>
-
验证策略生效:
- 前端Pod执行
curl backend-service:8080
应成功。 - 其他Pod访问后端服务应被拒绝(如
kubectl exec -it other-pod -- curl backend-service:8080
返回超时)。
- 前端Pod执行
-
常见问题排查:
- 检查Pod标签与策略中的
podSelector
是否匹配。 - 使用
kubectl describe networkpolicy <name>
确认策略范围及规则。 - 通过
kubectl get networkpolicy
确认策略已部署到正确命名空间。
- 检查Pod标签与策略中的
扩展场景:
- 默认拒绝所有流量:创建
Deny-All
策略后逐步放通白名单。 - 跨命名空间访问:在
from
字段中添加namespaceSelector
匹配目标命名空间标签。