Kubernetes 网络策略入门:一步步实现零信任出站控制
从零开始,教你安装和配置 Kubernetes NetworkPolicy,实现默认拒绝所有出站流量,并逐步开放必要连接。
本文适合刚接触 Kubernetes 的读者。你将学会如何用 NetworkPolicy 控制 Pod 的出站流量,实现零信任安全模型。我们会从环境准备开始,一步步验证效果。
准备环境
你需要一个支持 NetworkPolicy 的 Kubernetes 集群。默认的 kind 集群可能不生效,推荐使用 Calico 或 Cilium(这些都是容器网络插件,负责执行网络策略)。
- 如果你有现成集群,先确认 CNI 是否支持策略:运行
kubectl get pods -n kube-system,看看有没有 calico 或 cilium 相关的 Pod。 - 如果没有,可以用 kind 创建测试集群并安装 Calico:
kind create cluster --config - <(具体配置可参考 Calico 文档)。
安装并测试基础连接
先用一个调试 Pod 测试当前网络:
- 运行
kubectl run netshoot --image nicolaka/netshoot --rm -it -- /bin/bash,进入容器。 - 在容器内执行
curl http://example.com,应该能正常返回内容。这说明当前出站没有限制。
应用默认拒绝出站策略
NetworkPolicy 是 Kubernetes 用来控制 Pod 间网络访问的规则。下面我们创建一个策略,拒绝命名空间内所有 Pod 的出站流量。
- 创建文件
default-deny-egress.yaml:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-egress spec: podSelector: {} policyTypes: - Egress - 应用:
kubectl apply -f default-deny-egress.yaml - 再次进入 netshoot 容器,尝试
curl http://example.com,会发现连接超时。同时 DNS 解析也会失败。
允许 DNS 和必要出站
出站被拒绝后,DNS 也断了。我们需要允许 Pod 访问集群内的 DNS 服务(通常是 kube-dns)。
- 创建
allow-dns.yaml:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-dns spec: podSelector: {} policyTypes: - Egress egress: - to: - namespaceSelector: {} podSelector: matchLabels: k8s-app: kube-dns ports: - protocol: UDP port: 53 - protocol: TCP port: 53 - 应用后,再次测试 DNS 解析(如
nslookup example.com),应该恢复。
现在,你可以为特定工作负载添加更精细的出站规则,例如只允许某个 Pod 访问外部 API。记住,NetworkPolicy 规则是累加的,默认拒绝后,只有显式允许的流量才能通过。
内容来源
DEV Tutorial
发布时间
2026-06-24 01:37