更新时间:2025-08-18 GMT+08:00
分享

网络策略(NetworkPolicy)

网络策略(NetworkPolicy)是Kubernetes设计用来限制Pod访问的对象,相当于从应用的层面构建了一道防火墙,进一步保证了网络安全。NetworkPolicy支持的能力取决于集群的网络插件的能力。

默认情况下,如果命名空间中不存在任何策略,则所有进出该命名空间中的Pod的流量都被允许。

NetworkPolicy的规则可以选择如下3种:

  • namespaceSelector:根据命名空间的标签选择,具有该标签的命名空间都可以访问。
  • podSelector:根据Pod的标签选择,具有该标签的Pod都可以访问。
  • ipBlock:根据网络选择,网段内的IP地址都可以访问。(仅Egress支持IPBlock)

网络策略支持的集群对比

集群类型

CCE Standard集群

CCE Standard集群

CCE Turbo集群

网络模型

容器隧道网络模型

VPC网络模型

云原生网络2.0模型

NetworkPolicy能力是否默认开启

默认开启

默认关闭,如需使用NetworkPolicy能力需在创建集群时开启DataPlane V2

默认关闭,如需使用NetworkPolicy能力需在创建集群时开启DataPlane V2

数据面实现

openvswitch

eBPF

eBPF

入规则支持的集群版本

所有版本

v1.27.16-r30、v1.28.15-r20、v1.29.13-r0、v1.30.10-r0、v1.31.6-r0及以上集群版本

v1.27.16-r10、v1.28.15-r0、v1.29.10-r0、 v1.30.6-r0及以上集群版本

出规则支持的集群版本

v1.23及以上集群版本

入规则支持的选择方式

namespaceSelector

podSelector

namespaceSelector

podSelector

ipBlock

namespaceSelector

podSelector

ipBlock

出规则支持的选择方式

namespaceSelector

podSelector

ipBlock

支持的操作系统

EulerOS

CentOS

Huawei Cloud EulerOS 2.0

Huawei Cloud EulerOS 2.0

Huawei Cloud EulerOS 2.0

是否支持IPv6网络策略

不支持

不支持

支持

是否支持安全容器

不支持

不支持

不支持

ipBlock限制范围

无约束

不支持配置容器网段、服务网段内的网段以及节点IP

不支持配置容器网段、服务网段内的网段以及节点IP

是否支持通过工作负载的标签限制ClusterIP的访问

不支持

支持

支持

是否支持限制100.125.0.0/16内部云服务网段

支持

支持

不支持

是否支持SCTP协议

不支持

支持

不支持

总是放通节点访问该节点上的Pod

支持

支持

支持

是否支持NetworkPolicy中EndPort配置

不支持

支持

不支持

  • DataPlane V2特性由CCE受限开放,使用前请提交工单给CCE服务进行申请。
  • NetworkPolicy暂不支持安全容器(容器运行时为Kata)。
  • 容器隧道网络的CCE Standard集群中,通过原地升级到支持Egress的集群版本,由于不会升级节点操作系统,会导致无法使用Egress,此种情况下请重置节点。
  • 容器隧道网络集群开启NetworkPolicy后,Pod访问服务网段地址时,会在IP数据报文的可选字段里填充Pod源IP,以便目的端Pod上的NetworkPolicy规则可以基于Pod源IP进行网络策略限制。

通过YAML使用Ingress规则

  • 场景一:通过网络策略限制Pod只能被带有特定标签的Pod访问
    图1 podSelector

    目标Pod具有role=db标签,该Pod只允许带有role=frontend标签的Pod访问其6379端口。设置该网络策略的具体操作步骤如下:

    1. 创建名为access-demo1.yaml文件。
      vim access-demo1.yaml

      以下为YAML文件内容:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: access-demo1
        namespace: default
      spec:
        podSelector:                  # 规则对具有role=db标签的Pod生效
          matchLabels:
            role: db
        ingress:                      # 表示入规则
        - from:
          - podSelector:              # 只允许具有role=frontend标签的Pod访问
              matchLabels:
                role: frontend
          ports:                      # 只能使用TCP协议访问6379端口
          - protocol: TCP
            port: 6379
    2. 执行以下命令,根据上述的access-demo1.yaml文件创建网络策略。
      kubectl apply -f access-demo1.yaml

      预期输出:

      networkpolicy.networking.k8s.io/access-demo1 created
  • 场景二:通过网络策略限制Pod只能被指定命名空间下的Pod访问
    图2 namespaceSelector

    目标Pod具有role=db标签,该Pod只允许project=myproject标签的命名空间中的Pod访问其6379端口。设置该网络策略的具体操作步骤如下:

    1. 创建名为access-demo2.yaml文件。
      vim access-demo2.yaml

      以下为YAML文件内容:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: access-demo2
      spec:
        podSelector:                  # 规则对具有role=db标签的Pod生效
          matchLabels:
            role: db
        ingress:                      # 表示入规则
        - from:
          - namespaceSelector:        # 只允许具有project=myproject标签的命名空间中的Pod访问
              matchLabels:
                project: myproject
          ports:                      # 只能使用TCP协议访问6379端口
          - protocol: TCP
            port: 6379
    2. 执行以下命令,根据上述的access-demo2.yaml文件创建网络策略。
      kubectl apply -f access-demo2.yaml

      预期输出:

      networkpolicy.networking.k8s.io/access-demo2 created

通过YAML使用Egress规则

容器隧道网络模型集群中,1.23及以上集群版本支持Egress规则操作系统。

VPC网络模型和CCE Turbo集群中,v1.27.16-r10、v1.28.15-r0、v1.29.10-r0、 v1.30.6-r0及以上版本的集群开启DataPlane V2后支持Egress规则,仅支持HCE OS 2.0操作系统。

  • 场景一:通过网络策略限制Pod只能访问指定地址
    图3 ipBlock

    目标Pod具有role=db标签,该Pod只允许访问172.16.0.0/16网段,但不允许访问该网段中的172.16.0.40/32地址。设置该网络策略的具体操作步骤如下:

    1. 创建名为access-demo3.yaml文件。
      vim access-demo3.yaml

      以下为YAML文件内容:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: access-demo3
        namespace: default
      spec:
        policyTypes:                  # 使用Egress必须指定policyType
          - Egress
        podSelector:                  # 规则对具有role=db标签的Pod生效
          matchLabels:
            role: db
        egress:                       # 表示出规则
        - to:
          - ipBlock:
              cidr: 172.16.0.0/16    # 允许在出方向访问此网段
              except:
              - 172.16.0.40/32        # 不允许在出方向访问此网段,except网段需在cidr网段内
    2. 执行以下命令,根据上述的access-demo3.yaml文件创建网络策略。
      kubectl apply -f access-demo3.yaml

      预期输出:

      networkpolicy.networking.k8s.io/access-demo3 created
  • 场景二:通过网络策略限制Pod只能被带有特定标签的Pod访问,且只能访问指定Pod
    图4 同时使用Ingress和Egress

    目标Pod具有role=db标签,该Pod只允许带有role=frontend标签的Pod访问其6379端口,且该Pod只能访问带有role=web标签的Pod。网络策略中的Ingress和Egress可以定义在同一个规则中,具体操作步骤如下:

    1. 创建名为access-demo4.yaml文件。
      vim access-demo4.yaml

      以下为YAML文件内容:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: access-demo4
        namespace: default
      spec:
        policyTypes:
        - Ingress
        - Egress
        podSelector:                  # 规则对具有role=db标签的Pod生效
          matchLabels:
            role: db
        ingress:                      # 表示入规则
        - from:
          - podSelector:              # 只允许具有role=frontend标签的Pod访问
              matchLabels:
                role: frontend
          ports:                      # 只能使用TCP协议访问6379端口
          - protocol: TCP
            port: 6379
        egress:                       # 表示出规则
        - to:
          - podSelector:              # 只允许访问具有role=web标签的Pod
              matchLabels:
                role: web
    2. 执行以下命令,根据上述的access-demo4.yaml文件创建网络策略。
      kubectl apply -f access-demo4.yaml

      预期输出:

      networkpolicy.networking.k8s.io/access-demo4 created

相关文档