命名空间隔离
命名空间隔离
Section titled “命名空间隔离”本文通过一个最小示例演示如何使用 NetworkPolicy 为命名空间建立默认拒绝策略,并只放通指定来源。
- 集群网络插件支持 NetworkPolicy
- 已连接集群并具备创建 Namespace、Pod、NetworkPolicy 的权限
- 业务 Pod 使用稳定 label,例如
app、role、tier
创建测试命名空间
Section titled “创建测试命名空间”kubectl create namespace demo-akubectl create namespace demo-bkubectl label namespace demo-a access-zone=trustedkubectl label namespace demo-b access-zone=untrustedapiVersion: apps/v1kind: Deploymentmetadata: name: api namespace: demo-aspec: replicas: 1 selector: matchLabels: app: api template: metadata: labels: app: api spec: containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80---apiVersion: v1kind: Servicemetadata: name: api namespace: demo-aspec: selector: app: api ports: - port: 80 targetPort: 80kubectl apply -f api.yaml默认拒绝入站流量
Section titled “默认拒绝入站流量”apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: default-deny-ingress namespace: demo-aspec: podSelector: {} policyTypes: - Ingresskubectl apply -f default-deny-ingress.yaml这条策略选择 demo-a 下所有 Pod,并拒绝未显式允许的入站流量。
只允许 trusted 命名空间访问
Section titled “只允许 trusted 命名空间访问”apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: allow-trusted-namespace namespace: demo-aspec: podSelector: matchLabels: app: api policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: access-zone: trusted ports: - protocol: TCP port: 80kubectl apply -f allow-trusted-namespace.yamlkubectl run curl-a -n demo-a --rm -it --image=curlimages/curl:8.8.0 --restart=Never -- \ curl -m 3 http://api.demo-a.svc.cluster.local
kubectl run curl-b -n demo-b --rm -it --image=curlimages/curl:8.8.0 --restart=Never -- \ curl -m 3 http://api.demo-a.svc.cluster.localdemo-a 带有 access-zone=trusted,应可以访问;demo-b 不满足 namespaceSelector,应被拒绝或超时。
| 现象 | 可能原因 | 检查方式 |
|---|---|---|
| 策略创建后仍可访问 | CNI 不支持 NetworkPolicy 或策略未匹配 Pod | kubectl describe networkpolicy、检查 Pod label |
| DNS 解析失败 | 出站策略阻断 CoreDNS | 放通 kube-system/CoreDNS 的 UDP/TCP 53 |
| 预期来源被拒绝 | namespace label 或 pod label 不匹配 | kubectl get ns --show-labels |
kubectl delete namespace demo-a demo-b