瞭解健康狀態檢查

Cloud Service Mesh 會使用健康狀態檢查判斷工作負載的健康狀態,並據此轉送流量。本頁說明 Cloud Service Mesh 的健康狀態檢查運作方式,以及如何管理必要的防火牆規則。

關於健康狀態檢查

在服務網格中,控制層需要瞭解工作負載 (Pod) 的健康狀態,確保流量只會轉送至健康狀態良好的端點。

  • 代管 Cloud Service Mesh (TRAFFIC_DIRECTOR 控制層實作):Cloud Service Mesh 會使用 Google Cloud 的集中式健康狀態檢查基礎架構執行健康狀態檢查。這項基礎架構位於叢集外部,會將健康狀態檢查探測傳送至叢集節點。此外,我們會在 kube-system 命名空間中安裝名為 snk 的 DaemonSet,攔截通訊埠 7877 上的所有流量,並顯示所有工作負載的健康狀態。
  • Istiod 控制層:健康狀態檢查是在叢集內使用 Kubernetes 機制完成。

代管健康狀態檢查的防火牆規則

如要允許 Managed Cloud Service Mesh 的外部健康狀態檢查探測連線至 GKE 節點,必須有適當的防火牆規則。

防火牆規則規格

如要使用 Cloud Service Mesh,機群中的每個代管 Cloud Service Mesh 叢集,都需要虛擬私有雲網路專案中的防火牆規則。這些規則允許來自 Google 健康狀態檢查探測器的輸入流量,傳輸至 GKE 叢集節點上的專用健康狀態檢查通訊埠:

  • 「Source Ranges」(來源範圍)35.191.0.0/16130.211.0.0/22
  • 「Allowed Protocols/Ports」(允許的通訊協定/通訊埠)tcp:7877

我是否需要採取行動?

您是否需要手動設定權限或防火牆規則,取決於虛擬私有雲網路相對於機群和 GKE 叢集專案的位置:

  • 虛擬私有雲網路位於機群專案中 => 不需要採取任何行動。系統會自動授予 Cloud Service Mesh 服務代理人 roles/anthosservicemesh.serviceAgent,其中包含這些權限。

  • 虛擬私有雲網路位於 GKE 叢集專案中 => 不需要採取任何行動。您在啟用期間授予了 roles/anthosservicemesh.serviceAgent 給 Cloud Service Mesh 服務代理人。

  • 虛擬私有雲網路位於獨立主專案 (例如 Shared VPC 主專案),既不是機群專案也不是叢集專案 => 敬請採取行動。您必須授予服務代理人權限,才能管理該專案中的防火牆規則。

為協助您在下列操作說明中識別這些專案,請注意下列角色:

  • 機群專案:註冊 GKE 叢集的專案。 Cloud Service Mesh 服務代理人位於此處。
  • 虛擬私有雲網路專案:包含連線至 GKE 叢集的虛擬私有雲網路的專案 (如果您使用 Shared VPC,這就是主專案)。
  • 叢集專案:GKE 叢集所在的專案。

系統代管防火牆規則

根據預設,Cloud Service Mesh 會自動建立及管理健康狀態檢查所需的防火牆規則。系統會在新手上路期間為每個叢集建立一項規則,並在解除安裝時刪除該規則。

所需權限

如要管理系統管理的防火牆規則,Cloud Service Mesh 服務代理必須在虛擬私有雲網路專案中具備下列權限:

  • compute.firewalls.get (檢查防火牆規則是否已存在)
  • compute.firewalls.create (建立防火牆規則,如果不存在的話)
  • compute.firewalls.update (如果防火牆規則已修改,可將其還原為預期設定)
  • compute.firewalls.delete (在停用服務時刪除防火牆規則)
  • compute.networks.updatePolicy (兩層授權檢查的一部分,用於在虛擬私有雲網路上附加、修改或移除防火牆規則)

車隊或叢集專案中的虛擬私有雲網路 (自動)

如果虛擬私有雲網路位於機群專案或 GKE 叢集專案中,則不需要採取任何行動。Cloud Service Mesh 服務代理會自動取得管理防火牆規則的必要權限。

位於不同專案的虛擬私有雲網路 (例如 Shared VPC)

如果虛擬私有雲網路位於其他專案,機群專案中的服務代理預設沒有權限管理該專案中的資源。您必須授予服務代理程式管理 VPC 網路專案中防火牆規則的權限。

授予這些權限的方法有兩種:

方法 1:授予範圍較小的防火牆權限 (最佳做法)

如要讓 Google 管理防火牆規則,但想限制授予虛擬私有雲網路專案服務代理程式的權限,可以建立僅具備必要防火牆權限的自訂 IAM 角色。

  1. 在虛擬私有雲網路專案中,建立具有必要防火牆權限的自訂 IAM 角色:

    gcloud iam roles create LIMITED_IAM_ROLE_NAME \
        --project=NETWORK_PROJECT_ID \
        --title="Service Mesh Firewall Role" \
        --permissions="compute.firewalls.get,compute.firewalls.create,compute.firewalls.update,compute.firewalls.delete,compute.networks.updatePolicy" \
        --stage="GA"
    
  2. 將 VPC 網路專案中的角色授予車隊專案的 Cloud Service Mesh 服務帳戶:

    gcloud projects add-iam-policy-binding NETWORK_PROJECT_ID \
        --member "serviceAccount:service-FLEET_PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com" \
        --role "projects/NETWORK_PROJECT_ID/roles/LIMITED_IAM_ROLE_NAME"
    

    替換預留位置:

    • NETWORK_PROJECT_ID:虛擬私有雲網路專案的 ID。
    • FLEET_PROJECT_NUMBER:車隊專案的專案編號。
    • LIMITED_IAM_ROLE_NAME:您要為自訂角色指定的名稱。
選項 2:授予 Service Mesh 服務代理人角色 (最簡單)

最簡單的方法是將現有的 Service Mesh 服務代理程式角色 (roles/anthosservicemesh.serviceAgent) 授予車隊專案的服務帳戶。

  1. 將 VPC 網路專案中的角色授予車隊專案的 Cloud Service Mesh 服務帳戶:

    gcloud projects add-iam-policy-binding NETWORK_PROJECT_ID \
        --member "serviceAccount:service-FLEET_PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com" \
        --role roles/anthosservicemesh.serviceAgent
    

    替換預留位置:

    • NETWORK_PROJECT_ID:虛擬私有雲網路專案的 ID。
    • FLEET_PROJECT_NUMBER:車隊專案的專案編號。

使用者管理的防火牆規則

如果您不想在 VPC 網路專案中授予 Cloud Service Mesh 服務代理任何寫入權限 (createupdatedelete),可以自行預先建立防火牆規則,並只授予 Google 讀取 (get) 權限。

如果防火牆規則已存在且符合必要規格,Cloud Service Mesh 會直接使用,不會嘗試修改。

步驟 1:建立防火牆規則

尋找 SHORT_CLUSTER_ID

gcloud container clusters describe CLUSTER_NAME \
    --location=LOCATION \
    --project=CLUSTER_PROJECT_ID \
    --format="value(id)" | cut -c1-8

使用下列範本建立防火牆規則:

gcloud compute firewall-rules create gke-csm-thc-SHORT_CLUSTER_ID \
    --project=NETWORK_PROJECT_ID \
    --network=NETWORK_NAME \
    --description="Firewall rule for service mesh health checks" \
    --direction=INGRESS \
    --action=ALLOW \
    --rules=tcp:7877 \
    --source-ranges="35.191.0.0/16,130.211.0.0/22" \
    --target-tags=gke-CLUSTER_NAME-SHORT_CLUSTER_ID-node

替換預留位置:

  • SHORT_CLUSTER_ID:您在上一個步驟中找到的 GKE 叢集 ID 前 8 個字元。
  • NETWORK_PROJECT_IDNETWORK_NAME:專案 (虛擬私有雲網路專案) 和虛擬私有雲網路的名稱。
  • CLUSTER_NAME:GKE 叢集名稱。

針對機群中的每個代管 Cloud Service Mesh 叢集,重複執行步驟 1。

步驟 2:授予 Google 唯讀權限

compute.firewalls.get 權限授予 Cloud Service Mesh 服務代理程式。

  1. 在虛擬私有雲網路專案中,建立僅具備 get 權限的自訂角色:

    gcloud iam roles create READONLY_IAM_ROLE_NAME \
        --project=NETWORK_PROJECT_ID \
        --title="Service Mesh Firewall Read-Only Role" \
        --permissions="compute.firewalls.get" \
        --stage="GA"
    
  2. 將角色授予 Cloud Service Mesh 服務代理程式:

    gcloud projects add-iam-policy-binding NETWORK_PROJECT_ID \
        --member "serviceAccount:service-FLEET_PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com" \
        --role "projects/NETWORK_PROJECT_ID/roles/READONLY_IAM_ROLE_NAME"
    

在刪除叢集時,或從 Cloud Service Mesh 停用叢集時,刪除防火牆規則

如果您是手動建立防火牆規則 (使用者管理的防火牆規則),刪除叢集或從服務網格中移除時,Cloud Service Mesh 無法自動刪除這些規則。您必須手動刪除防火牆規則,以免留下未使用的資源。

如要刪除防火牆規則,請按照下列步驟操作:

gcloud compute firewall-rules delete gke-csm-thc-SHORT_CLUSTER_ID \
    --project=NETWORK_PROJECT_ID