使用網路政策控管叢集範圍的通訊

本頁面說明如何為 Google Kubernetes Engine (GKE) 設定叢集層級網路政策。

網路政策和 FQDN 網路政策可協助您定義 Pod 之間的通訊流量規則。網路政策可控管 Pod 如何在應用程式內相互通訊,以及與外部端點通訊。

叢集管理員可以設定 Cilium 叢集範圍網路政策 (CCNP),克服管理叢集範圍管理流量的網路政策限制。Cilium 叢集網路政策會對整個叢集的所有工作負載強制執行網路規則。在 GKE 政策評估階層中,這些政策位於 NetworkPolicy 層。雖然 CCNP 中的明確「拒絕」規則會覆寫命名空間範圍政策中的允許規則,但 CCNP「允許」規則的優先順序與標準命名空間政策相同。所有 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 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

  1. 確認叢集已啟用 GKE Dataplane V2。

    gcloud container clusters describe CLUSTER_NAME \
        --location COMPUTE_LOCATION \
        --format="value(networkConfig.datapathProvider)" \
    

    更改下列內容:

    • CLUSTER_NAME:叢集名稱。
    • 將 COMPUTE_LOCATION 替換為叢集的位置。
  2. 使用 --enable-cilium-clusterwide-network-policy 旗標更新叢集。

    gcloud container clusters update CLUSTER_NAME \
        --location COMPUTE_LOCATION \
        --enable-cilium-clusterwide-network-policy
    
  3. 重新啟動 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 的端點會拒絕這項政策不允許的所有輸入連線。

  1. 將下列資訊清單儲存為 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
    
  2. 套用資訊清單:

    kubectl apply -f l4-rule-ingress.yaml
    

範例 2:限制特定通訊埠上工作負載的輸出流量

下列規則會限制所有標籤為 app=myService 的端點,只能使用 TCP 透過通訊埠 80 將封包傳送至任何第 3 層目的地:

  1. 將下列資訊清單儲存為 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
    
  2. 套用資訊清單:

    kubectl apply -f l4-rule-egress.yaml
    

範例 3:限制特定通訊埠和 CIDR 上工作負載的輸出流量

以下範例會限制所有標籤為 role=crawler 的端點,只能透過通訊埠 80、通訊協定 TCP 將封包傳送至目的地 CIDR 192.10.2.0/24。

  1. 將下列資訊清單儲存為 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
    
  2. 套用資訊清單:

    kubectl apply -f cidr-l4-rule.yaml
    

監控網路流量及排解相關問題

您可以透過網路政策記錄和 GKE Dataplane V2 觀測能力,監控及排解受 Cilium 叢集網路政策影響的網路流量問題。

嘗試使用第 7 層政策或節點選取器

症狀

如果您使用 GKE 搭配 GKE Dataplane V2,並嘗試定義包含第 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。

解決方式

請先啟用 Cilium 叢集網路政策 CustomResourceDefinition,再使用 CCNP。

後續步驟