透過共用虛擬私人雲端設定叢集

本頁說明如何在使用共用虛擬私人雲端 (VPC) 的單獨專案中,建立兩個 Google Kubernetes Engine 叢集。如需 GKE 網路的一般相關資訊,請造訪網路總覽頁面。

總覽

使用共用虛擬私人雲端時,要先指派一個專案做為主專案,然後再將其他專案 (稱為服務專案) 附加到主專案。您會在主專案中建立網路、子網路、次要位址範圍、防火牆規則與其他網路資源。接著再與服務專案共用所選的子網路,其中包含次要範圍。服務專案內執行的元件可使用共用虛擬私人雲端,跟其他服務專案內執行的元件進行通訊。

您可以使用共用虛擬私人雲端搭配區域叢集與地區叢集。使用共用虛擬私人雲端的叢集一律不能使用舊版網路,且必須啟用別名 IP

您可以在建立新叢集時,設定共用虛擬私人雲端。Google Kubernetes Engine 不支援現有叢集轉換到共用虛擬私人雲端模式。

使用共用虛擬私人雲端時,要遵循某些配額與限制。例如,專案內的網路數量是有配額的,可附加到主專案的服務專案數量也有限制。詳情請參閱配額與限制

本主題裡的範例會為兩個層級的網路應用程式設定基礎架構,如共用虛擬私人雲端總覽所述。

本頁面範例會使用具體的名稱和位址範圍來說明一般程序,您可以依自身需求來變更名稱和位址範圍。此外,這些練習使用的是 us-central1 地區和 us-central1-a 區域,您也可以依自身需求來變更地區和區域。

事前準備

如要進行這項工作,您需有一個 Cloud Platform 機構,其中要有三個 Cloud Platform 專案

在貴機構內,您必須獲授予 Compute 共用虛擬私人雲端管理員角色

在進行本主題的練習之前,請先選擇其中一個專案做為主專案,選擇兩個專案做為服務專案。每個專案都有各自的名稱、ID 和號碼。在某些情況下,名稱和 ID 會相同。本主題使用下列簡短好記的名稱來指稱您的專案:

  • 主專案
  • 第一個服務專案
  • 第二個服務專案

本主題使用下列預留位置來指稱您的專案 ID 和號碼。

  • [HOST_PROJECT_ID] 是主專案的專案 ID。
  • [HOST_PROJECT_NUM] 是主專案的專案號碼。
  • [SERVICE_PROJECT_1_ID] 是第一個服務專案的專案 ID。
  • [SERVICE_PROJECT_1_NUM] 是第一個服務專案的專案號碼。
  • [SERVICE_PROJECT_2_ID] 是第二個服務專案的專案 ID。
  • [SERVICE_PROJECT_2_NUM] 是第二個服務專案的專案號碼。

尋找專案 ID 和號碼

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

主控台

  1. 在 Google Cloud Platform 主控台造訪首頁。
    造訪首頁
  2. 在專案選擇工具中,選取您已選為主專案的專案。
  3. 您可以在「Project info」(專案資訊) 底下看到專案名稱、專案 ID 和專案號碼。記下 ID 和號碼供稍後使用。
  4. 對您選為服務專案的每個專案執行相同動作。

在專案中啟用 Google Kubernetes Engine API

在繼續本主題的練習之前,請先確認 Google Kubernetes Engine API 在全部三個專案中都已啟用。啟用專案中的 API,專案的 GKE 服務帳戶會隨即建立。如要進行本主題中的其餘步驟,每個專案都必須具備 GKE 服務帳戶。

gcloud

啟用三個專案的 Google Kubernetes Engine 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. 造訪 GCP 主控台的「APIs & Services」(API 和服務) 資訊主頁。
    造訪 API 資訊主頁
  2. 在專案選擇工具中,選取您已選為主專案的專案。
  3. 如果 Kubernetes Engine API 已在 API 清單中,表示已經啟用,您不需執行任何操作。如果該項目不在清單中,請按一下 [Enable APIs and Services] (啟用 API 和服務)。搜尋 Kubernetes Engine API。按一下 [Kubernetes Engine API] 資訊卡後,再按一下 [Enable] (啟用)
  4. 重複以上步驟,處理您所選的每個服務專案。

建立一個網路和兩個子網路

在主專案中,建立一個名稱為 shared-net 的網路。接著建立兩個子網路,一個名稱為 tier-1,另一個名稱為 tier-2。為每個子網路建立兩個次要位址範圍:一個服務專用,另一個 Pod 專用。

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 us-central1 \
    --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 us-central1 \
    --secondary-range tier-2-services=172.16.16.0/20,tier-2-pods=172.20.0.0/14

主控台

  1. 造訪 GCP 主控台的「VPC networks」(VPC 網路) 頁面。
    造訪「VPC networks」(VPC 網路) 頁面
  2. 在專案選擇工具中選取主專案。
  3. 按一下 [Create VPC Network] (建立 VPC 網路)
  4. 在「Name」(名稱) 中輸入 shared-net
  5. 在「Subnet creation mode」(子網路建立模式) 底下選取 [Custom] (自訂)
  6. 在「New subnet」(新子網路) 方塊的「Name」(名稱) 中輸入 tier-1
  7. 在「Region」(地區) 中選取 [us-central1]
  8. 在「IP address range」(IP 位址範圍) 中輸入 10.0.4.0/22
  9. 按一下 [Create secondary IP range] (建立次要 IP 範圍)。在「Subnet range name」(子網路範圍名稱) 中輸入 tier-1-services,在「Secondary IP range」(次要 IP 範圍) 中輸入 10.0.32.0/20
  10. 按一下 [Add IP range] (新增 IP 範圍)。在「Subnet range name」(子網路範圍名稱) 中輸入 tier-1-pods,在「Secondary IP range」(次要 IP 範圍) 中輸入 10.4.0.0/14
  11. 按一下 [+ Add subnet] (+ 新增子網路)
  12. 在「Name」(名稱) 中輸入 tier-2
  13. 在「Region」(地區) 中選取 [us-central1]
  14. 在「IP address range」(IP 位址範圍) 中輸入 172.16.4.0/22
  15. 按一下 [Create secondary IP range] (建立次要 IP 範圍)。在「Subnet range name」(子網路範圍名稱) 中輸入 tier-2-services,在「Secondary IP range」(次要 IP 範圍) 中輸入 172.16.16.0/20
  16. 按一下 [Add IP range] (新增 IP 範圍)。在「Subnet range name」(子網路範圍名稱) 中輸入 tier-2-pods,在「Secondary IP range」(次要 IP 範圍) 中輸入 172.20.0.0/14
  17. 按一下 [Create] (建立)。

決定服務專案中的服務帳戶名稱

您有兩個服務專案,每個專案都分別有幾個服務帳戶。本節內容與您的 GKE 服務帳戶和 Google API 服務帳戶有關。在下一節的內容中,您會需要這些服務帳戶的名稱。

兩個服務專案中的 GKE 服務帳戶名稱如下:

  • service-[SERVICE_PROJECT_1_NUM]@container-engine-robot.iam.gserviceaccount.com
  • service-[SERVICE_PROJECT_2_NUM]@container-engine-robot.iam.gserviceaccount.com

兩個服務專案中的 Google API 服務帳戶名稱如下:

  • [SERVICE_PROJECT_1_NUM]@cloudservices.gserviceaccount.com
  • [SERVICE_PROJECT_2_NUM]@cloudservices.gserviceaccount.com

啟用共用虛擬私人雲端及授予角色

在主專案中啟用共用虛擬私人雲端,將兩個服務專案附加到主專案,接著將適當的角色授予服務專案裡的服務帳戶。

gcloud

在主專案中啟用共用虛擬私人雲端:

gcloud compute shared-vpc enable [HOST_PROJECT_ID]

將第一個服務專案附加到主專案:

gcloud compute shared-vpc associated-projects add \
    [SERVICE_PROJECT_1_ID] \
    --host-project [HOST_PROJECT_ID]

將第二個服務專案附加到主專案:

gcloud compute shared-vpc associated-projects add \
    [SERVICE_PROJECT_2_ID] \
    --host-project [HOST_PROJECT_ID]

取得 tier-1 子網路的身分與存取權管理政策:

gcloud beta compute networks subnets get-iam-policy tier-1 \
   --project [HOST_PROJECT_ID] \
   --region us-central1

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

建立一個名稱為 tier-1-policy.yaml 的檔案,當中含有下列內容:

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

其中 [ETAG_STRING] 是您先前記下的 etag 值。

設定 tier-1 子網路的身分與存取權管理政策:

gcloud beta compute networks subnets set-iam-policy tier-1 \
    tier-1-policy.yaml \
    --project [HOST_PROJECT_ID] \
    --region us-central1

接著,取得 tier-2 子網路的身分與存取權管理政策:

gcloud beta compute networks subnets get-iam-policy tier-2 \
   --project [HOST_PROJECT_ID] \
   --region us-central1

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

建立一個名稱為 tier-2-policy.yaml 的檔案,當中含有下列內容:

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

其中 [ETAG_STRING] 是您先前記下的 etag 值。

設定 tier-2 子網路的身分與存取權管理政策:

gcloud beta compute networks subnets set-iam-policy tier-2 \
    tier-2-policy.yaml \
    --project [HOST_PROJECT_ID] \
    --region us-central1

主控台

如要啟用共用虛擬私人雲端、附加服務專案和授予角色,請按照下列步驟進行:

  1. 造訪 GCP 主控台的「Shared VPC」(共用 VPC) 頁面。
    造訪「Shared VPC」(共用 VPC) 頁面
  2. 在專案選擇工具中選取主專案。
  3. 按一下 [Set up Shared VPC] (設定共用 VPC)
    「Enable host project」(啟用主專案) 畫面會隨即顯示。
  4. 按一下 [Save & continue] (儲存並繼續)
    「Select subnets」(選取子網路) 頁面會隨即顯示。
  5. 在「Sharing mode」(共用模式) 底下選取 [Individual subnets] (個別子網路)
  6. 在「Subnets to share」(要共用的子網路) 底下勾選 [tier-1] 和 [tier-2]。清除其他所有核取方塊。
  7. 按一下 [Continue] (繼續)
    「Give permissions」(授予權限) 頁面會隨即顯示。
  8. 在「Attach service projects」(附加服務專案) 底下,勾選第一個服務專案和第二個服務專案。清除「Attach service projects」(附加服務專案) 底下的其他所有核取方塊。
  9. 在「Kubernetes Engine access」(Kubernetes Engine 存取權) 底下勾選 [Enabled] (已啟用)
  10. 按一下 [Save] (儲存)
    新頁面會隨即顯示。
  11. 在「Individual subnet permissions」(個別子網路權限) 底下勾選 [tier-1]
  12. 在右側窗格中,刪除第二個服務專案的服務帳戶。也就是說,含有 [SERVICE_PROJECT_2_NUM] 的服務帳戶一律予以刪除。
  13. 在右側窗格中,尋找第一個服務專案裡的 Kubernetes Engine 和 Google API 服務帳戶名稱。清單中應該要有這兩個服務帳戶名稱,如果其中一個不在清單中,請在「Add members」(新增成員) 底下輸入服務帳戶名稱,然後按一下 [Add] (新增)
  14. 在中間窗格的「Individual subnet permissions」(個別子網路權限) 底下勾選 [tier-2],取消勾選 [tier-1]
  15. 在右側窗格中,刪除第一個服務專案的服務帳戶。也就是說,含有 [SERVICE_PROJECT_1_NUM] 的服務帳戶一律予以刪除。
  16. 在右側窗格中,尋找第二個服務專案裡的 Kubernetes Engine 和 Google API 服務帳戶名稱。清單中應該要有這兩個服務帳戶名稱,如果其中一個不在清單中,請在「Add members」(新增成員) 底下輸入服務帳戶名稱,然後按一下 [Add] (新增)

前述步驟的用途是將適當的 Cloud IAM 角色授予四個服務帳戶。在主專案的 tier-1 子網路上,第一個服務專案裡的兩個服務帳戶獲授予 Compute 網路使用者角色。在主專案的 tier-2 子網路上,第二個服務專案裡的兩個服務帳戶獲授予 Compute 網路使用者角色。

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

  • 在 tier-1 子網路上,service-[SERVICE_PROJECT_1_NUM]@container-engine-robot.iam.gserviceaccount.com 服務帳戶獲授予 Compute 網路使用者角色。

  • 在 tier-1 子網路上,[SERVICE_PROJECT_1_NUM]@cloudservices.gserviceaccount.com 服務帳戶獲授予 Compute 網路使用者角色。

  • 在 tier-2 子網路上,service-[SERVICE_PROJECT_2_NUM]@container-engine-robot.iam.gserviceaccount.com 服務帳戶獲授予 Compute 網路使用者角色。

  • 在 tier-2 子網路上,[SERVICE_PROJECT_2_NUM]@cloudservices.gserviceaccount.com 服務帳戶獲授予 Compute 網路使用者角色。

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

在每個服務專案中,皆須將「主機服務代理程式使用者」角色授予 GKE 服務帳戶。唯有如此,該服務專案的 GKE 服務帳戶才能使用主專案的 GKE 服務帳戶設定共用網路資源。

您只能將「主機服務代理程式使用者」角色授予服務專案的服務帳戶,不能授予其他使用者。

gcloud

將主機服務代理程式使用者角色授予第一個服務專案的 GKE 服務帳戶。在主專案上將使用者角色授予:

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

將主機服務代理程式使用者角色授予第二個服務專案的 GKE 服務帳戶。在主專案上將使用者角色授予:

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

主控台

如果您一直是使用 GCP 主控台,就不用明確授予主機服務代理程式使用者角色。當您使用 GCP 主控台將服務專案附加到主專案時,就會自動授予該角色。

驗證可使用的子網路和次要 IP 範圍

您在建立叢集時,必須指定子網路和次要 IP 範圍,以供叢集的 Pod 和服務使用。IP 範圍可能無法提供使用,原因有好幾種。無論您是以 GCP 主控台還是 gcloud 指令列工具建立叢集,都應該指定可使用的 IP 範圍。

您也可以透過下方指令列來列出專案可使用的子網路和次要 IP 範圍:

gcloud

gcloud beta container subnets list-usable \
    --project [SERVICE_PROJECT_ID] \
    --network-project [HOST_PROJECT_ID]

如果您省略 --project--network-project 選項,gcloud 指令就會使用有效設定中的預設專案。既然主專案和網路專案有所不同,那麼就必須指定 --project--network-project 其中一個,或兩者都指定。

這個指令的輸出結果會與下列內容相似:

PROJECT   REGION       NETWORK      SUBNET          RANGE
xpn-host  us-central1  empty-vpc    empty-subnet    10.0.0.0/21
xpn-host  us-east1     some-vpc     some-subnet     10.0.0.0/19
    ┌──────────────────────┬───────────────┬─────────────────────────────┐
    │ SECONDARY_RANGE_NAME │ IP_CIDR_RANGE │            STATUS           │
    ├──────────────────────┼───────────────┼─────────────────────────────┤
    │ pods-range           │ 10.2.0.0/21   │ usable for pods or services │
    │ svc-range            │ 10.1.0.0/21   │ usable for pods or services │
    └──────────────────────┴───────────────┴─────────────────────────────┘
xpn-host  us-central1  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 │
    └──────────────────────┴────────────────┴─────────────────────────────┘
xpn-host  us-central1  shared-net   tier-1          10.0.4.0/22
    ┌──────────────────────┬───────────────┬─────────────────────────────┐
    │ SECONDARY_RANGE_NAME │ IP_CIDR_RANGE │            STATUS           │
    ├──────────────────────┼───────────────┼─────────────────────────────┤
    │ tier-1-services      │ 10.0.32.0/20  │ unusable                    │
    │ tier-1-pods          │ 10.4.0.0/14   │ usable for pods             │
    │ tier-1-extra         │ 10.8.0.0/14   │ usable for pods or services │
    └──────────────────────┴───────────────┴─────────────────────────────┘

如果某 IP 範圍未處於使用中狀態,新叢集的服務就可以使用該 IP 範圍。您為新叢集 Pod 指定的 IP 範圍可以是未使用過的範圍,也可以是跟其他叢集裡的 Pod 一起共用的範圍。您的叢集不能使用 GKE 建立及代管的 IP 範圍。

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

gcloud

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

gcloud container clusters create tier-1-cluster \
    --project [SERVICE_PROJECT_1_ID] \
    --zone=us-central1-a \
    --enable-ip-alias \
    --network projects/[HOST_PROJECT_ID]/global/networks/shared-net \
    --subnetwork projects/[HOST_PROJECT_ID]/regions/us-central1/subnetworks/tier-1 \
    --cluster-secondary-range-name tier-1-pods \
    --services-secondary-range-name tier-1-services

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

gcloud compute instances list --project [SERVICE_PROJECT_1_ID]

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

NAME                    ZONE           ... INTERNAL_IP
gke-tier-1-cluster-...  us-central1-a  ... 10.0.4.2
gke-tier-1-cluster-...  us-central1-a  ... 10.0.4.3
gke-tier-1-cluster-...  us-central1-a  ... 10.0.4.4

主控台

  1. 造訪 GCP 主控台的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

  2. 在專案選擇工具中選取第一個服務專案。

  3. 按一下 [Create cluster] (建立叢集)

  4. 在「Cluster name」(叢集名稱) 中輸入 tier-1-cluster

  5. 在「Location type」(位置類型) 中選取 [Zonal] (分區)

  6. 在「Zone」(區域) 中選取 [us-central1-a]

  7. 在頁面底部,按一下 [Advanced Options] (進階選項)

  8. 在「VPC-native」(虛擬私人雲端原生叢集) 區段中,選取 [Enable VPC-native (using alias IP)] (啟用虛擬私人雲端原生叢集 (使用別名 IP))

  9. 取消選取 [Automatically create secondary ranges] (自動建立次要範圍)

  10. 選取 [Networks shared with me (from host project: ...)] (與我共用的網路 (來源主專案:...))

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

  12. 在「Pod secondary CIDR range」(Pod 次要 CIDR 範圍) 中選取 [tier-1-pods]

  13. 在「Services secondary CIDR range」(服務次要 CIDR 範圍) 中選取 [tier-1-services]

  14. 按一下 [Create] (建立)

  15. 建立完畢後,請在叢集清單中按一下 [tier-1-cluster]

  16. 在「Node Pools」(節點集區) 底下,按一下執行個體群組的名稱,例如 gke-tier-1-cluster-default-pool-5c5add1f-grp。

  17. 在執行個體清單中,確認節點的內部 IP 位址位於 tier-1 子網路的主要範圍:10.0.4.0/22。

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

gcloud

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

gcloud container clusters create tier-2-cluster \
    --project [SERVICE_PROJECT_2_ID] \
    --zone=us-central1-a \
    --enable-ip-alias \
    --network projects/[HOST_PROJECT_ID]/global/networks/shared-net \
    --subnetwork projects/[HOST_PROJECT_ID]/regions/us-central1/subnetworks/tier-2 \
    --cluster-secondary-range-name tier-2-pods \
    --services-secondary-range-name tier-2-services

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

gcloud compute instances list --project [SERVICE_PROJECT_2_ID]

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

NAME                    ZONE           ... INTERNAL_IP
gke-tier-2-cluster-...  us-central1-a  ... 172.16.4.2
gke-tier-2-cluster-...  us-central1-a  ... 172.16.4.3
gke-tier-2-cluster-...  us-central1-a  ... 172.16.4.4

主控台

  1. 造訪 GCP 主控台的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

  2. 在專案選擇工具中選取第二個服務專案。

  3. 按一下 [Create cluster] (建立叢集)

  4. 在「Cluster name」(叢集名稱) 中輸入 tier-2-cluster

  5. 在「Location type」(位置類型) 中選取 [Zonal] (分區)

  6. 在「Zone」(區域) 中選取 [us-central1-a]

  7. 在頁面底部,按一下 [Advanced Options] (進階選項)

  8. 在「VPC-native」(虛擬私人雲端原生叢集) 區段中,選取 [Enable VPC-native (using alias IP)] (啟用虛擬私人雲端原生叢集 (使用別名 IP))

  9. 取消選取 [Automatically create secondary ranges] (自動建立次要範圍)

  10. 選取 [Networks shared with me (from host project: ...)] (與我共用的網路 (來源主專案:...))

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

  12. 在「Pod secondary CIDR range」(Pod 次要 CIDR 範圍) 中選取 [tier-2-pods]

  13. 在「Services secondary CIDR range」(服務次要 CIDR 範圍) 中選取 [tier-2-services]

  14. 按一下 [Create] (建立)

  15. 建立完畢後,請在叢集清單中按一下 [tier-2-cluster]

  16. 在「Node Pools」(節點集區) 底下,按一下執行個體群組的名稱,例如 gke-tier-2-cluster-default-pool-5c5add1f-grp。

  17. 在執行個體清單中,確認節點的內部 IP 位址位於 tier-2 子網路的主要範圍:172.16.4.0/22。

建立防火牆規則

在主專案中,建立 shared-net 網路的防火牆規則。允許流量透過 TCP 通訊埠 22 進入。如此一來,就能使用 SSH 連線到叢集節點。

gcloud

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

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

主控台

  1. 造訪 GCP 主控台的防火牆頁面:

    造訪「Firewall rules」(防火牆規則) 頁面

  2. 在專案選擇工具中選取主專案。

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

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

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

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

  7. 在「Action on match」(相符時執行的動作) 中選取 [Allow] (允許)

  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] (建立)。

使用 SSH 連線到節點

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 us-central1-a \

其中 [NODE_NAME] 是其中一個節點的名稱。

主控台

  1. 造訪 GCP 主控台的 Google Kubernetes Engine 選單。

    造訪「Firewall rules」(防火牆規則) 頁面

  2. 在專案選擇工具中選取第一個服務專案。

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

  4. 在「Node Pools」(節點集區) 底下,按一下執行個體群組的名稱,例如,gke-tier-1-cluster-default-pool-faf87d48-grp。

  5. 在節點清單中,記下節點的內部 IP 位址。這些位址位於 10.0.4.0/22 範圍內。

  6. 對其中一個節點按一下 [SSH]。這之所以成功,是因為 SSH 使用您防火牆規則允許的 TCP 通訊埠 22。

節點之間的連線偵測 (ping)

在 SSH 指令列視窗中啟動 CoreOS 工具箱

/usr/bin/toolbox

在工具箱殼層中,針對同一叢集裡其他節點中的其中一個進行連線偵測 (ping)。例如:

ping 10.0.4.4

ping 指令成功了,原因在於您的節點和另一個節點都位於 10.0.4.0/22 範圍內。

現在嘗試針對其他服務專案中叢集裡的其中一個節點進行連線偵測 (ping)。例如:

ping 172.16.4.3

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

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

gcloud compute firewall-rules update my-shared-net-rule \
    --project [HOST_PROJECT_ID] \
    --allow tcp:22,icmp

在工具箱殼層中,再次對節點進行連線偵測 (ping)。例如:

ping 172.16.4.3

這次 ping 指令成功了。

建立其他防火牆規則

您可以建立其他防火牆規則,藉此允許叢集裡節點、Pod 和服務之間進行通訊。例如,這個規則會允許流量透過任何 TCP 或 UDP 通訊埠,從 tier-1-cluster 裡的任何節點、Pod 或服務進入。

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

這個規則允許流量透過任何 TCP 或 UDP 通訊埠,從 tier-2-cluster 裡的任何節點、Pod 或服務進入。

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,可以進入您的主專案然後授予 Compute Security Admin 角色。您也可以將具有 compute.firewalls.*compute.networks.updatePolicy 權限的自訂角色授予服務專案的 GKE 服務帳戶。

至於 Ingress 負載平衡器,如果 Kubernetes 因權限不足而無法變更防火牆規則,則每幾分鐘就會產生一次 firewallXPNError 事件。GLBC 1.4 及更新的版本中,只要在輸入資源新增 networking.gke.io/suppress-firewall-xpn-error: "true" 註解即可將 firewallXPNError 事件設為忽略項目。移除該註解即可取消設為忽略項目。

在共用虛擬私人雲端中建立私人叢集

您可以使用共用虛擬私人雲端搭配私人叢集,無需進行特殊設定。然而,您必須確定主要 CIDR 範圍並未與共用網路中的其他保留範圍相互重疊。

共用虛擬私人雲端裡的私人叢集數量上限為二十五個。

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

gcloud

下列指令可在預先定義的共用虛擬私人雲端中建立叢集 private-cluster-vpc

gcloud container clusters create private-cluster-vpc \
    --project [PROJECT_ID] \
    --enable-ip-alias \
    --network projects/[HOST_PROJECT]/global/networks/shared-net \
    --subnetwork [SHARED_SUBNETWORK] \
    --cluster-secondary-range-name c0-pods \
    --services-secondary-range-name c0-services \
    --enable-private-nodes \
    --master-ipv4-cidr 172.16.0.0/28

主控台

  1. 造訪 GCP 主控台的 Google Kubernetes Engine 選單。

    造訪 GKE 選單

  2. 按一下 [Create cluster] (建立叢集)

  3. 在「Cluster name」(叢集名稱) 中輸入 private-cluster-vpc

  4. 按一下選單底部的 [Advanced options] (進階選項)

  5. VPC-native 中選取 [Enable VPC-native (using alias IP)] (啟用虛擬私人雲端原生叢集 (使用別名 IP)) 核取方塊。

  6. 在「Network」(網路) 下拉式選單中,選取您先前建立的虛擬私人雲端網路。

  7. 在「Node subnet」(節點子網路) 下拉式選單中,選取您先前建立的共用子網路。

  8. 在「Network security」(網路安全) 中選取 [Private cluster] (私人叢集) 核取方塊。

  9. 務必選取 [Access master using its external IP address] (透過外部 IP 位址存取主要執行個體) 核取方塊。

  10. 將「Master IP range」(主要執行個體 IP 範圍) 設為 172.16.0.16/28

  11. 視需要設定您的叢集,然後按一下 [Create] (建立)

保留 IP 位址

您可以保留內部外部 IP 位址供共用虛擬私人雲端叢集使用。請務必在服務專案中保留這些 IP 位址。

若要保留內部 IP 位址,需提供該 IP 位址所屬的子網路。若要保留多個專案中的同一個 IP 位址,請使用完整資源網址,以利識別子網路。您可以在 gcloud 指令行工具中使用以下指令保留內部 IP 位址:

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

若要呼叫該指令,您必須要有適用於該子網路的 compute.subnetworks.use 權限。您可以將子網路的 compute.networkUser 角色授予呼叫端,也可以將在專案層級具有 compute.subnetworks.use 權限的自訂角色授予呼叫端

次要範圍附註

您可以在指定的子網路中建立五個次要範圍。一個叢集需要有兩個次要範圍:一個 Pod 專用,另一個服務專用。也就是說,您只能建立兩個使用指定子網路的叢集。

已知問題

次要 CIDR 範圍可能有其他叢集在使用

當使用 Google Cloud Platform 主控台建立共用虛擬私人雲端叢集時,建議的 Pod 和服務專用次要範圍可能已有其他叢集在使用。如果以這些 CIDR 範圍建立叢集,叢集建立作業會在錯誤狀態下失敗。

如果您碰到這個問題,請刪除錯誤狀態下的叢集。再次建立叢集前,請先確認新叢集可使用的次要範圍

這個問題會在日後的版本修正。

建立負載平衡器時的防火牆事件

如果 Kubernetes 服務帳戶未獲防火牆管理權限,則 Kubernetes 服務控管者可能不會為了必要的防火牆變更而建立事件,這是因為 Kubernetes 1.9 以下版本的 RBAC 權限發生問題,服務控管者沒有能力產生事件。

如要修正這個問題,請套用這些 YAML 檔案,當中含有的 RBAC 政策可允許建立事件。

以 Kubernetes 1.10 以上版本為基礎的叢集已套用這些 RBAC 政策。

清除

完成本頁面的練習後,為避免系統向您的帳戶收取不必要的費用,請按照下列步驟移除資源:

刪除叢集

gcloud

gcloud container clusters delete tier-1-cluster \
    --project [SERVICE_PROJECT_1_ID] \
    --zone us-central1-a

gcloud container clusters delete tier-2-cluster \
    --project [SERVICE_PROJECT_2_ID] \
    --zone us-central1-a

主控台

  1. 造訪 GCP 主控台的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

  2. 在專案選擇工具中選取第一個服務專案。

  3. 勾選 [tier-1-cluster] 後,按一下 [Delete] (刪除)

  4. 在專案選擇工具中選取第二個服務專案。

  5. 勾選 [tier-2-cluster] 後,按一下 [Delete] (刪除)

停用共用虛擬私人雲端

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. 造訪 GCP 主控台的「Shared VPC」(共用 VPC) 頁面。
    造訪「Shared VPC」(共用 VPC) 頁面
  2. 在專案選擇工具中選取主專案。
  3. 按一下 [Disable Shared VPC] (停用「共用 VPC」)
  4. 在文字方塊中輸入 [HOST_PROJECT_ID],然後按一下 [Disable] (停用)

刪除防火牆規則

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. 造訪 GCP 主控台的防火牆頁面:

    造訪「Firewall rules」(防火牆規則) 頁面

  2. 在專案選擇工具中選取主專案。

  3. 在規則清單中勾選 my-shared-net-rulemy-shared-net-rule-2my-shared-net-rule-3

  4. 按一下 [Delete] (刪除)

刪除 shared-net 網路

gcloud

gcloud compute networks subnets delete tier-1 \
    --project [HOST_PROJECT_ID] \
    --region us-central1

gcloud compute networks subnets delete tier-2 \
    --project [HOST_PROJECT_ID] \
    --region us-central1

gcloud compute networks delete shared-net --project [HOST_PROJECT_ID]

主控台

  1. 造訪 GCP 主控台的「VPC networks」(VPC 網路) 頁面。
    造訪「VPC networks」(VPC 網路) 頁面
  2. 在專案選擇工具中選取主專案。
  3. 在網路清單中按一下 [shared-net]
  4. 按一下 [Delete VPC Network] (刪除 VPC 網路)

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

gcloud

從第一個服務專案的 GKE 服務帳戶中,移除主機服務代理程式使用者角色:

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

從第二個服務專案的 GKE 服務帳戶中,移除主機服務代理程式使用者角色:

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

主控台

  1. 造訪 GCP 主控台中的「IAM」頁面。
    造訪「IAM」頁面
  2. 在專案選擇工具中選取主專案。
  3. 在成員清單中,勾選下列內容的資料列:service-[SERVICE_PROJECT_1_NUM]@container-engine-robot.iam.gserviceaccount.com 獲授予 Kubernetes Engine 主機服務代理程式使用者角色。
  4. 此外,也請勾選下列內容的資料列:service-[SERVICE_PROJECT_2_NUM]@container-engine-robot.iam.gserviceaccount.com 獲授予 Kubernetes Engine 主機服務代理程式使用者角色。
  5. 按一下 [Remove] (移除)

相關資源

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件