GKE LoadBalancer Service 的使用者管理防火牆規則


本頁面說明如何停用 GKE 為 LoadBalancer 服務建立的 Ingress 允許 VPC 防火牆規則

在下列情況中,停用 LoadBalancer Service 的自動建立防火牆規則可能很有用:

如要停用 LoadBalancer Service 的自動建立防火牆規則,您必須在建立或更新叢集時指定 --disable-l4-lb-firewall-reconciliation 標記。--disable-l4-lb-firewall-reconciliation 標記不會影響其他自動建立的虛擬私有雲防火牆規則,例如有助於節點間通訊的規則,或是允許 Service 進行健康狀態檢查的規則。

需求條件

  • 如要為 LoadBalancer Service 使用使用者管理的防火牆規則,GKE 叢集必須使用 1.31.3-gke.105600 以上版本。

限制

GKE 支援停用下列 LoadBalancer Service 類型的防火牆規則自動建立功能:

您無法停用下列 LoadBalancer Service 類型的防火牆規則自動建立功能:

  • 未使用 GKE 子集的 Internal LoadBalancer 服務
  • 以目標集區為基礎的外部 LoadBalancer Service

事前準備

開始之前,請確認你已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。

手動管理防火牆規則的策略

在 GKE 叢集中停用 LoadBalancer Service 的虛擬私有雲防火牆規則自動建立功能前,請先與安全管理員合作,制定手動設定防火牆規則的策略。

  1. 決定要使用哪種防火牆政策:階層式防火牆政策、全域網路防火牆政策或區域網路防火牆政策。如需建立防火牆政策的步驟,請參閱:

    您也可以使用虛擬私有雲防火牆規則,這類規則不會使用任何政策。

  2. 您手動建立的防火牆規則必須是允許輸入規則,因為默示拒絕輸入防火牆規則會禁止傳入流量。停用自動建立虛擬私有雲防火牆規則後,除非您已建立與 LoadBalancer Service 流量相符的傳入允許防火牆規則,否則傳入流量不會抵達節點。

    視防火牆規則的參數而定,單一輸入允許防火牆規則可套用至一或多個 LoadBalancer 服務。為您建立的每個輸入允許防火牆規則定義下列參數:

    • 目標參數:確認防火牆規則至少包含含有 LoadBalancer 服務的叢集的所有節點。支援的目標取決於規則所在的防火牆政策類型,或是您是否使用虛擬私有雲防火牆規則。如要瞭解防火牆政策中規則的目標參數,請參閱「目標」。

    • 「Protocols and ports」(通訊協定和通訊埠):包含防火牆規則需要套用的 LoadBalancer 服務所使用的所有通訊協定和目的地通訊埠。

    • 到達網頁參數:您可以對到達網頁參數採用下列其中一種策略:

      • 在目的地參數中,加入防火牆規則需要套用的所有 LoadBalancer 服務 IP 位址。如要找出 LoadBalancer 服務的 IP 位址,請使用下列指令:
         kubectl get svc LOADBALANCER_NAME \
            -n NAMESPACE_NAME \
            -o jsonpath='{.status.loadBalancer.ingress[0].ip}
      
    • 來源參數:指定用戶端使用的來源 (例如 IP 位址),這些用戶端需要連線至防火牆規則適用的負載平衡器服務。

    如需建立防火牆規則的步驟,請參閱:

  3. 如要確保手動建立的防火牆規則運作正常,請執行 Network Intelligence Center (NIC) 連線測試。執行連線測試時:

    • 將目的地設為 LoadBalancer 服務的 IP 位址。
    • 將來源設為用戶端的 IP 位址。

    詳情請參閱「排解連線問題」。

停用 LoadBalancer Service 的虛擬私有雲防火牆規則建立功能

本節說明如何停用 LoadBalancer Service 的虛擬私有雲防火牆規則自動建立功能。

建立新的 GKE 叢集,並停用虛擬私有雲防火牆規則建立功能

  1. 如要為新建立的叢集停用 LoadBalancer Service 的自動建立虛擬私有雲防火牆規則,請使用 --disable-l4-lb-firewall-reconciliation 標記建立叢集:

    Autopilot:

    gcloud container clusters create-auto CLUSTER_NAME \
      --disable-l4-lb-firewall-reconciliation \
      --cluster-version=VERSION
    

    標準:

    gcloud container clusters create CLUSTER_NAME \
      --disable-l4-lb-firewall-reconciliation \
      --enable-l4-ilb-subsetting \
      --cluster-version=VERSION
    

    更改下列內容:

    • CLUSTER_NAME:新叢集的名稱。
    • VERSION:GKE 版本。
  2. 建立外部或內部 LoadBalancer 服務:

  3. 確認 GKE 未為 LoadBalancer 服務建立允許輸入的防火牆規則。(系統自動建立的 Ingress 允許防火牆規則會採用以下格式的名稱:k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash])。

    下列指令會傳回包含 k8s2 的防火牆規則清單:

    gcloud compute firewall-rules list --format="value(name)" | grep "k8s2"
    

    如果 externalTrafficPolicy 參數設為 Local,回應應只傳回 k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash]-fw 形式的健康狀態檢查防火牆規則。並使用 spec.healthCheckNodePort 參數定義的 TCP 連接埠。如果未指定,Kubernetes 控制層會從節點埠範圍指派健康狀態檢查埠。

    k8s2-rkdld6go-default-ilb-svc-dluvsefq-fw  default  INGRESS  1000  tcp:30868  False
    

    如果 externalTrafficPolicy 參數設為 Cluster,系統會改為傳回下列健康狀態檢查防火牆規則。

    k8s2-rkdld6go-l4-shared-hc-fw  default  INGRESS  1000  tcp:10256  False
    

    如要進一步瞭解為 GKE 服務產生的防火牆規則,請參閱「自動建立的防火牆規則」一文。

更新現有 GKE 叢集,停用虛擬私有雲防火牆規則建立功能

停用虛擬私有雲防火牆規則建立功能前,請注意下列更新現有叢集的相關事項:

  • 更新現有叢集以停用虛擬私有雲防火牆規則建立功能時,GKE 不會刪除任何 GKE 為 LoadBalancer Service 自動建立的現有防火牆規則。
  • GKE 會停止更新現有規則,也不會為新的 LoadBalancer Service 建立規則。
  • 如要重新啟用虛擬私有雲防火牆規則建立功能,請搭配 gcloud_name container clusters update 指令使用 --enable-l4-lb-firewall-reconciliation 標記。

如要停用現有叢集的自動防火牆規則建立功能,請按照下列步驟操作:

  1. 更新叢集,停用 LoadBalancer Service 的防火牆規則自動建立和管理功能:

    gcloud container clusters update CLUSTER_NAME \
    --disable-l4-lb-firewall-reconciliation \
    --cluster-version=supported_version
    

    更改下列內容:

    • CLUSTER_NAME:新叢集的名稱。
    • VERSION:GKE 版本。
  2. 建立外部或內部 LoadBalancer 服務:

  3. 確認 GKE 不會為 LoadBalancer 服務建立允許輸入的防火牆規則。(系統自動建立的允許輸入防火牆規則會採用以下格式的名稱:k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash])。

    下列指令會傳回包含 k8s2 的防火牆規則清單:

    gcloud compute firewall-rules list --format="value(name)" | grep "k8s2"
    

    如果 externalTrafficPolicy 參數設為 Local,回應應只傳回 k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash]-fw 形式的健康狀態檢查防火牆規則。並使用 spec.healthCheckNodePort 參數定義的 TCP 連接埠。如果未指定,Kubernetes 控制層會從節點埠範圍指派健康狀態檢查埠。

    k8s2-rkdld6go-default-ilb-svc-dluvsefq-fw  default  INGRESS  1000  tcp:30868  False
    

    如果 externalTrafficPolicy 參數設為 Cluster,系統會改為傳回下列健康狀態檢查防火牆規則。

    k8s2-rkdld6go-l4-shared-hc-fw  default  INGRESS  1000  tcp:10256  False
    

    如要進一步瞭解為 GKE 服務產生的防火牆規則,請參閱「自動建立的防火牆規則」一文。

排解連線問題

下列範例說明如何使用 Network Intelligence Center 連線測試,測試與外部 LoadBalancer 服務的連線:叢集:

  • Network Intelligence Center:

    1. 在 Google Cloud 控制台中,前往 Network Intelligence Center 並啟動新的連線測試。
    2. 從下拉式選單中選擇「任何外部公用 IP 位址」做為來源,並從目的地選取負載平衡器。
    3. 重新執行連線能力測試。
  • gcloud CLI:

    下列範例指令會建立並執行測試,來源為本機工作站的公開 IP 位址,目的地為外部負載平衡器的外部 IP 位址:

    gcloud network-management connectivity-tests create TEST_NAME \
    --source-ip-address=SOURCE_IP_ADDRESS \
    --source-network-type=NON_GCP_NETWORK \
    --destination-ip-address=$(kubectl get svc LOADBALANCER_NAME -o jsonpath='{.status.loadBalancer.ingress[0].ip}') \
    --destination-port=$(kubectl get svc LOADBALANCER_NAME -o jsonpath='{.spec.ports[0].targetPort}') \
    --destination-network=projects/PROJECT_ID/global/networks/NETWORK_NAME
    

    更改下列內容:

    • TEST_NAME:連線測試的名稱。
    • SOURCE_IP_ADDRESS:需要連線至外部 LoadBalancer 服務的系統 IP 位址。例如
    • LOADBALANCER_NAME:外部 LoadBalancer 服務的名稱。
    • PROJECT_ID:包含叢集 VPC 網路的專案 ID。如果叢集使用共用虛擬私有雲網路,請使用主專案的專案 ID。
    • NETWORK_NAME:叢集 VPC 網路的名稱。

    查看測試結果:

    gcloud network-management connectivity-tests describe TEST_NAME
    

後續步驟