本頁說明如何為 Google Kubernetes Engine (GKE) 設定叢集範圍的網路政策。
網路政策和 FQDN 網路政策可協助您定義 Pod 之間的通訊流量規則。網路政策可控管 Pod 在應用程式內及與外部端點之間的通訊方式。
叢集管理員可以設定 Cilium 叢集範圍網路政策 (CCNP),克服網路政策限制,管理叢集範圍的管理流量。Cilium 叢集範圍網路政策會對整個叢集和命名空間的所有工作負載強制執行嚴格的網路規則,並覆寫任何應用程式專屬規則。
GKE 的 Cilium 叢集範圍網路政策是叢集範圍的 CustomResourceDefinition (CRD),可指定 GKE 強制的政策。在 GKE 中啟用 Cilium 叢集範圍網路政策後,您就能集中管理整個叢集的網路規則。您可以控管進出叢集的流量,包括第 3 層 (IP 層級) 和第 4 層 (連接埠層級) 的基本存取權。
優點
使用 Cilium 叢集範圍網路政策,您可以:
- 強制執行集中式安全性:透過 CCNP,您可以定義適用於整個網路的網路存取規則。這些 CCNP 規則會做為頂層安全層,覆寫命名空間層級中任何可能衝突的政策。
- 保護多租戶:如果叢集代管多個團隊或租戶,您可以實作 CCNP 規則,在共用叢集中確保隔離,這些規則著重於網路流量控制。您可以將命名空間或命名空間群組指派給特定團隊,強制執行網路層級的分隔。
- 定義彈性預設政策:使用 CCNP,您可以為整個叢集定義預設網路規則。您可以在必要時自訂這些規則,同時確保叢集整體安全。
如要實作 CCNP,請在叢集上啟用 GKE Dataplane V2。確認已啟用 CCNP CRD,然後建立政策,為叢集定義網路存取規則。
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
需求條件
Cilium 叢集範圍網路政策必須符合下列條件:
- Google Cloud CLI 465.0.0 以上版本。
- 您必須有執行下列其中一個版本的 GKE 叢集:
- 1.28.6-gke.1095000 以上版本
- 1.29.1-gke.1016000 以上版本
- 叢集必須使用 GKE Dataplane V2。
- 您必須啟用 Cilium 叢集範圍網路政策 CRD。
限制
Cilium 叢集範圍網路政策有下列限制:
- 系統不支援第 7 層政策。
- 不支援節點選取器。
- 每個叢集的
CiliumClusterwideNetworkPolicy
數量上限為 1000 個。
在新叢集中啟用 Cilium 叢集範圍網路政策
您可以使用 Google Cloud CLI 或 Google 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
:
kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io
畫面會顯示如下的輸出內容:
ciliumclusterwidenetworkpolicies.cilium.io 2023-09-19T16:54:48Z
在現有叢集中啟用 Cilium 叢集範圍網路政策
您可以使用 Google Cloud CLI 或 Google 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
:
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)。錯誤訊息指出叢集中缺少 CRD。
解決方法
使用 CCNP 前,請先啟用 Cilium 叢集範圍網路政策 CRD。