极客前沿

Kubernetes 网络策略入门:一步步实现零信任出站控制

2026-06-24 01:37
DEV Tutorial
查看原文

从零开始,教你安装和配置 Kubernetes NetworkPolicy,实现默认拒绝所有出站流量,并逐步开放必要连接。

本文适合刚接触 Kubernetes 的读者。你将学会如何用 NetworkPolicy 控制 Pod 的出站流量,实现零信任安全模型。我们会从环境准备开始,一步步验证效果。

准备环境

你需要一个支持 NetworkPolicy 的 Kubernetes 集群。默认的 kind 集群可能不生效,推荐使用 CalicoCilium(这些都是容器网络插件,负责执行网络策略)。

  • 如果你有现成集群,先确认 CNI 是否支持策略:运行 kubectl get pods -n kube-system,看看有没有 calico 或 cilium 相关的 Pod。
  • 如果没有,可以用 kind 创建测试集群并安装 Calico:kind create cluster --config - <(具体配置可参考 Calico 文档)。

安装并测试基础连接

先用一个调试 Pod 测试当前网络:

Tutorial Image
  1. 运行 kubectl run netshoot --image nicolaka/netshoot --rm -it -- /bin/bash,进入容器。
  2. 在容器内执行 curl http://example.com,应该能正常返回内容。这说明当前出站没有限制。

应用默认拒绝出站策略

NetworkPolicy 是 Kubernetes 用来控制 Pod 间网络访问的规则。下面我们创建一个策略,拒绝命名空间内所有 Pod 的出站流量。

  1. 创建文件 default-deny-egress.yaml
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: default-deny-egress
    spec:
      podSelector: {}
      policyTypes:
      - Egress
    
  2. 应用:kubectl apply -f default-deny-egress.yaml
  3. 再次进入 netshoot 容器,尝试 curl http://example.com,会发现连接超时。同时 DNS 解析也会失败。

允许 DNS 和必要出站

出站被拒绝后,DNS 也断了。我们需要允许 Pod 访问集群内的 DNS 服务(通常是 kube-dns)。

  1. 创建 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
    
  2. 应用后,再次测试 DNS 解析(如 nslookup example.com),应该恢复。

现在,你可以为特定工作负载添加更精细的出站规则,例如只允许某个 Pod 访问外部 API。记住,NetworkPolicy 规则是累加的,默认拒绝后,只有显式允许的流量才能通过。

内容来源

DEV Tutorial

发布时间

2026-06-24 01:37