設定使用 Shared VPC 的叢集

本指南說明如何在不同專案中建立兩個使用Shared VPC 的 Google Kubernetes Engine (GKE) 叢集。如要瞭解 GKE 網路的一般資訊,請參閱「網路總覽」。

本指南中的範例會設定雙層網頁應用程式的基礎架構,如「Shared VPC 總覽」一文所述。

為何要將 Shared VPC 與 GKE 搭配使用

使用 Shared VPC 時,您可以將一個專案指定為主專案,並將其他專案 (稱為服務專案) 附加至主專案。您會在主專案中建立網路、子網路、次要位址範圍、防火牆規則與其他網路資源。接著再與服務專案共用所選的子網路,其中包含次要範圍。在服務專案中執行的元件可透過共用虛擬私有雲,與在其他服務專案中執行的元件通訊。

您可以將 Shared VPC 與 Autopilot 叢集,以及區域和區域 Standard 叢集搭配使用。

使用 Shared VPC 的標準叢集無法使用舊網路,且必須啟用虛擬私有雲原生流量轉送。Autopilot 叢集一律會啟用虛擬私有雲原生流量轉送功能。

建立新叢集時,您可以設定 Shared VPC。GKE 不支援將現有叢集轉換為 Shared VPC 模型。

使用 Shared VPC 時,會受到特定配額和限制。例如,專案內的網路數量是有配額的,可附加到主專案的服務專案數量也有限制。詳情請參閱配額與限制。

事前準備

開始使用 Shared VPC 設定叢集前,請先完成下列事項:

執行本指南中的練習前,請先完成下列事項:

  • 選擇其中一個專案做為主專案。
  • 選擇兩個專案做為服務專案。

每個專案都有各自的名稱、ID 和號碼。在某些情況下,名稱和 ID 相同。本指南使用下列易記名稱和預留位置來參照專案:

好記的名稱 專案 ID
預留位置
專案編號
預留位置
主專案 HOST_PROJECT_ID HOST_PROJECT_NUM
第一個服務專案 SERVICE_PROJECT_1_ID SERVICE_PROJECT_1_NUM
第二個服務專案 SERVICE_PROJECT_2_ID SERVICE_PROJECT_2_NUM

找出專案 ID 和編號

您可以使用 gcloud CLI 或 Cloud de Confiance 控制台,找出專案 ID 和編號。

控制台

  1. 前往 Cloud de Confiance 控制台的「首頁」。

    前往首頁

  2. 在專案挑選器中,選取您選擇做為主專案的專案。

  3. 您可以在「Project info」(專案資訊) 底下看到專案名稱、專案 ID 和專案號碼。記下 ID 和號碼供稍後使用。

  4. 在選為服務專案的每個專案上,執行相同的步驟。

gcloud

使用下列指令列出專案:

gcloud projects list

輸出結果會顯示專案名稱、ID 和號碼。記下 ID 和號碼供稍後使用。

PROJECT_ID        NAME        PROJECT_NUMBER
host-123          host        1027xxxxxxxx
srv-1-456         srv-1       4964xxxxxxxx
srv-2-789         srv-2       4559xxxxxxxx

在專案中啟用 GKE API

繼續本指南的練習前,請先確認所有三個專案都已啟用 GKE API。在專案中啟用 API 時,系統會為該專案建立 GKE 服務代理。如要執行本指南中的其餘工作,每個專案都必須有 GKE 服務代理程式。

您可以使用 Cloud de Confiance 控制台或 Google Cloud CLI 啟用 GKE API。

控制台

  1. 前往 Cloud de Confiance 控制台的「Kubernetes Engine API」頁面:

    前往 Kubernetes Engine API 頁面

  2. 選取專案。

  3. 如果頁面標題顯示「已啟用 API」,表示 GKE API 已啟用。如果沒有看到「已啟用 API」,請點選「啟用」按鈕。

  4. 針對您選擇做為服務專案的每個專案,重複執行上述步驟。每項作業可能需要一段時間才能完成。

gcloud

為這三個專案啟用 GKE API。每項作業可能需要一段時間才能完成:

gcloud services enable container.googleapis.com --project HOST_PROJECT_ID
gcloud services enable container.googleapis.com --project SERVICE_PROJECT_1_ID
gcloud services enable container.googleapis.com --project SERVICE_PROJECT_2_ID

建立網路和兩個子網路

在本節中,您將執行下列工作:

  1. 在主專案中,建立名為 shared-net 的網路。
  2. 建立名為 tier-1 和 tier-2 的兩個子網路。
  3. 為每個子網路建立兩個次要位址範圍:一個用於 Service,另一個用於 Pod。

控制台

  1. 前往 Cloud de Confiance 控制台的「VPC networks」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  2. 在專案挑選器中,選取主專案。

  3. 按一下 「建立虛擬私有雲網路」。

  4. 在「Name」(名稱) 中輸入 shared-net。

  5. 在「Subnet creation mode」(子網路建立模式) 底下選取 [Custom] (自訂)。

新增「tier-1」

  1. 在「New subnet」(新的子網路) 方塊的「Subnets」(子網路) 下方,為「Name」(名稱) 輸入 tier-1。
  2. 在「區域」中選取區域。
  3. 在「IP stack type」(IP 堆疊類型),選取「IPv4 (single-stack)」(IPv4 (單一堆疊))。
  4. 在「IPv4 range」(IPv4 範圍) 中,輸入 10.0.4.0/22 做為子網路的主要位址範圍。
  5. 按一下「新增次要 IPv4 範圍」。

    • 在「Subnet range name」(子網路範圍名稱) 中輸入 tier-1-services。
    • 在「次要 IPv4 範圍」中,輸入 10.0.32.0/20。
  6. 按一下「完成」。

  7. 按一下「新增次要 IPv4 範圍」。

    • 在「Subnet range name」(子網路範圍名稱) 中輸入 tier-1-pods。
    • 在「次要 IPv4 範圍」中,輸入 10.4.0.0/14。
  8. 按一下「完成」。

新增「tier-2」

  1. 按一下 [新增子網路]。
  2. 在「Name」(名稱) 中輸入 tier-2。
  3. 在「Region」(區域),選取與先前子網路相同的區域。
  4. 在「IPv4 range」(IPv4 範圍) 中,輸入 172.16.4.0/22 做為子網路的主要位址範圍。
  5. 按一下「新增次要 IPv4 範圍」。

    • 在「Subnet range name」(子網路範圍名稱) 中輸入 tier-2-services。
    • 在「次要 IPv4 範圍」中,輸入 172.16.16.0/20。
  6. 按一下「完成」。

  7. 按一下「新增次要 IPv4 範圍」。

    • 在「Subnet range name」(子網路範圍名稱) 中輸入 tier-2-pods。
    • 在「次要 IPv4 範圍」中,輸入 172.20.0.0/14。
  8. 按一下「完成」。

  9. 前往頁面底部,然後按一下「建立」。

gcloud

在主機專案中,建立名為 shared-net 的網路:

gcloud compute networks create shared-net \
    --subnet-mode custom \
    --project HOST_PROJECT_ID

在新網路中,建立名為 tier-1 的子網路:

gcloud compute networks subnets create tier-1 \
    --project HOST_PROJECT_ID \
    --network shared-net \
    --range 10.0.4.0/22 \
    --region COMPUTE_REGION \
    --secondary-range tier-1-services=10.0.32.0/20,tier-1-pods=10.4.0.0/14

建立另一個名為 tier-2 的子網路:

gcloud compute networks subnets create tier-2 \
    --project HOST_PROJECT_ID \
    --network shared-net \
    --range 172.16.4.0/22 \
    --region COMPUTE_REGION \
    --secondary-range tier-2-services=172.16.16.0/20,tier-2-pods=172.20.0.0/14

將 COMPUTE_REGION 替換為 Compute Engine 區域。

判斷服務專案中服務代理程式的名稱

您有兩個服務專案,每個專案都有多個服務帳戶。在接下來的章節中,您將在這些服務專案中,與 Google 管理的服務帳戶 (稱為「服務代理」) 互動。下一節會用到這些服務代理程式的名稱。

下表列出兩個服務專案中的 GKE 和 Google API 服務代理程式名稱:

服務代理類型 服務代理名稱
GKE service-SERVICE_PROJECT_1_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com
service-SERVICE_PROJECT_2_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com
Google API SERVICE_PROJECT_1_NUM@cloudservices.s3ns-system.iam.gserviceaccount.com
SERVICE_PROJECT_2_NUM@cloudservices.s3ns-system.iam.gserviceaccount.com

啟用共用虛擬私有雲並授予角色

如要執行本節中的工作,您必須是 Shared VPC 管理員。如果您不是 Shared VPC 管理員,請組織管理員授予您組織或一或多個資料夾的 Compute Shared VPC 管理員 (compute.xpnAdmin) 和專案 IAM 管理員 (resourcemanager.projectIamAdmin) 角色。

在本節中,您將執行下列工作:

  1. 在您的 Host 專案中啟用 Shared VPC。
  2. 將兩個服務專案附加至主專案。
  3. 請移除或授予服務專案所屬服務代理 Compute Network User 角色。如果您使用Cloud de Confiance 控制台,請移除角色;如果您使用 gcloud CLI,請授予角色。

控制台

  1. 前往 Cloud de Confiance 控制台的「共用 VPC」頁面。

    前往 Shared VPC

  2. 在專案挑選器中,選取主專案。

  3. 按一下「設定 Shared VPC」。系統會顯示「啟用主專案」畫面。

  4. 按一下「啟用並繼續」。系統會顯示「附加服務專案並選取主體」部分。

  5. 在「Kubernetes Engine access」(Kubernetes Engine 存取權) 下方,選取「Enabled」(已啟用)。

  6. 在「選取要附加的專案」下方,按一下「新增項目」圖示 。

  7. 在「選取專案」欄位中,按一下「選取」,然後選擇第一個服務專案。

  8. 再次按一下「新增項目」,然後選取第二個服務專案。

  9. 按一下「繼續」。系統會顯示「授予存取權」部分。

  10. 在「存取模式」下方,選取「個別子網路存取權」。

  11. 在「具備個別子網路存取權的子網路」下方,捲動瀏覽清單並選取「tier-1」和「tier-2」。

  12. 按一下 [儲存]。新頁面會隨即顯示。

  13. 選取「僅顯示有個別 IAM 政策的子網路」。

從「tier-1」中移除服務代理

  1. 在「個別子網路存取權」下方,選取「tier-1」,然後點選「顯示權限面板」。
  2. 在「角色/主體」下方的「權限面板」中,展開「Compute 網路使用者」。
  3. 搜尋 SERVICE_PROJECT_2_NUM。
  4. 刪除第二個服務專案的所有服務代理程式。也就是刪除含有 SERVICE_PROJECT_2_NUM 的服務代理程式。
  5. 確認第一個服務專案的下列服務代理程式是否在清單中,且具備「Compute Network User」角色:

    • service-SERVICE_PROJECT_1_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com
    • SERVICE_PROJECT_1_NUM@cloudservices.s3ns-system.iam.gserviceaccount.com
    • SERVICE_PROJECT_1_NUM-compute@developer.s3ns.iam.gserviceaccount.com

    如果清單中沒有服務代理,請按照下列步驟新增:

    1. 按一下「新增主體」。
    2. 在「New principals」(新增主體) 欄位中,輸入服務代理名稱。
    3. 在「指派角色」下方,選取「Compute Network User」。
    4. 按一下 [儲存]。
  6. 在「個別子網路存取權」下方,取消勾選「tier-1」核取方塊。

從「tier-2」中移除服務代理

  1. 在「個別子網路存取權」下方,選取「第 2 層」。
  2. 在「角色/主體」下方的「權限面板」中,展開「Compute 網路使用者」。
  3. 搜尋 SERVICE_PROJECT_1_NUM。
  4. 刪除屬於第一個服務專案的所有服務代理程式。也就是刪除含有 SERVICE_PROJECT_1_NUM 的所有服務代理。
  5. 確認第二個服務專案的下列服務代理程式是否在清單中,且具備「Compute Network User」(Compute 網路使用者) 角色:

    • service-SERVICE_PROJECT_2_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com
    • SERVICE_PROJECT_2_NUM@cloudservices.s3ns-system.iam.gserviceaccount.com
    • SERVICE_PROJECT_2_NUM-compute@developer.s3ns.iam.gserviceaccount.com

    如果清單中沒有服務代理,請按照下列步驟新增:

    1. 按一下「新增主體」。
    2. 在「New principals」(新增主體) 欄位中輸入服務代理人名稱。
    3. 在「指派角色」下方,選取「Compute Network User」。
    4. 按一下 [儲存]。

gcloud

  1. 在主專案中啟用 Shared VPC。使用的指令取決於您擁有的必要管理員角色。

    如果您具備機構層級的 Shared VPC 管理員角色:

    gcloud compute shared-vpc enable HOST_PROJECT_ID
    

    如果您在資料夾層級擁有 Shared VPC 管理員角色:

    gcloud beta compute shared-vpc enable HOST_PROJECT_ID
    
  2. 將第一個服務專案附加到主專案:

    gcloud compute shared-vpc associated-projects add SERVICE_PROJECT_1_ID \
        --host-project HOST_PROJECT_ID
    
  3. 將第二個服務專案附加到主專案:

    gcloud compute shared-vpc associated-projects add SERVICE_PROJECT_2_ID \
        --host-project HOST_PROJECT_ID
    
  4. 取得 tier-1 子網路的 IAM 政策:

    gcloud compute networks subnets get-iam-policy tier-1 \
       --project HOST_PROJECT_ID \
       --region COMPUTE_REGION
    

    輸出結果含有一個 etag 欄位,請記下 etag 的值。

  5. 建立名為 tier-1-policy.yaml 的檔案,並加入以下內容:

    bindings:
    - members:
      - serviceAccount:SERVICE_PROJECT_1_NUM@cloudservices.s3ns-system.iam.gserviceaccount.com
      - serviceAccount:service-SERVICE_PROJECT_1_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com
      role: roles/compute.networkUser
    etag: ETAG_STRING
    

    將 ETAG_STRING 替換為先前記下的 etag 值。

  6. 為 tier-1 子網路設定 IAM 政策:

    gcloud compute networks subnets set-iam-policy tier-1 \
        tier-1-policy.yaml \
        --project HOST_PROJECT_ID \
        --region COMPUTE_REGION
    
  7. 取得 tier-2 子網路的 IAM 政策:

    gcloud compute networks subnets get-iam-policy tier-2 \
        --project HOST_PROJECT_ID \
        --region COMPUTE_REGION
    

    輸出結果含有一個 etag 欄位,請記下 etag 的值。

  8. 建立名為 tier-2-policy.yaml 的檔案,並加入以下內容:

    bindings:
    - members:
      - serviceAccount:SERVICE_PROJECT_2_NUM@cloudservices.s3ns-system.iam.gserviceaccount.com
      - serviceAccount:service-SERVICE_PROJECT_2_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com
      role: roles/compute.networkUser
    etag: ETAG_STRING
    

    將 ETAG_STRING 替換為先前記下的 etag 值。

  9. 為 tier-2 子網路設定 IAM 政策:

    gcloud compute networks subnets set-iam-policy tier-2 \
        tier-2-policy.yaml \
        --project HOST_PROJECT_ID \
        --region COMPUTE_REGION
    

管理防火牆資源

如要讓服務專案中的 GKE 叢集在主專案中建立及管理防火牆資源,必須授予服務專案的 GKE 服務代理適當的 IAM 權限。如要授予這些權限,請使用下列任一策略:

控制台

  1. 前往 Cloud de Confiance 控制台的「IAM」(身分與存取權管理) 頁面。

    前往 IAM

  2. 選取主專案。

  3. 按一下 「授予存取權」,然後輸入服務專案的 GKE 服務代理主體 service-SERVICE_PROJECT_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com。

  4. 從下拉式清單中選取 Compute Security Admin 角色。

  5. 按一下 [儲存]。

gcloud

在主專案中,將 Compute Security Admin 角色授予服務專案的 GKE 服務代理:

gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
    --member=serviceAccount:service-SERVICE_PROJECT_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com \
    --role=roles/compute.securityAdmin

更改下列內容:

  • HOST_PROJECT_ID:Shared VPC 主機專案 ID
  • SERVICE_PROJECT_NUM:包含 GKE 服務代理的服務專案 ID
  • 如要採取更精細的做法,請建立自訂 IAM 角色,只包含下列權限:compute.networks.updatePolicy、compute.firewalls.list、compute.firewalls.get、compute.firewalls.create、compute.firewalls.update 和 compute.firewalls.delete。將該自訂角色授予主專案的服務專案 GKE 服務代理。

控制台

在主專案中建立自訂角色,並授予先前提及的 IAM 權限:

  1. 前往 Cloud de Confiance 控制台的「Roles」(角色) 頁面。

    前往「Roles」(角色) 頁面

  2. 使用頁面頂端的下拉式清單,選取主專案。

  3. 按一下「建立角色」。

  4. 輸入角色的「標題」、「說明」、「ID」和「角色推出階段」。角色建立後即無法變更名稱。

  5. 按一下 [Add Permissions] (新增權限)。

  6. 篩選 compute.networks,然後選取先前提及的 IAM 權限。

  7. 選取所有必要權限後,按一下「新增」。

  8. 點選「建立」。

在主專案中,將新建立的自訂角色授予服務專案的 GKE 服務代理:

  1. 前往 Cloud de Confiance 控制台的「IAM」(身分與存取權管理) 頁面。

    前往 IAM

  2. 選取主專案。

  3. 按一下「授予存取權」,然後輸入服務專案的 GKE 服務代理主體 service-SERVICE_PROJECT_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com。

  4. 篩選新建立的自訂角色「名稱」,然後選取該角色。

  5. 按一下 [儲存]。

gcloud

  1. 在主專案中建立自訂角色,並授予先前提及的 IAM 權限:

    gcloud iam roles create ROLE_ID \
        --title="ROLE_TITLE" \
        --description="ROLE_DESCRIPTION" \
        --stage=LAUNCH_STAGE \
        --permissions=compute.networks.updatePolicy,compute.firewalls.list,compute.firewalls.get,compute.firewalls.create,compute.firewalls.update,compute.firewalls.delete \
        --project=HOST_PROJECT_ID
    
  2. 在主專案中,將新建立的自訂角色授予服務專案的 GKE 服務代理:

    gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
        --member=serviceAccount:service-SERVICE_PROJECT_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com \
        --role=projects/HOST_PROJECT_ID/roles/ROLE_ID
    

    更改下列內容:

    • ROLE_ID:角色名稱,例如 gkeFirewallAdmin
    • ROLE_TITLE:角色名稱,例如 GKE Firewall Admin
    • ROLE_DESCRIPTION:角色的簡短說明,例如 GKE service agent FW permissions
    • LAUNCH_STAGE:角色生命週期的發布階段,例如 ALPHA、BETA 或 GA
    • HOST_PROJECT_ID:Shared VPC 主機專案 ID
    • SERVICE_PROJECT_NUM:包含 GKE 服務代理的服務專案 ID

如果多個服務專案都有叢集,您必須選擇其中一種策略,並為每個服務專案的 GKE 服務代理程式重複執行。

子網路上獲授予的角色摘要

以下是子網路上授予的角色摘要:

服務代理人 角色 子網路
service-SERVICE_PROJECT_1_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com Compute 網路使用者 tier-1
SERVICE_PROJECT_1_NUM@cloudservices.s3ns-system.iam.gserviceaccount.com Compute 網路使用者 tier-1
service-SERVICE_PROJECT_2_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com Compute 網路使用者 tier-2
SERVICE_PROJECT_2_NUM@cloudservices.s3ns-system.iam.gserviceaccount.com Compute 網路使用者 tier-2

驗證 GKE 存取權

附加服務專案時,啟用 GKE 存取權會授予服務專案的 GKE 服務代理權限,以便在主專案中執行網路管理作業。

啟用 GKE 存取權時,GKE 會在主機專案中自動指派下列角色:

成員 角色 資源
service-SERVICE_PROJECT_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com 託管服務代理程式使用者 主專案中的 GKE 服務代理

不過,您必須手動將 Compute Network User IAM 權限新增至服務專案的 GKE 服務代理,才能存取主機網路。

成員 角色 資源
service-SERVICE_PROJECT_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com Compute 網路使用者 特定子網路或整個主專案

如果附加服務專案時未啟用 GKE 存取權,假設主專案和服務專案都已啟用 GKE API,您可以在主專案中新增下列 IAM 角色繫結,手動將權限指派給服務專案的 GKE 服務代理程式:

成員 角色 資源
service-SERVICE_PROJECT_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com Compute 網路使用者 特定子網路或整個主專案
service-SERVICE_PROJECT_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com 託管服務代理程式使用者 主專案中的 GKE 服務代理

授予主機服務代理使用者角色

每個服務專案的 GKE 服務代理程式都必須在主專案中,繫結「託管服務代理程式使用者」(roles/container.hostServiceAgentUser) 角色。GKE 服務代理的格式如下:

service-SERVICE_PROJECT_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com

其中 SERVICE_PROJECT_NUM 是服務專案的專案編號。

這項繫結可讓服務專案的 GKE 服務代理在主專案中執行網路管理作業,就像主專案的 GKE 服務代理一樣。這個角色只能授予服務專案的 GKE 服務代理。

控制台

如果您一直使用 Cloud de Confiance 控制台,則不必明確授予主機服務代理使用者角色。使用 Cloud de Confiance 控制台將服務專案附加至主專案時,系統會自動執行這項操作。

gcloud

  1. 如果是第一個專案,請將「託管服務代理程式使用者」角色授予專案的 GKE 服務代理程式。這項角色是在主專案中授予:

    gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
        --member serviceAccount:service-SERVICE_PROJECT_1_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com \
        --role roles/container.hostServiceAgentUser
    
  2. 在第二個專案中,將「託管服務代理程式使用者」角色授予專案的 GKE 服務代理程式。這項角色是在主專案中授予:

    gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
        --member serviceAccount:service-SERVICE_PROJECT_2_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com \
        --role roles/container.hostServiceAgentUser
    

確認可用的子網路和次要 IP 位址範圍

建立叢集時,您必須指定子網路和次要 IP 位址範圍,供叢集的 Pod 和 Service 使用。IP 位址範圍無法使用的原因有很多,無論是使用 Cloud de Confiance 控制台或 gcloud CLI 建立叢集,都應指定可用的 IP 位址範圍。

如果 IP 位址範圍尚未在使用中,即可用於新叢集的服務。為新叢集 Pod 指定的 IP 位址範圍可以是未使用的範圍,也可以是與其他叢集 Pod 共用的範圍。叢集無法使用 GKE 建立及管理的 IP 位址範圍。

您可以使用 gcloud CLI 列出專案中可用的子網路和次要 IP 位址範圍。

gcloud

gcloud container subnets list-usable \
    --project SERVICE_PROJECT_ID \
    --network-project HOST_PROJECT_ID

將 SERVICE_PROJECT_ID 替換為服務專案的專案 ID。

如果省略 --project 或 --network-project 選項,gcloud CLI 指令會使用有效設定中的預設專案。由於主機專案和網路專案不同,您必須指定 --project 和/或 --network-project。

輸出結果會與下列內容相似:

PROJECT               REGION    NETWORK     SUBNET  RANGE
example-host-project  us-west1  shared-net  tier-1  10.0.4.0/22
┌──────────────────────┬───────────────┬─────────────────────────────┐
│ SECONDARY_RANGE_NAME │ IP_CIDR_RANGE │            STATUS           │
├──────────────────────┼───────────────┼─────────────────────────────┤
│ tier-1-services      │ 10.0.32.0/20  │ usable for pods or services │
│ tier-1-pods          │ 10.4.0.0/14   │ usable for pods or services │
└──────────────────────┴───────────────┴─────────────────────────────┘
example-host-project  us-west1  shared-net  tier-2  172.16.4.0/22
┌──────────────────────┬────────────────┬─────────────────────────────┐
│ SECONDARY_RANGE_NAME │ IP_CIDR_RANGE  │            STATUS           │
├──────────────────────┼────────────────┼─────────────────────────────┤
│ tier-2-services      │ 172.16.16.0/20 │ usable for pods or services │
│ tier-2-pods          │ 172.20.0.0/14  │ usable for pods or services │
└──────────────────────┴────────────────┴─────────────────────────────┘

在下列情況中,list-usable 指令會傳回空白清單:

  • 服務專案的 GKE 服務代理程式不具備主專案的「託管服務代理程式使用者」角色。
  • 主專案中的 GKE 服務代理不存在 (例如您不小心刪除了該代理)。
  • 主專案未啟用 GKE API,表示主專案缺少 GKE 服務代理。

詳情請參閱「疑難排解」一節。

次要 IP 位址範圍限制

您可以在指定的子網路中建立 30 個次要範圍。每個叢集都需要兩個次要範圍:一個用於 Pod,另一個用於 Service。

在第一個服務專案中建立叢集

如要在第一個服務專案中建立叢集,請使用 gcloud CLI 或 Cloud de Confiance 控制台執行下列步驟。

控制台

  1. 前往 Cloud de Confiance 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 在專案挑選器中,選取第一個服務專案。

  3. 按一下 「建立」。

  4. 在 Autopilot 或 Standard 區段中,按一下「Configure」(設定)。

  5. 在「Name」(名稱) 中輸入 tier-1-cluster。

  6. 在「Region」(區域) 下拉式清單中,選取您用於子網路的相同區域。

  7. 按一下導覽窗格中的「Networking」(網路)。

  8. 在「叢集網路」下方,按一下「與我共用的網路」。

  9. 在「Network」(網路) 欄位中,選取「shared-net」(共用網路)。

  10. 在「Node subnet」(節點子網路) 中選取 [tier-1]。

  11. 在「進階網路選項」下方,選取「Pod 次要 CIDR 範圍」的「tier-1-pods」。

  12. 將「服務次要 CIDR 範圍」設為「tier-1-services」。

  13. 點選「建立」。

如果您建立的是標準叢集,可以按照下列步驟,查看叢集的節點是否位於第 1 層子網路的主要位址範圍:

  1. 建立完成後,系統會顯示「叢集詳細資料」頁面。
  2. 按一下「Nodes」(節點) 分頁標籤。
  3. 在「Node Pools」(節點集區) 下方,按一下「default-pool」。
  4. 在「執行個體群組」下方,按一下要檢查的執行個體群組名稱。例如 gke-tier-1-cluster-default-pool-5c5add1f-grp。
  5. 在執行個體清單中,確認節點的內部 IP 位址位於第 1 層子網路的主要範圍:10.0.4.0/22。

gcloud

在第一個服務專案中建立名為 tier-1-cluster 的叢集:

gcloud container clusters create-auto tier-1-cluster \
    --project=SERVICE_PROJECT_1_ID \
    --location=CONTROL_PLANE_LOCATION \
    --network=projects/HOST_PROJECT_ID/global/networks/shared-net \
    --subnetwork=projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/tier-1 \
    --cluster-secondary-range-name=tier-1-pods \
    --services-secondary-range-name=tier-1-services

將 CONTROL_PLANE_LOCATION 替換為叢集控制層的 Compute Engine 區域。

建立完成後,請確認叢集節點位於第 1 層子網路的主要範圍:10.0.4.0/22。

gcloud compute instances list --project SERVICE_PROJECT_1_ID

輸出結果會顯示節點的內部 IP 位址:

NAME                    ZONE           ... INTERNAL_IP
gke-tier-1-cluster-...  ZONE_NAME      ... 10.0.4.2
gke-tier-1-cluster-...  ZONE_NAME      ... 10.0.4.3
gke-tier-1-cluster-...  ZONE_NAME      ... 10.0.4.4

在第二個服務專案中建立叢集

如要在第二個服務專案中建立叢集,請使用 gcloud CLI 或 Cloud de Confiance 控制台執行下列步驟。

控制台

  1. 前往 Cloud de Confiance 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 在專案挑選器中,選取第二個服務專案。

  3. 按一下 「建立」。

  4. 在「Standard」或「Autopilot」部分中,按一下「Configure」(設定)。

  5. 在「Name」(名稱) 中輸入 tier-2-cluster。

  6. 在「Region」(區域) 下拉式清單中,選取您用於子網路的相同區域。

  7. 按一下導覽窗格中的「Networking」(網路)。

  8. 在「叢集網路」下方,按一下「與我共用的網路」。

  9. 在「Network」(網路) 欄位中,選取「shared-net」(共用網路)。

  10. 在「Node subnet」(節點子網路) 中選取 [tier-2]。

  11. 在「進階網路選項」下方,針對「Pod 次要 CIDR 範圍」選取「tier-2-pods」。

  12. 將「服務次要 CIDR 範圍」設為「tier-2-services」。

  13. 點選「建立」。

如果您建立的是標準叢集,可以按照下列步驟,查看叢集的節點是否位於第 2 層子網路的主要位址範圍:

  1. 建立完成後,系統會顯示「叢集詳細資料」頁面。
  2. 按一下「Nodes」(節點) 分頁標籤。
  3. 在「Node Pools」(節點集區) 下方,按一下「default-pool」。
  4. 在「執行個體群組」下方,按一下要檢查的執行個體群組名稱。例如:gke-tier-2-cluster-default-pool-5c5add1f-grp。
  5. 在執行個體清單中,確認節點的內部 IP 位址位於第 2 層子網路的主要範圍:172.16.4.0/22。

gcloud

在第二個服務專案中建立名為 tier-2-cluster 的叢集:

gcloud container clusters create-auto tier-2-cluster \
    --project=SERVICE_PROJECT_2_ID \
    --location=CONTROL_PLANE_LOCATION \
    --network=projects/HOST_PROJECT_ID/global/networks/shared-net \
    --subnetwork=projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/tier-2 \
    --cluster-secondary-range-name=tier-2-pods \
    --services-secondary-range-name=tier-2-services

建立完成後,請確認叢集節點位於第 2 層子網路的主要範圍:172.16.4.0/22。

gcloud compute instances list --project SERVICE_PROJECT_2_ID

輸出結果會顯示節點的內部 IP 位址:

NAME                    ZONE           ... INTERNAL_IP
gke-tier-2-cluster-...  ZONE_NAME      ... 172.16.4.2
gke-tier-2-cluster-...  ZONE_NAME      ... 172.16.4.3
gke-tier-2-cluster-...  ZONE_NAME      ... 172.16.4.4

建立防火牆規則

如要允許流量進入網路,以及在網路內的叢集之間流動,您需要建立防火牆。以下各節將說明如何建立及更新防火牆規則:

建立防火牆規則,啟用與節點的 SSH 連線

在主機專案中,為 shared-net 網路建立防火牆規則。 允許流量從 TCP 通訊埠 22 輸入,這樣您就能使用 SSH 連線至叢集節點。

控制台

  1. 前往 Cloud de Confiance 控制台的「Firewall」(防火牆) 頁面。

    前往「Firewall」(防火牆) 頁面

  2. 在專案挑選器中,選取主專案。

  3. 在「VPC Networking」(虛擬私人雲端網路) 選單中按一下 [Create Firewall Rule] (建立防火牆規則)。

  4. 在「Name」(名稱) 中輸入 my-shared-net-rule。

  5. 在「Network」(網路) 中選取 [shared-net]。

  6. 在「Direction of traffic」(流量方向) 中選取 [Ingress] (輸入)。

  7. 「相符時執行的動作」請選取「允許」。

  8. 在「Targets」(目標) 中選取 [All instances in the network] (網路中的所有執行個體)。

  9. 在「Source filter」(來源篩選器) 中選取 [IP ranges] (IP 範圍)。

  10. 在「Source IP ranges」(來源 IP 範圍) 中輸入 0.0.0.0/0。

  11. 在「Protocols and ports」(通訊協定和通訊埠) 中選取 [Specified protocols and ports] (指定的通訊協定和通訊埠)。在方塊中輸入 tcp:22。

  12. 按一下 [Create] (建立)。

gcloud

建立共用網路的防火牆規則:

gcloud compute firewall-rules create my-shared-net-rule \
    --project HOST_PROJECT_ID \
    --network shared-net \
    --direction INGRESS \
    --allow tcp:22

使用 SSH 連線至節點

建立防火牆,允許從 TCP 通訊埠 22 輸入流量後,請使用 SSH 連線至節點。

控制台

  1. 前往 Cloud de Confiance 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 在專案挑選器中,選取第一個服務專案。

  3. 按一下 [tier-1-cluster]。

  4. 在「Cluster details」(叢集詳細資料) 頁面中,按一下「Nodes」(節點) 分頁標籤。

  5. 在「Node Pools」(節點集區) 下方,按一下節點集區名稱。

  6. 在「執行個體群組」下方,按一下執行個體群組名稱。例如,gke-tier-1-cluster-default-pool-faf87d48-grp。

  7. 在執行個體清單中,記下節點的內部 IP 位址。這些地址位於 10.0.4.0/22 範圍內。

  8. 在其中一個節點上,按一下「SSH」SSH。由於 SSH 使用 TCP 通訊埠 22,而防火牆規則允許使用該通訊埠,因此連線成功。

gcloud

列出第一個服務專案中的節點:

gcloud compute instances list --project SERVICE_PROJECT_1_ID

輸出結果包含叢集裡的節點名稱:

NAME                                           ...
gke-tier-1-cluster-default-pool-faf87d48-3mf8  ...
gke-tier-1-cluster-default-pool-faf87d48-q17k  ...
gke-tier-1-cluster-default-pool-faf87d48-x9rk  ...

使用 SSH 連線至其中一個節點:

gcloud compute ssh NODE_NAME \
    --project SERVICE_PROJECT_1_ID \
    --zone COMPUTE_ZONE

更改下列內容:

更新防火牆規則,允許節點間的流量

  1. 在 SSH 指令列視窗中,啟動 CoreOS Toolbox:

    /usr/bin/toolbox
    
  2. 在工具箱殼層中,對同一叢集中的其他節點執行 Ping。例如:

    ping 10.0.4.4
    

    ping 指令會成功,因為您的節點和其他節點都位於 10.0.4.0/22 範圍內。

  3. 現在,請嘗試在其他服務專案中,對叢集中的其中一個節點執行 Ping 作業。例如:

    ping 172.16.4.3
    

    這次 ping 指令失敗了,原因在於您的防火牆規則不允許網際網路控制訊息通訊協定 (ICMP) 流量。

  4. 在一般命令提示字元中 (而非工具箱殼層中) 更新防火牆規則以允許 ICMP:

    gcloud compute firewall-rules update my-shared-net-rule \
        --project HOST_PROJECT_ID \
        --allow tcp:22,icmp
    
  5. 在工具箱殼層中,再次對節點進行連線偵測 (ping)。例如:

    ping 172.16.4.3
    

    這次 ping 指令成功。

建立額外的防火牆規則

您可以建立其他防火牆規則,允許叢集中的節點、Pod 和服務進行通訊。

舉例來說,下列規則允許流量從 tier-1-cluster 中的任何節點、Pod 或服務,透過任何 TCP 或 UDP 通訊埠進入:

gcloud compute firewall-rules create my-shared-net-rule-2 \
    --project HOST_PROJECT_ID \
    --network shared-net \
    --allow tcp,udp \
    --direction INGRESS \
    --source-ranges 10.0.4.0/22,10.4.0.0/14,10.0.32.0/20

下列規則允許流量從 tier-2-cluster 中的任何節點、Pod 或服務進入,並使用任何 TCP 或 UDP 通訊埠:

gcloud compute firewall-rules create my-shared-net-rule-3 \
    --project HOST_PROJECT_ID \
    --network shared-net \
    --allow tcp,udp \
    --direction INGRESS \
    --source-ranges 172.16.4.0/22,172.20.0.0/14,172.16.16.0/20

Kubernetes 也會視情況嘗試建立及管理防火牆資源,例如,建立負載平衡器服務時。如果 Kubernetes 因權限問題而無法變更防火牆規則,系統會發出 Kubernetes 事件,引導您進行變更。

如要授予 Kubernetes 變更防火牆規則的權限,請參閱「管理防火牆資源」。

如果是 Ingress 負載平衡器,如果 Kubernetes 因權限不足而無法變更防火牆規則,系統每隔幾分鐘就會發出 firewallXPNError 事件。在 GLBC 1.4 以上版本中,您可以將 networking.gke.io/suppress-firewall-xpn-error: "true" 註解新增至 Ingress 資源,藉此將 firewallXPNError 事件設為靜音。移除該註解即可取消設為忽略項目。

在 Shared VPC 中,根據虛擬私有雲網路對等互連建立叢集

您可以將 Shared VPC 與虛擬私有雲網路對等互連式叢集搭配使用。

如要執行這項操作,您必須在主機專案中,將下列權限授予使用者帳戶或用於建立叢集的服務帳戶:

  • compute.networks.get

  • compute.networks.updatePeering

您也必須確保控制層 IP 位址範圍不會與共用網路中的其他保留範圍重疊。

在本節中,您會在預先定義的共用虛擬私有雲網路中,建立名為 cluster-vpc 的虛擬私有雲原生叢集。

控制台

  1. 前往 Cloud de Confiance 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 按一下 「建立」。

  3. 在 Autopilot 或 Standard 區段中,按一下「Configure」(設定)。

  4. 在「Name」(名稱) 中輸入 cluster-vpc。

  5. 按一下導覽窗格中的「Networking」(網路)。

  6. 在「叢集網路」部分,勾選「啟用私人節點」核取方塊。

  7. (Autopilot 模式為選用):將「控制層 IP 範圍」設為 172.16.0.16/28。

  8. 在「Network」(網路) 下拉式清單中,選取先前建立的虛擬私有雲網路。

  9. 在「節點子網路」下拉式清單中,選取您先前建立的共用子網路。

  10. 視需要設定叢集。

  11. 點選「建立」。

gcloud

執行下列指令,在預先定義的 Shared VPC 中建立名為 cluster-vpc 的叢集:

gcloud container clusters create-auto private-cluster-vpc \
    --project=PROJECT_ID \
    --location=CONTROL_PLANE_LOCATION \
    --network=projects/HOST_PROJECT/global/networks/shared-net \
    --subnetwork=SHARED_SUBNETWORK \
    --cluster-secondary-range-name=tier-1-pods \
    --services-secondary-range-name=tier-1-services \
    --enable-private-nodes \
    --master-ipv4-cidr=172.16.0.0/28

保留 IP 位址

您可以為 Shared VPC 叢集保留內部和外部 IP 位址。請務必在服務專案中保留這些 IP 位址。

如為內部 IP 位址,您必須提供 IP 位址所屬的子網路。如要跨專案預留 IP 位址,請使用完整資源網址識別子網路。

您可以在 Google Cloud CLI 中使用下列指令,預留內部 IP 位址:

gcloud compute addresses create RESERVED_IP_NAME \
    --region=COMPUTE_REGION \
    --subnet=projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/SUBNETWORK_NAME \
    --addresses=IP_ADDRESS \
    --project=SERVICE_PROJECT_ID

如要呼叫這項指令,您必須在子網路中新增compute.subnetworks.use權限。您可以 在子網路中授予呼叫端 compute.networkUser 角色, 也可以 在專案層級授予呼叫端具備 compute.subnetworks.use 權限的自訂角色。

清除所用資源

完成本指南中的練習後,請執行下列工作來移除資源,避免帳戶產生不必要的費用:

刪除叢集

刪除您建立的兩個叢集。

控制台

  1. 前往 Cloud de Confiance 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 在專案挑選器中,選取第一個服務專案。

  3. 選取「tier-1-cluster」,然後按一下「Delete」(刪除)。

  4. 在專案挑選器中,選取第二個服務專案。

  5. 選取「tier-2-cluster」,然後按一下「Delete」(刪除)。

gcloud

gcloud container clusters delete tier-1-cluster \
    --project SERVICE_PROJECT_1_ID \
    --location CONTROL_PLANE_LOCATION

gcloud container clusters delete tier-2-cluster \
    --project SERVICE_PROJECT_2_ID \
    --location CONTROL_PLANE_LOCATION

停用 Shared VPC

在主專案中停用 Shared VPC。

控制台

  1. 前往 Cloud de Confiance 控制台的「Shared VPC」(共用虛擬私有雲) 頁面。

    前往 Shared VPC

  2. 在專案挑選器中,選取主專案。

  3. 按一下 [Disable Shared VPC] (停用「共用 VPC」)。

  4. 在欄位中輸入 HOST_PROJECT_ID,然後按一下「停用」。

gcloud

gcloud compute shared-vpc associated-projects remove SERVICE_PROJECT_1_ID \
    --host-project HOST_PROJECT_ID

gcloud compute shared-vpc associated-projects remove SERVICE_PROJECT_2_ID \
    --host-project HOST_PROJECT_ID

gcloud compute shared-vpc disable HOST_PROJECT_ID

刪除防火牆規則

移除您建立的防火牆規則。

控制台

  1. 前往 Cloud de Confiance 控制台的「Firewall」(防火牆) 頁面。

    前往「Firewall」(防火牆) 頁面

  2. 在專案挑選器中,選取主專案。

  3. 在規則清單中,選取「my-shared-net-rule」、「my-shared-net-rule-2」和「my-shared-net-rule-3」。

  4. 點選「刪除」。

gcloud

刪除防火牆規則:

gcloud compute firewall-rules delete \
    my-shared-net-rule \
    my-shared-net-rule-2 \
    my-shared-net-rule-3 \
    --project HOST_PROJECT_ID

刪除共用網路

刪除您建立的共用網路。

控制台

  1. 前往 Cloud de Confiance 控制台的「VPC networks」(虛擬私有雲網路) 頁面。

    前往「VPC networks」(虛擬私有雲網路)

  2. 在專案挑選器中,選取主專案。

  3. 在網路清單中,按一下「shared-net」連結。

  4. 按一下 [Delete VPC Network] (刪除 VPC 網路)。

gcloud

gcloud compute networks subnets delete tier-1 \
    --project HOST_PROJECT_ID \
    --region COMPUTE_REGION

gcloud compute networks subnets delete tier-2 \
    --project HOST_PROJECT_ID \
    --region COMPUTE_REGION

gcloud compute networks delete shared-net --project HOST_PROJECT_ID

移除主機服務代理使用者角色

從兩個服務專案中移除「託管服務代理程式使用者」角色。

控制台

  1. 前往 Cloud de Confiance 控制台的「IAM」頁面。

    前往「IAM」(身分與存取權管理) 頁面

  2. 在專案挑選器中,選取主專案。

  3. 選取「包含 Google 提供的角色授予項目」。

  4. 在成員清單中,選取顯示 service-SERVICE_PROJECT_1_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com 的資料列, 該資料列會獲派 Kubernetes Engine 主機服務代理程式使用者角色。

  5. 按一下「Edit principal」(編輯主體)。

  6. 在「Kubernetes Engine Host Service Agent User」(Kubernetes Engine 主機服務代理程式使用者) 下方,按一下 圖示即可移除角色。

  7. 按一下 [儲存]。

  8. 選取顯示「已獲派 Kubernetes Engine 主機服務代理程式使用者角色」的資料列。service-SERVICE_PROJECT_2_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com

  9. 按一下「Edit principal」(編輯主體)。

  10. 在「Kubernetes Engine Host Service Agent User」(Kubernetes Engine 主機服務代理程式使用者) 下方,按一下 圖示即可移除角色。

  11. 按一下 [儲存]。

gcloud

  1. 從第一個服務專案的 GKE 服務代理程式移除「託管服務代理程式使用者」角色:

    gcloud projects remove-iam-policy-binding HOST_PROJECT_ID \
        --member serviceAccount:service-SERVICE_PROJECT_1_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com \
        --role roles/container.hostServiceAgentUser
    
  2. 從第二個服務專案的 GKE 服務代理程式移除「託管服務代理程式使用者」角色:

    gcloud projects remove-iam-policy-binding HOST_PROJECT_ID \
        --member serviceAccount:service-SERVICE_PROJECT_2_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com \
        --role roles/container.hostServiceAgentUser
    

疑難排解

以下各節說明如何解決 Shared VPC 叢集的常見問題。

錯誤:無法從網路專案取得中繼資料

使用 Shared VPC 叢集時,以下是常見的錯誤訊息:

Failed to get metadata from network project. GCE_PERMISSION_DENIED: Google
Compute Engine: Required 'compute.projects.get' permission for
'projects/HOST_PROJECT_ID

發生這項錯誤的原因如下:

  • 主機專案尚未啟用 GKE API。

  • 主專案的 GKE 服務代理不存在。例如,該檔案可能已遭刪除。

  • 主專案的 GKE 服務代理程式在主專案中沒有「Kubernetes Engine 服務代理程式」 (container.serviceAgent) 角色。繫結可能已遭誤刪。

  • 服務專案的 GKE 服務代理在主專案中沒有「託管服務代理程式使用者」角色。

如要解決這個問題,請判斷主專案的 GKE 服務代理程式是否存在。

如果服務代理不存在,請執行下列步驟:

  • 如果主專案未啟用 GKE API,請啟用該 API。 這會建立主專案的 GKE 服務代理,並在主專案中將 Kubernetes Engine 服務代理 (container.serviceAgent) 角色授予主專案的 GKE 服務代理。

  • 如果主專案已啟用 GKE API,表示主專案的 GKE 服務代理程式已遭刪除,或主專案的 GKE 服務代理程式沒有 Kubernetes Engine 服務代理程式 (container.serviceAgent) 角色。如要解決這個問題,請參閱「錯誤 400/403:缺少帳戶的編輯權限」。

問題:連線

如果 Compute Engine VM 位於同一個虛擬私有雲 (VPC) 網路,或是透過虛擬私有雲網路對等互連的兩個虛擬私有雲網路,且您遇到這些 VM 之間的連線問題,請參閱虛擬私有雲 (VPC) 說明文件中的「排解虛擬機器 (VM) 執行個體與內部 IP 位址之間的連線問題」。

問題:封包遺失

如果使用 Cloud NAT、VPC 原生叢集或 IP 位址偽裝代理程式,從叢集傳送流量至外部 IP 位址時發生封包遺失問題,請參閱「排解叢集透過 Cloud NAT 傳送流量時發生封包遺失的問題」。

後續步驟