更新时间:2024-01-26 GMT+08:00

网络策略(NetworkPolicy)

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

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

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

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

约束与限制

  • 当前仅容器隧道网络模型的集群支持网络策略(NetworkPolicy)。网络策略可分为以下规则:
    • 入规则(Ingress):所有版本均支持。
    • 出规则(Egress):仅如下操作系统和集群版本支持设置Egress规则:

      操作系统

      集群版本

      经验证的内核版本

      CentOS

      v1.23及以上

      3.10.0-1062.18.1.el7.x86_64

      3.10.0-1127.19.1.el7.x86_64

      3.10.0-1160.25.1.el7.x86_64

      EulerOS 2.5

      v1.23及以上

      3.10.0-862.14.1.5.h591.eulerosv2r7.x86_64

      3.10.0-862.14.1.5.h687.eulerosv2r7.x86_64

      EulerOS 2.9

      v1.23及以上

      4.18.0-147.5.1.6.h541.eulerosv2r9.x86_64

      4.18.0-147.5.1.6.h766.eulerosv2r9.x86_64

  • 不支持对IPv6地址网络隔离。
  • 通过原地升级到支持Egress的集群版本,由于不会升级节点操作系统,会导致无法使用Egress,此种情况下,请重置节点。

使用Ingress规则

  • 使用podSelector设置访问范围
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: test-network-policy
      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

    示意图如下所示。

    图1 podSelector
  • 使用namespaceSelector设置访问范围
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: test-network-policy
    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 namespaceSelector

使用Egress规则

Egress不仅支持podSelector和namespaceSelector,还支持ipBlock。

仅1.23及以上版本集群支持Egress规则,且当前仅支持EulerOS 2.5、EulerOS 2.9和CentOS 7.X。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-client-a-via-except-cidr-egress-rule
  namespace: default
spec:
  policyTypes:                  # 使用Egress必须指定policyType
    - Egress
  podSelector:                  # 规则对具有role=db标签的Pod生效
    matchLabels:
      role: db
  egress:                       # 表示出规则
  - to:
    - ipBlock:
        cidr: 172.16.0.16/16    # 允许此网段被访问
        except:
        - 172.16.0.40/32        # 不允许此网段被访问,except需在cidr网段内

示意图如下所示。

图3 ipBlock

Ingress和Egress可以定义在同一个规则中。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  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

示意图如下所示。

图4 同时使用Ingress和Egress

在控制台创建网络策略

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

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

      表1 添加入方向规则

      参数

      参数说明

      协议端口

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

      源对象命名空间

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

      源对象Pod标签

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

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