文档首页/ 云容器引擎 CCE/ 用户指南/ 网络/ 容器网络/ Pod网络配置/ 配置网络策略(NetworkPolicy)限制Pod访问的对象
更新时间:2025-12-23 GMT+08:00
分享

配置网络策略(NetworkPolicy)限制Pod访问的对象

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

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

NetworkPolicy的Ingress/Egress对端选择方式有如下3种:

  • namespaceSelector:根据命名空间的标签选择,具有该标签的命名空间都可以访问或被访问。
  • podSelector:根据Pod的标签选择,具有该标签的Pod都可以访问或被访问。
  • ipBlock:根据地址段选择,网段内的IP地址都可以访问或被访问。

网络策略支持的集群对比

集群类型

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操作系统。

v1.28.15-r70、v1.29.15-r30、v1.30.14-r30、v1.31.10-r30、v1.32.6-r30、v1.33.5-r20、v1.34.1-r0及以上版本的集群额外支持使用Ubuntu 22.04操作系统。

支持Huawei Cloud EulerOS 2.0操作系统。

v1.28.15-r70、v1.29.15-r30、v1.30.14-r30、v1.31.10-r30、v1.32.6-r30、v1.33.5-r20、v1.34.1-r0及以上版本的集群额外支持使用Ubuntu 22.04操作系统。

是否支持IPv6网络策略

不支持

不支持

支持

是否支持安全容器

不支持

不支持

不支持

ipBlock限制范围

无约束

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

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

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

不支持

支持

支持

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

支持

支持

不支持

是否支持SCTP协议

不支持

支持

不支持

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

支持

支持

支持

是否支持NetworkPolicy中EndPort配置

不支持

支持

不支持

  • CCE Turbo集群使用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-ingress1.yaml文件。
      vim access-ingress1.yaml

      以下为YAML文件内容:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: access-ingress1
        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-ingress1.yaml文件创建网络策略。
      kubectl apply -f access-ingress1.yaml

      预期输出:

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

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

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

      以下为YAML文件内容:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: access-ingress2
      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-ingress2.yaml文件创建网络策略。
      kubectl apply -f access-ingress2.yaml

      预期输出:

      networkpolicy.networking.k8s.io/access-ingress2 created
  • 场景三:通过网络策略限制Pod只能被指定命名空间下带有特定标签的Pod访问
    图3 podSelector和namespaceSelector结合使用

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

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

      以下为YAML文件内容:

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

      预期输出:

      networkpolicy.networking.k8s.io/access-ingress3 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规则,仅支持Huawei Cloud EulerOS 2.0操作系统。

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

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

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

      以下为YAML文件内容:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: access-egress1
        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-egress1.yaml文件创建网络策略。
      kubectl apply -f access-egress1.yaml

      预期输出:

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

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

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

      以下为YAML文件内容:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: access-egress2
        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-egress2.yaml文件创建网络策略。
      kubectl apply -f access-egress2.yaml

      预期输出:

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

通过控制台创建网络策略

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“策略”,在右侧选择“网络策略”页签,单击右上角“创建网络策略”

    • 策略名称:自定义输入NetworkPolicy名称。
    • 命名空间:选择网络策略所在命名空间。
    • 选择器:输入标签选择要关联的Pod,然后单击“确认添加”。您也可以单击“引用负载标签”直接引用已有负载的标签。
    • 入方向规则:单击添加入方向规则,参数设置请参见表1

      表1 添加入方向规则

      参数

      参数说明

      协议端口

      请选择对应的协议类型和端口,目前支持TCP和UDP协议。

      源网段

      v1.27.16-r10、v1.28.15-r0、v1.29.10-r0、v1.30.6-r0及以上版本的集群开启DataPlane V2时支持设置源网段。

      允许转发来自指定网段内(可指定多个例外网段)的流量。指定网段和例外网段用竖线(|)分隔,多个例外网段用逗号(,)分隔。例如 172.17.0.0/16|172.17.1.0/24,172.17.2.0/24 表示允许来自172.17.0.0/16网段的流量访问,其中 172.17.1.0/24 和 172.17.2.0/24 两个网段例外。

      源对象命名空间

      选择允许哪个命名空间的对象访问。不填写表示和当前策略属于同一命名空间。

      源对象Pod标签

      允许带有这个标签的Pod访问,不填写表示命名空间下全部Pod。

    • 出方向规则:单击添加出方向规则,参数设置请参见表2

      表2 添加出方向规则

      参数

      参数说明

      协议端口

      请选择对应的协议类型和端口,目前支持TCP和UDP协议。不填写表示不限制。

      目标网段

      允许将流量转发至指定的一个网段内(可指定多个例外网段)。指定网段和例外网段用竖线(|)分隔,多个例外网段用逗号(,)分隔。例如 172.17.0.0/16|172.17.1.0/24,172.17.2.0/24 表示允许访问 172.17.0.0/16 网段,其中 172.17.1.0/24 和 172.17.2.0/24 两个网段例外。

      目的对象命名空间

      选择允许访问哪个命名空间中的对象。不填写表示和当前策略属于同一命名空间。

      目的对象Pod标签

      允许访问携带此标签的Pod,不填写表示命名空间下全部Pod。

  3. 设置完成后,单击“确定”

相关文档