在 Kubernetes 中配置 NetworkPolicy 是实现 Pod 之间网络隔离和访问控制的关键手段。以下是详细的配置步骤和示例,帮助你快速上手。

一、配置前提条件

  1. 网络插件支持
    NetworkPolicy 必须依赖支持其功能的 CNI 插件,例如:

    • Calico(推荐,功能全面)
    • Cilium
    • Weave Net
    • Azure NPM(Azure 环境)
    • Flannel(不支持 NetworkPolicy,需搭配其他插件)
  2. 集群初始化
    初始化 Kubernetes 集群时,需指定 Pod 网络 CIDR,并确保 CNI 插件已正确安装。

二、配置步骤

1. 安装 Calico 网络插件(推荐)
# 安装 Calico(以 v3.25 版本为例)
kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml
2. 编写 NetworkPolicy YAML 文件

以下是一个简单的示例,允许 default 命名空间中标签为 app=web 的 Pod 被 app=client 的 Pod 访问 80 端口:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: web-access-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: web
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: client
      ports:
        - protocol: TCP
          port: 80
3. 应用 NetworkPolicy
kubectl apply -f web-access-policy.yaml
4. 验证 NetworkPolicy
# 查看已应用的 NetworkPolicy
kubectl get networkpolicy -n default

# 检查策略详细信息
kubectl describe networkpolicy web-access-policy -n default

三、典型配置示例

1. 允许同一命名空间内所有 Pod 通信
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-same-namespace
  namespace: default
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - podSelector: {}
  egress:
    - to:
        - podSelector: {}
2. 限制出站流量到特定 IP 段
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-egress
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
    - Egress
  egress:
    - to:
        - ipBlock:
            cidr: 10.0.0.0/24
      ports:
        - protocol: TCP
          port: 5432
3. 禁止其他命名空间访问当前命名空间的 Pod
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-external
  namespace: default
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector: {}

四、验证与测试

1. 创建测试 Pod
# 创建客户端 Pod
kubectl run client --image=busybox --labels=app=client -- sleep 3600

# 创建目标 Pod
kubectl run web --image=nginx --labels=app=web -- sleep 3600
2. 测试通信
# 进入客户端 Pod 并尝试访问目标 Pod
kubectl exec -it client -- sh
wget http://web.default.svc.cluster.local
3. 故障排查
  • 检查策略是否生效
    kubectl describe networkpolicy web-access-policy -n default
    
  • 检查 Calico 日志
    kubectl logs -n kube-system -l k8s-app=calico-node
    

五、注意事项

  1. 默认策略行为

    • 如果未定义 policyTypes,默认仅控制 Ingress 流量。
    • 若需控制 Egress 流量,必须显式声明 policyTypes: [Egress]
  2. 标签选择器的匹配规则

    • podSelectornamespaceSelector 支持标签匹配(如 matchLabelsmatchExpressions)。
    • 多个 from/to 条件通过逻辑 OR 组合,同一条规则内的条件通过逻辑 AND 组合。
  3. 多策略叠加
    同一命名空间下的多个 NetworkPolicy 会叠加生效,最终效果是所有策略的交集。

六、场景化配置建议

1. 多租户隔离
  • 需求:不同团队的 Pod 不能互相访问。
  • 配置
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: tenant-isolation
      namespace: team-a
    spec:
      podSelector: {}
      policyTypes:
        - Ingress
      ingress:
        - from:
            - namespaceSelector:
                matchLabels:
                  tenant: team-a
    
2. 保护敏感服务
  • 需求:数据库 Pod 仅允许特定前端服务访问。
  • 配置
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: db-protect
      namespace: default
    spec:
      podSelector:
        matchLabels:
          role: db
      policyTypes:
        - Ingress
      ingress:
        - from:
            - podSelector:
                matchLabels:
                  role: frontend
          ports:
            - protocol: TCP
              port: 6379
    

七、总结

  • NetworkPolicy 是 Kubernetes 的核心安全机制,通过标签选择器和规则定义,实现细粒度的网络访问控制。
  • 选择支持 NetworkPolicy 的 CNI 插件(如 Calico)是配置成功的关键。
  • 合理设计标签和策略规则,可以有效隔离服务、保护敏感数据,并提升集群安全性。

如果需要更复杂的场景(如动态策略更新、可视化监控),可结合 CiliumAzure NPM 等高级功能。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐