本頁說明如何為 Google Kubernetes Engine (GKE) 設定叢集範圍的網路政策。
網路政策和 FQDN 網路政策可協助您定義 Pod 之間的通訊流量規則。網路政策可控管 Pod 在應用程式內及與外部端點之間的通訊方式。
叢集管理員可以設定 Cilium 叢集範圍網路政策 (CCNP),克服網路政策限制,管理叢集範圍的管理流量。Cilium 叢集範圍網路政策會針對整個叢集的所有工作負載,強制執行網路規則。在 GKE 政策評估階層中,這些政策位於 NetworkPolicy 層級。雖然 CCNP 中的明確 Deny 規則會覆寫命名空間範圍政策中的 Allow 規則,但 CCNP Allow 規則的優先順序與標準命名空間政策相同。所有 CCNP 規則都從屬於管理員層級的政策。
GKE 的 Cilium 叢集範圍網路政策是叢集範圍的 CustomResourceDefinition (CRD),用於指定 GKE 強制的政策。在 GKE 中啟用 Cilium 叢集範圍網路政策後,您就能集中管理整個叢集的網路規則。您可以控管進出叢集的流量,在第 3 層 (IP 層級) 和第 4 層 (通訊埠層級) 的基本存取權。
優點
使用 Cilium 叢集範圍網路政策,您可以:
- 強制執行集中式安全性:透過 CCNP,您可以定義適用於整個叢集的網路存取規則。如果這些規則是明確的「拒絕」規則,就會覆寫命名空間層級中任何可能衝突的政策。CCNP「允許」規則與標準命名空間政策位於同一層級。如為授權,請在
ClusterNetworkPolicy中使用「管理員」層級。 - 保護多租戶:如果叢集代管多個團隊或租戶,您可以實作 CCNP 規則,確保共用叢集內的資源隔離,這些規則主要用於控制網路流量。您可以將命名空間或命名空間群組指派給特定團隊,強制執行網路層級的分隔。
- 定義彈性預設政策:使用 CCNP,您可以為整個叢集定義預設網路規則。您可以在必要時自訂這些規則,同時確保叢集整體安全。
如要實作 CCNP,請在叢集上啟用 GKE Dataplane V2。確認已啟用 CCNP CustomResourceDefinition,然後建立政策,定義叢集的網路存取規則。
事前準備
開始之前,請務必先完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
需求條件
Cilium 叢集範圍網路政策必須符合下列條件:
- Google Cloud CLI 465.0.0 以上版本。
- 您必須有執行下列其中一個版本的 GKE 叢集:
- 1.28.6-gke.1095000 以上版本
- 1.29.1-gke.1016000 以上版本
- 叢集必須使用 GKE Dataplane V2。
- 您必須啟用 Cilium 叢集範圍網路政策 CustomResourceDefinition。
限制
Cilium 叢集範圍網路政策有下列限制:
- 不支援第 7 層政策。
- 不支援節點選取器。
- 每個叢集的
CiliumClusterwideNetworkPolicy數量上限為 1000 個。
在新叢集中啟用 Cilium 叢集範圍網路政策
您可以使用 Google Cloud CLI 或 Kubernetes Engine API,在新叢集中啟用 Cilium 叢集範圍網路政策。
gcloud
如要在新叢集中啟用 Cilium 叢集範圍網路政策,請使用 --enable-cilium-clusterwide-network-policy 標記建立新叢集。
Autopilot
gcloud container clusters create-auto CLUSTER_NAME \
--location COMPUTE_LOCATION \
--enable-cilium-clusterwide-network-policy
更改下列內容:
CLUSTER_NAME改為叢集名稱。COMPUTE_LOCATION替換為叢集位置。
標準
gcloud container clusters create CLUSTER_NAME \
--location COMPUTE_LOCATION \
--enable-cilium-clusterwide-network-policy \
--enable-dataplane-v2
更改下列內容:
CLUSTER_NAME改為叢集名稱。COMPUTE_LOCATION替換為叢集位置。
API
如要啟用 Cilium 叢集範圍網路政策,您必須在建立新叢集時指定下列選項:
networkConfig 物件中的 datapathProvider 欄位。
{
"cluster": {
...
"networkConfig": {
"datapathProvider": "ADVANCED_DATAPATH",
"enableCiliumClusterwideNetworkPolicy": true
}
}
}
確認下列指令的輸出內容是否包含 ciliumclusterwidenetworkpolicies.cilium.io
CustomResourceDefinition:
kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io
畫面會顯示如下的輸出內容:
ciliumclusterwidenetworkpolicies.cilium.io 2023-09-19T16:54:48Z
在現有叢集中啟用 Cilium 叢集範圍網路政策
您可以使用 Google Cloud CLI 或 Kubernetes Engine API,在現有叢集中啟用 Cilium 叢集範圍網路政策。
gcloud
確認叢集已啟用 GKE Dataplane V2。
gcloud container clusters describe CLUSTER_NAME \ --location COMPUTE_LOCATION \ --format="value(networkConfig.datapathProvider)" \更改下列內容:
CLUSTER_NAME改為叢集名稱。COMPUTE_LOCATION替換為叢集位置。
使用
--enable-cilium-clusterwide-network-policy旗標更新叢集。gcloud container clusters update CLUSTER_NAME \ --location COMPUTE_LOCATION \ --enable-cilium-clusterwide-network-policy重新啟動 anetd DaemonSet。
kubectl rollout restart ds -n kube-system anetd && \ kubectl rollout status ds -n kube-system anetd
API
確認叢集已啟用 GKE Dataplane V2:
{
"update": {
"desiredEnableCiliumClusterwideNetworkPolicy": true
},
"name": "cluster"
}
To update an existing cluster, run the following update cluster command:
{
"update": {
"desiredEnableCiliumClusterwideNetworkPolicy": true
}
"name": "cluster"
}
確認下列指令的輸出內容中是否包含 ciliumclusterwidenetworkpolicies.cilium.io CustomResourceDefinition:
kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io
畫面會顯示如下的輸出內容:
ciliumclusterwidenetworkpolicies.cilium.io 2023-09-19T16:54:48Z
使用 Cilium 叢集範圍網路政策
本節列出設定 Cilium 叢集範圍網路政策的範例。
範例 1:控管工作負載的輸入流量
以下範例會啟用標籤為 role=backend 的所有端點,接受標籤為 role=frontend 的端點在通訊埠 80 上的輸入連線。標籤為 role=backend 的端點會拒絕所有不符合這項政策的連入連線。
將下列資訊清單儲存為
l4-rule-ingress.yaml:apiVersion: "cilium.io/v2" kind: CiliumClusterwideNetworkPolicy metadata: name: "l4-rule-ingress" spec: endpointSelector: matchLabels: role: backend ingress: - fromEndpoints: - matchLabels: role: frontend toPorts: - ports: - port: "80" protocol: TCP套用資訊清單:
kubectl apply -f l4-rule-ingress.yaml
範例 2:限制特定通訊埠上工作負載的外送流量
下列規則會限制標籤為 app=myService 的所有端點,只能使用通訊埠 80 上的 TCP,將封包傳送至任何第 3 層目的地:
將下列資訊清單儲存為
l4-rule-egress.yaml:apiVersion: "cilium.io/v2" kind: CiliumClusterwideNetworkPolicy metadata: name: "l4-rule-egress" spec: endpointSelector: matchLabels: app: myService egress: - toPorts: - ports: - port: "80" protocol: TCP套用資訊清單:
kubectl apply -f l4-rule-egress.yaml
範例 3:限制特定通訊埠和 CIDR 上工作負載的外送流量
以下範例會限制所有標籤為 role=crawler 的端點,只能將通訊埠 80 的封包 (通訊協定為 TCP) 傳送至目的地 CIDR 192.10.2.0/24。
將下列資訊清單儲存為
cidr-l4-rule.yaml:apiVersion: "cilium.io/v2" kind: CiliumClusterwideNetworkPolicy metadata: name: "cidr-l4-rule" spec: endpointSelector: matchLabels: role: crawler egress: - toCIDR: - 192.0.2.0/24 toPorts: - ports: - port: "80" protocol: TCP套用資訊清單:
kubectl apply -f cidr-l4-rule.yaml
監控及排解網路流量問題
您可以透過網路政策記錄和 GKE Dataplane V2 觀測功能,監控及排解受 Cilium 叢集範圍網路政策影響的網路流量。
嘗試使用第 7 層政策或節點選取器
症狀
如果您使用 GKE Dataplane V2 搭配 GKE,並嘗試定義包含第 7 層規則 (例如:HTTP 篩選) 和節點選取器的 CCNP 政策,可能會看到類似下列內容的錯誤訊息:
錯誤
Error from server (GKE Warden constraints violations): error when creating
"ccnp.yaml": admission webhook
"warden-validating.common-webhooks.networking.gke.io" denied the request: GKE
Warden rejected the request because it violates one or more constraints.
Violations details: {"[denied by gke-cilium-network-policy-limitation]":["L7
rules are not allowed in CiliumClusterwideNetworkPolicy"]} Requested by user:
'user@example.com', groups: 'system:authenticated'.
可能原因
GKE 對 CCNP 有特定限制。GKE 的 Cilium 整合功能不支援第 7 層政策,這類政策可根據應用程式層級資料 (例如 HTTP 標頭) 進行篩選,也不支援節點選取器。
解決方法
如果 GKE 叢集需要進階的第 7 層篩選功能,建議使用 Cloud Service Mesh。這項功能可提供更精細的應用程式層級流量控制。
未啟用 Cilium 叢集範圍網路政策
症狀
如果您嘗試在未明確啟用這項功能的叢集中,設定 Cilium 叢集範圍網路政策 (CCNP),系統會禁止您設定,並可能顯示類似以下的錯誤訊息:
錯誤
error: resource mapping not found for name: "l4-rule" namespace: "" from
"ccnp.yaml": no matches for kind "CiliumClusterwideNetworkPolicy" in version
"cilium.io/v2" ensure CRDs are installed first
可能原因
Cilium 叢集範圍網路政策依賴自訂資源定義 (CRD)。這則錯誤訊息表示叢集中缺少 CustomResourceDefinition。
解決方法
使用 CCNP 前,請先啟用 Cilium 叢集範圍網路政策 CustomResourceDefinition。