Kubernetes NetworkPolicy是一種使用標籤選取器來定義Pod層級的網路管理原則,而ACK GlobalNetworkPolicy在此基礎之上,增加了叢集層面的網路原則功能,實現叢集維度網路原則管理。如果您需要對叢集的網路安全執行細緻化的管理原則,本文檔將介紹如何使用ACK GlobalNetworkPolicy來實現這一需求。
前提條件
步驟一:安裝Poseidon組件
Poseidon是容器NetworkPolicy組件,支援Kubernetes標準的NetworkPolicy功能。
安裝Poseidon組件0.5.1及以上版本,並開啟ACK NetworkPolicy功能選項。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在組件管理頁面,單擊網路頁簽,在Poseidon組件卡片的右下角,單擊安裝。
在安裝組件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規則
ingress
和egress
規則設定了允許通過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的地址。 |
在建立網路原則時,您不能在同一條規則內同時使用ipBlock
和podSelector
或者namespaceSelector
。正確的方式是將ipBlock
和podSelector
分開如下:
ingress:
- from:
- ipBlock: # 第一個來源條件是ipBlock。
cidr: "192.168.0.0/16"
- podSelector: # 第二個來源條件是podSelector。
matchLabels:
key: value
ports:
- protocol: TCP
port: 80
下面是一個錯誤的樣本,它將導致互斥。
使用樣本
本文樣本中均包含podSelector
配置,請根據實際使用需求進行調整。
配置GlobalNetworkPolicy
時請謹慎操作。如果未指定podSelector
和namespaceSelector
,該策略將應用於叢集內的所有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