温馨提示×

Kubernetes网络策略如何实现

小樊
52
2025-10-20 16:45:07
栏目: 编程语言

Kubernetes网络策略实现指南

一、前置准备

  1. 安装Kubernetes集群
    使用kubeadm初始化Master节点并加入Worker节点(参考kubeadm initkubeadm join命令),确保集群正常运行。
  2. 部署支持网络策略的CNI插件
    Kubernetes本身不直接实现网络策略,需依赖第三方插件。常用插件包括:
    • Calico(推荐,功能全面,支持复杂策略):通过kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml安装;
    • Cilium(基于eBPF,高性能);
    • Weave Net(简单易用,适合中小型集群)。
      插件需支持NetworkPolicy资源,否则策略无法生效。

二、网络策略核心概念

  1. NetworkPolicy资源对象
    通过YAML文件定义,用于声明Pod的流量控制规则,是实现网络隔离的核心。
  2. 关键字段说明
    • podSelector:通过标签选择目标Pod(如matchLabels: {app: backend}),空选择器表示当前命名空间内所有Pod;
    • policyTypes:定义策略类型,可选Ingress(控制入站流量)、Egress(控制出站流量)或两者组合;
    • ingress:定义入站流量规则,包含from(流量来源,如Pod标签、命名空间、IP段)和ports(允许的端口/协议);
    • egress:定义出站流量规则,包含to(流量目标,如IP段、Pod标签)和ports(允许的端口/协议)。

三、常见配置示例

  1. 默认拒绝所有入站流量(基础隔离)
    通过空podSelector匹配当前命名空间内所有Pod,仅允许显式定义的流量通过,防止未授权访问。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: default-deny-ingress
      namespace: default
    spec:
      podSelector: {}  # 匹配所有Pod
      policyTypes:
      - Ingress  # 仅控制入站流量
    

    应用后,所有未明确允许的入站流量将被拒绝。

  2. 允许特定Pod间通信(微服务隔离)
    允许带有app: frontend标签的Pod访问带有app: backend标签的Pod的8080端口(TCP),实现前后端服务的安全通信。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-frontend-to-backend
      namespace: default
    spec:
      podSelector:
        matchLabels:
          app: backend  # 作用于后端Pod
      policyTypes:
      - Ingress
      ingress:
      - from:
        - podSelector:
            matchLabels:
              app: frontend  # 来自前端Pod
        ports:
        - protocol: TCP
          port: 8080
    

    该策略确保只有前端服务能访问后端服务,其他Pod无法访问。

  3. 限制出站流量到特定IP段(数据安全)
    允许带有app: db标签的Pod访问外部10.0.0.0/24网段的3306端口(MySQL),防止数据库Pod访问无关外部服务,降低数据泄露风险。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-db-to-external
      namespace: default
    spec:
      podSelector:
        matchLabels:
          app: db  # 作用于数据库Pod
      policyTypes:
      - Egress  # 仅控制出站流量
      egress:
      - to:
        - ipBlock:
            cidr: 10.0.0.0/24  # 允许的IP段
        ports:
        - protocol: TCP
          port: 3306
    

    适用于需要限制数据库访问外部IP的场景。

  4. 组合策略(入站+出站)
    允许带有app: user-service标签的Pod:

    • 接收来自app: frontend的Pod的80端口(TCP)流量;
    • 访问外部192.168.1.0/24网段的443端口(HTTPS)。
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: combined-policy
      namespace: default
    spec:
      podSelector:
        matchLabels:
          app: user-service  # 作用于用户服务Pod
      policyTypes:
      - Ingress
      - Egress
      ingress:
      - from:
        - podSelector:
            matchLabels:
              app: frontend  # 入站来源
        ports:
        - protocol: TCP
          port: 80
      egress:
      - to:
        - ipBlock:
            cidr: 192.168.1.0/24  # 出站目标
        ports:
        - protocol: TCP
          port: 443
    

    适用于需要同时控制入站和出站流量的复杂场景。

四、应用与验证

  1. 应用策略
    将YAML文件保存后,使用kubectl apply命令部署:
    kubectl apply -f <policy-file>.yaml
    
  2. 查看策略
    列出当前命名空间的网络策略,确认是否部署成功:
    kubectl get networkpolicies -n <namespace>
    
  3. 验证策略
    • 创建临时测试Pod(如BusyBox):
      kubectl run test-pod --image=busybox -it --rm --restart=Never -- sh
      
    • 在测试Pod中尝试访问目标Pod(如app: backend的8080端口):
      wget -qO- http://<backend-pod-ip>:8080
      
    • 根据策略预期,验证是否允许或拒绝访问(如默认拒绝策略下,未明确允许的流量将被拒绝)。

五、最佳实践

  1. 遵循最小权限原则
    从“默认拒绝所有流量”开始,逐步添加必要的允许规则,避免过度开放权限(如默认拒绝入站流量,仅允许特定Pod访问)。
  2. 标签规范化
    为Pod添加清晰的标签(如app: frontendenv: production),便于策略的精准匹配(如通过app: frontend选择前端Pod)。
  3. 渐进式部署
    先在小范围测试策略(如测试命名空间),确认无误后再推广至生产环境,避免策略错误导致服务中断。
  4. 定期审计策略
    使用kubectl get networkpolicies查看策略覆盖率,结合监控工具(如Prometheus)监控策略匹配的流量日志,及时调整策略(如删除未使用的规则)。

0