全部產品
Search
文件中心

Container Service for Kubernetes:使用ACK GlobalNetworkPolicy

更新時間:Jul 23, 2024

Kubernetes NetworkPolicy是一種使用標籤選取器來定義Pod層級的網路管理原則,而ACK GlobalNetworkPolicy在此基礎之上,增加了叢集層面的網路原則功能,實現叢集維度網路原則管理。如果您需要對叢集的網路安全執行細緻化的管理原則,本文檔將介紹如何使用ACK GlobalNetworkPolicy來實現這一需求。

前提條件

步驟一:安裝Poseidon組件

Poseidon是容器NetworkPolicy組件,支援Kubernetes標準的NetworkPolicy功能。

安裝Poseidon組件0.5.1及以上版本,並開啟ACK NetworkPolicy功能選項。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  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