使用ACK GlobalNetworkPolicy

Kubernetes NetworkPolicy是一种使用标签选择器来定义Pod级别的网络管理策略,而ACK GlobalNetworkPolicy在此基础之上,增加了集群层面的网络策略功能,实现集群维度的网络策略管理。如果您需要对集群的网络安全执行细致化的管理策略,本文档将介绍如何使用ACK GlobalNetworkPolicy来实现这一需求。

前提条件

步骤一:安装Poseidon组件

Poseidon是容器NetworkPolicy组件,支持Kubernetes标准的NetworkPolicy功能。

安装Poseidon组件0.5.1及以上版本,并开启ACK NetworkPolicy功能选项。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面,单击网络页签,在Poseidon组件卡片的右下角,单击安装

  4. 安装组件Poseidon对话框,勾选启用ACK NetworkPolicy,然后单击确定

步骤二:使用ACK GlobalNetworkPolicy

ACK GlobalNetworkPolicy的定义和使用方法与Kubernetes NetworkPolicy类似。而它的规则在没有明确指定的情况下,将默认影响整个集群的节点和Pod。

语法说明

ACK GlobalNetworkPolicy基本的结构如下:

apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy
metadata:
  name: example
spec:
  podSelector:      # NetworkPolicy作用的Pod范围,默认:匹配所有Pod。
    matchLabels:
      foo: bar      # 选择带有标签foo:bar的Pod。
  namespaceSelector:   # NetworkPolicy作用的Namespace范围。默认:匹配所有Namespace,此规则与podSelector为And关系。
    matchLabels:
      foo: bar      # 选择带有标签foo:bar的命名空间。
  policyTypes:      # NetworkPolicy生效的方向。
    - Ingress       # 策略将应用于入站流量。
    - Egress        # 策略将应用于出站流量。
  ingress: []       # 入站规则。
  egress: []        # 出站规则。

使用限制

在单个集群中,规则使用限制如下:

  • GlobalNetworkPolicy资源数量应少于100个。

  • 单个GlobalNetworkPolicy中的入站ingress和出站egress规则数量应少于20个。

  • 单个入站或出站规则中的端口ports数量应少于10个。

ingress/egress规则

ingressegress规则设定了允许通过NetworkPolicy的流量的源地址和目的地址。两者的规则结构相同,通过from(对于ingress)和to(对于egress)明确指定允许的通信范围。

apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy
metadata:
  name: example                          # 策略名称
spec:
  podSelector: {}                       
  namespaceSelector: null                     
  policyTypes:
    - Ingress                            # 策略包括入站规则
    - Egress                             # 策略包括出站规则
  ingress:
    - from:
        - namespaceSelector:             # 允许具有匹配标签的命名空间中的Pod入站。
            matchLabels:
              foo: bar
          podSelector:                   # 允许具有匹配标签的Pod入站。
            matchLabels:
              foo: bar
        ports:
          - protocol: TCP                # 允许TCP流量,取值为TCP或UDP。
            port: 443                    # 允许端口443。
    - from:
        - ipBlock:                       # 定义允许集群外发起入站请求的CIDR范围。
            cidr: "172.16.0.0/16"
            except:
              - "172.16.1.0/24"          # 从允许集群外的入站来源范围中排除CIDR范围"172.16.1.0/24"。
  egress:
    - to:
        - namespaceSelector:             # 允许出站到具有匹配标签的命名空间中的Pod。
            matchLabels:
              foo: bar
          podSelector:                   # 允许出站到具有匹配标签的Pod。
            matchLabels:
              foo: bar
    - to:
        - ipBlock:                       # 定义策略允许集群外出站到的CIDR范围。
            cidr: "172.16.0.0/16"
            except:
              - "172.16.1.0/24"          # 从允许集群外的出站目的地范围中排除CIDR范围"172.16.1.0/24"。

字段

描述

ipBlock

静态的CIDR网段,用于描述集群外部的流量地址。该网段定义允许或拒绝哪些集群外的IP地址范围进入或离开集群内部的Pod。

podSelector

通过label动态选择地址。用于描述集群内Pod的地址。

在创建网络策略时,您不能在同一条规则内同时使用ipBlockpodSelector或者namespaceSelector。正确的方式是将ipBlockpodSelector分开如下:

ingress:
  - from:
      - ipBlock:               # 第一个来源条件是ipBlock。
          cidr: "192.168.0.0/16"
      - podSelector:           # 第二个来源条件是podSelector。
          matchLabels:
            key: value
    ports:
      - protocol: TCP
        port: 80

下面是一个错误的示例,它将导致互斥。

展开错误示例。

ingress:
  - from:
      - ipBlock:                  # CIDR 范围定义。
          cidr: "192.168.0.0/16"
        podSelector:              # 错误: 在同一条目中不能和ipBlock一起使用。
          matchLabels:
            key: value
    ports:
      - protocol: TCP
        port: 443

使用示例

本文示例中均包含podSelector配置,请根据实际使用需求进行调整。

重要

配置GlobalNetworkPolicy时请谨慎操作。如果未指定podSelectornamespaceSelector,该策略将应用于集群内的所有Pod。

拒绝指定应用Pod所有流量规则

以下YAML文件定义了一个GlobalNetworkPolicy,该策略仅作用于具有foo: bar标签的Pod,拒绝所有入站与出站网络流量。

apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector:
    matchLabels:
      foo: bar
  namespaceSelector: null
  policyTypes:
    - Ingress
    - Egress
  ingress: []
  egress: []

允许指定应用Pod访问DNS

以下YAML文件定义了一个GlobalNetworkPolicy,该策略仅用于具有foo: bar标签的Pod,允许这些Pod与集群内运行的DNS服务通信。

apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy                     
metadata:
  name: allow-dns                            
spec:
  podSelector:                                
    matchLabels:
      foo: bar                                
  namespaceSelector: null                 
  policyTypes:                                
    - Egress
  egress:                                     
    - to:                                 
        - namespaceSelector:              
            matchLabels:
              kubernetes.io/metadata.name: kube-system
          podSelector:
            matchLabels:
              k8s-app: kube-dns