本指南說明如何在不同專案中建立兩個使用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 設定叢集前,請先完成下列事項:
- 確認您有Cloud de Confiance by S3NS 組織。
- 確認貴機構有三個Cloud de Confiance by S3NS 專案。
- 請務必熟悉Shared VPC 概念,包括 Shared VPC 使用的各種 Identity and Access Management (IAM) 角色。本指南中的工作必須由 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 和編號。
控制台
前往 Cloud de Confiance 控制台的「首頁」。
在專案挑選器中,選取您選擇做為主專案的專案。
您可以在「Project info」(專案資訊) 底下看到專案名稱、專案 ID 和專案號碼。記下 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
在專案中啟用 GKE API
繼續本指南的練習前,請先確認所有三個專案都已啟用 GKE API。在專案中啟用 API 時,系統會為該專案建立 GKE 服務代理。如要執行本指南中的其餘工作,每個專案都必須有 GKE 服務代理程式。
您可以使用 Cloud de Confiance 控制台或 Google Cloud CLI 啟用 GKE API。
控制台
前往 Cloud de Confiance 控制台的「Kubernetes Engine API」頁面:
選取專案。
如果頁面標題顯示「已啟用 API」,表示 GKE API 已啟用。如果沒有看到「已啟用 API」,請點選「啟用」按鈕。
針對您選擇做為服務專案的每個專案,重複執行上述步驟。每項作業可能需要一段時間才能完成。
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
建立網路和兩個子網路
在本節中,您將執行下列工作:
- 在主專案中,建立名為
shared-net的網路。 - 建立名為
tier-1和tier-2的兩個子網路。 - 為每個子網路建立兩個次要位址範圍:一個用於 Service,另一個用於 Pod。
控制台
前往 Cloud de Confiance 控制台的「VPC networks」(虛擬私有雲網路) 頁面。
在專案挑選器中,選取主專案。
按一下 add_box「建立虛擬私有雲網路」。
在「Name」(名稱) 中輸入
shared-net。在「Subnet creation mode」(子網路建立模式) 底下選取 [Custom] (自訂)。
新增「tier-1」
- 在「New subnet」(新的子網路) 方塊的「Subnets」(子網路) 下方,為「Name」(名稱) 輸入
tier-1。 - 在「區域」中選取區域。
- 在「IP stack type」(IP 堆疊類型),選取「IPv4 (single-stack)」(IPv4 (單一堆疊))。
- 在「IPv4 range」(IPv4 範圍) 中,輸入
10.0.4.0/22做為子網路的主要位址範圍。 按一下「新增次要 IPv4 範圍」。
- 在「Subnet range name」(子網路範圍名稱) 中輸入
tier-1-services。 - 在「次要 IPv4 範圍」中,輸入
10.0.32.0/20。
- 在「Subnet range name」(子網路範圍名稱) 中輸入
按一下「完成」。
按一下「新增次要 IPv4 範圍」。
- 在「Subnet range name」(子網路範圍名稱) 中輸入
tier-1-pods。 - 在「次要 IPv4 範圍」中,輸入
10.4.0.0/14。
- 在「Subnet range name」(子網路範圍名稱) 中輸入
按一下「完成」。
新增「tier-2」
- 按一下 [新增子網路]。
- 在「Name」(名稱) 中輸入
tier-2。 - 在「Region」(區域),選取與先前子網路相同的區域。
- 在「IPv4 range」(IPv4 範圍) 中,輸入
172.16.4.0/22做為子網路的主要位址範圍。 按一下「新增次要 IPv4 範圍」。
- 在「Subnet range name」(子網路範圍名稱) 中輸入
tier-2-services。 - 在「次要 IPv4 範圍」中,輸入
172.16.16.0/20。
- 在「Subnet range name」(子網路範圍名稱) 中輸入
按一下「完成」。
按一下「新增次要 IPv4 範圍」。
- 在「Subnet range name」(子網路範圍名稱) 中輸入
tier-2-pods。 - 在「次要 IPv4 範圍」中,輸入
172.20.0.0/14。
- 在「Subnet range name」(子網路範圍名稱) 中輸入
按一下「完成」。
前往頁面底部,然後按一下「建立」。
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) 角色。
在本節中,您將執行下列工作:
- 在您的 Host 專案中啟用 Shared VPC。
- 將兩個服務專案附加至主專案。
- 請移除或授予服務專案所屬服務代理
Compute Network User角色。如果您使用Cloud de Confiance 控制台,請移除角色;如果您使用 gcloud CLI,請授予角色。
控制台
前往 Cloud de Confiance 控制台的「共用 VPC」頁面。
在專案挑選器中,選取主專案。
按一下「設定 Shared VPC」。系統會顯示「啟用主專案」畫面。
按一下「啟用並繼續」。系統會顯示「附加服務專案並選取主體」部分。
在「Kubernetes Engine access」(Kubernetes Engine 存取權) 下方,選取「Enabled」(已啟用)。
在「選取要附加的專案」下方,按一下「新增項目」圖示 add_box。
在「選取專案」欄位中,按一下「選取」,然後選擇第一個服務專案。
再次按一下「新增項目」add_box,然後選取第二個服務專案。
按一下「繼續」。系統會顯示「授予存取權」部分。
在「存取模式」下方,選取「個別子網路存取權」。
在「具備個別子網路存取權的子網路」下方,捲動瀏覽清單並選取「tier-1」和「tier-2」。
按一下 [儲存]。新頁面會隨即顯示。
選取「僅顯示有個別 IAM 政策的子網路」。
從「tier-1」中移除服務代理
- 在「個別子網路存取權」下方,選取「tier-1」,然後點選「顯示權限面板」。
- 在「角色/主體」下方的「權限面板」中,展開「Compute 網路使用者」。
- 搜尋
SERVICE_PROJECT_2_NUM。 - 刪除第二個服務專案的所有服務代理程式。也就是刪除含有
SERVICE_PROJECT_2_NUM的服務代理程式。 確認第一個服務專案的下列服務代理程式是否在清單中,且具備「Compute Network User」角色:
service-SERVICE_PROJECT_1_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.comSERVICE_PROJECT_1_NUM@cloudservices.s3ns-system.iam.gserviceaccount.comSERVICE_PROJECT_1_NUM-compute@developer.s3ns.iam.gserviceaccount.com
如果清單中沒有服務代理,請按照下列步驟新增:
- 按一下「新增主體」add_box。
- 在「New principals」(新增主體) 欄位中,輸入服務代理名稱。
- 在「指派角色」下方,選取「Compute Network User」。
- 按一下 [儲存]。
在「個別子網路存取權」下方,取消勾選「tier-1」核取方塊。
從「tier-2」中移除服務代理
- 在「個別子網路存取權」下方,選取「第 2 層」。
- 在「角色/主體」下方的「權限面板」中,展開「Compute 網路使用者」。
- 搜尋
SERVICE_PROJECT_1_NUM。 - 刪除屬於第一個服務專案的所有服務代理程式。也就是刪除含有
SERVICE_PROJECT_1_NUM的所有服務代理。 確認第二個服務專案的下列服務代理程式是否在清單中,且具備「Compute Network User」(Compute 網路使用者) 角色:
service-SERVICE_PROJECT_2_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.comSERVICE_PROJECT_2_NUM@cloudservices.s3ns-system.iam.gserviceaccount.comSERVICE_PROJECT_2_NUM-compute@developer.s3ns.iam.gserviceaccount.com
如果清單中沒有服務代理,請按照下列步驟新增:
- 按一下「新增主體」add_box。
- 在「New principals」(新增主體) 欄位中輸入服務代理人名稱。
- 在「指派角色」下方,選取「Compute Network User」。
- 按一下 [儲存]。
gcloud
在主專案中啟用 Shared VPC。使用的指令取決於您擁有的必要管理員角色。
如果您具備機構層級的 Shared VPC 管理員角色:
gcloud compute shared-vpc enable HOST_PROJECT_ID如果您在資料夾層級擁有 Shared VPC 管理員角色:
gcloud beta 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子網路的 IAM 政策:gcloud compute networks subnets get-iam-policy tier-1 \ --project HOST_PROJECT_ID \ --region COMPUTE_REGION輸出結果含有一個
etag欄位,請記下etag的值。建立名為
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值。為
tier-1子網路設定 IAM 政策:gcloud compute networks subnets set-iam-policy tier-1 \ tier-1-policy.yaml \ --project HOST_PROJECT_ID \ --region COMPUTE_REGION取得
tier-2子網路的 IAM 政策:gcloud compute networks subnets get-iam-policy tier-2 \ --project HOST_PROJECT_ID \ --region COMPUTE_REGION輸出結果含有一個
etag欄位,請記下etag的值。建立名為
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值。為
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 權限。如要授予這些權限,請使用下列任一策略:
將
Compute Security Admin角色授予服務專案的 GKE 服務代理。
控制台
前往 Cloud de Confiance 控制台的「IAM」(身分與存取權管理) 頁面。
選取主專案。
按一下 「授予存取權」,然後輸入服務專案的 GKE 服務代理主體
service-SERVICE_PROJECT_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com。從下拉式清單中選取
Compute Security Admin角色。按一下 [儲存]。
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 主機專案 IDSERVICE_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 權限:
前往 Cloud de Confiance 控制台的「Roles」(角色) 頁面。
使用頁面頂端的下拉式清單,選取主專案。
按一下「建立角色」。
輸入角色的「標題」、「說明」、「ID」和「角色推出階段」。角色建立後即無法變更名稱。
按一下 [Add Permissions] (新增權限)。
篩選
compute.networks,然後選取先前提及的 IAM 權限。選取所有必要權限後,按一下「新增」。
點選「建立」。
在主專案中,將新建立的自訂角色授予服務專案的 GKE 服務代理:
前往 Cloud de Confiance 控制台的「IAM」(身分與存取權管理) 頁面。
選取主專案。
按一下「授予存取權」,然後輸入服務專案的 GKE 服務代理主體
service-SERVICE_PROJECT_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com。篩選新建立的自訂角色「名稱」,然後選取該角色。
按一下 [儲存]。
gcloud
在主專案中建立自訂角色,並授予先前提及的 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在主專案中,將新建立的自訂角色授予服務專案的 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:角色名稱,例如gkeFirewallAdminROLE_TITLE:角色名稱,例如GKE Firewall AdminROLE_DESCRIPTION:角色的簡短說明,例如GKE service agent FW permissionsLAUNCH_STAGE:角色生命週期的發布階段,例如ALPHA、BETA或GAHOST_PROJECT_ID:Shared VPC 主機專案 IDSERVICE_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
如果是第一個專案,請將「託管服務代理程式使用者」角色授予專案的 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在第二個專案中,將「託管服務代理程式使用者」角色授予專案的 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 控制台執行下列步驟。
控制台
前往 Cloud de Confiance 控制台的「Google Kubernetes Engine」頁面。
在專案挑選器中,選取第一個服務專案。
按一下 add_box「建立」。
在 Autopilot 或 Standard 區段中,按一下「Configure」(設定)。
在「Name」(名稱) 中輸入
tier-1-cluster。在「Region」(區域) 下拉式清單中,選取您用於子網路的相同區域。
按一下導覽窗格中的「Networking」(網路)。
在「叢集網路」下方,按一下「與我共用的網路」。
在「Network」(網路) 欄位中,選取「shared-net」(共用網路)。
在「Node subnet」(節點子網路) 中選取 [tier-1]。
在「進階網路選項」下方,選取「Pod 次要 CIDR 範圍」的「tier-1-pods」。
將「服務次要 CIDR 範圍」設為「tier-1-services」。
點選「建立」。
如果您建立的是標準叢集,可以按照下列步驟,查看叢集的節點是否位於第 1 層子網路的主要位址範圍:
- 建立完成後,系統會顯示「叢集詳細資料」頁面。
- 按一下「Nodes」(節點) 分頁標籤。
- 在「Node Pools」(節點集區) 下方,按一下「default-pool」。
- 在「執行個體群組」下方,按一下要檢查的執行個體群組名稱。例如 gke-tier-1-cluster-default-pool-5c5add1f-grp。
- 在執行個體清單中,確認節點的內部 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 控制台執行下列步驟。
控制台
前往 Cloud de Confiance 控制台的「Google Kubernetes Engine」頁面。
在專案挑選器中,選取第二個服務專案。
按一下 add_box「建立」。
在「Standard」或「Autopilot」部分中,按一下「Configure」(設定)。
在「Name」(名稱) 中輸入
tier-2-cluster。在「Region」(區域) 下拉式清單中,選取您用於子網路的相同區域。
按一下導覽窗格中的「Networking」(網路)。
在「叢集網路」下方,按一下「與我共用的網路」。
在「Network」(網路) 欄位中,選取「shared-net」(共用網路)。
在「Node subnet」(節點子網路) 中選取 [tier-2]。
在「進階網路選項」下方,針對「Pod 次要 CIDR 範圍」選取「tier-2-pods」。
將「服務次要 CIDR 範圍」設為「tier-2-services」。
點選「建立」。
如果您建立的是標準叢集,可以按照下列步驟,查看叢集的節點是否位於第 2 層子網路的主要位址範圍:
- 建立完成後,系統會顯示「叢集詳細資料」頁面。
- 按一下「Nodes」(節點) 分頁標籤。
- 在「Node Pools」(節點集區) 下方,按一下「default-pool」。
- 在「執行個體群組」下方,按一下要檢查的執行個體群組名稱。例如:
gke-tier-2-cluster-default-pool-5c5add1f-grp。 - 在執行個體清單中,確認節點的內部 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 連線: 說明如何建立防火牆規則,啟用來自叢集外部的流量 (使用 SSH)。
更新防火牆規則,在節點之間執行連線偵測 (ping): 說明如何更新防火牆規則,允許叢集之間的 ICMP 流量。
本範例使用 SSH 和 ICMP,您必須建立防火牆規則,以符合特定應用程式的網路需求。
建立防火牆規則,啟用與節點的 SSH 連線
在主機專案中,為 shared-net 網路建立防火牆規則。
允許流量從 TCP 通訊埠 22 輸入,這樣您就能使用 SSH 連線至叢集節點。
控制台
前往 Cloud de Confiance 控制台的「Firewall」(防火牆) 頁面。
在專案挑選器中,選取主專案。
在「VPC Networking」(虛擬私人雲端網路) 選單中按一下 [Create Firewall Rule] (建立防火牆規則)。
在「Name」(名稱) 中輸入
my-shared-net-rule。在「Network」(網路) 中選取 [shared-net]。
在「Direction of traffic」(流量方向) 中選取 [Ingress] (輸入)。
「相符時執行的動作」請選取「允許」。
在「Targets」(目標) 中選取 [All instances in the network] (網路中的所有執行個體)。
在「Source filter」(來源篩選器) 中選取 [IP ranges] (IP 範圍)。
在「Source IP ranges」(來源 IP 範圍) 中輸入
0.0.0.0/0。在「Protocols and ports」(通訊協定和通訊埠) 中選取 [Specified protocols and ports] (指定的通訊協定和通訊埠)。在方塊中輸入
tcp:22。按一下 [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 連線至節點。
控制台
前往 Cloud de Confiance 控制台的「Google Kubernetes Engine」頁面。
在專案挑選器中,選取第一個服務專案。
按一下 [tier-1-cluster]。
在「Cluster details」(叢集詳細資料) 頁面中,按一下「Nodes」(節點) 分頁標籤。
在「Node Pools」(節點集區) 下方,按一下節點集區名稱。
在「執行個體群組」下方,按一下執行個體群組名稱。例如,gke-tier-1-cluster-default-pool-faf87d48-grp。
在執行個體清單中,記下節點的內部 IP 位址。這些地址位於
10.0.4.0/22範圍內。在其中一個節點上,按一下「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
更改下列內容:
NODE_NAME:其中一個節點的名稱。COMPUTE_ZONE:區域內的 Compute Engine 可用區名稱。
更新防火牆規則,允許節點間的流量
在 SSH 指令列視窗中,啟動 CoreOS Toolbox:
/usr/bin/toolbox在工具箱殼層中,對同一叢集中的其他節點執行 Ping。例如:
ping 10.0.4.4ping指令會成功,因為您的節點和其他節點都位於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 和服務進行通訊。
舉例來說,下列規則允許流量從 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.getcompute.networks.updatePeering
您也必須確保控制層 IP 位址範圍不會與共用網路中的其他保留範圍重疊。
在本節中,您會在預先定義的共用虛擬私有雲網路中,建立名為 cluster-vpc 的虛擬私有雲原生叢集。
控制台
前往 Cloud de Confiance 控制台的「Google Kubernetes Engine」頁面。
按一下 add_box「建立」。
在 Autopilot 或 Standard 區段中,按一下「Configure」(設定)。
在「Name」(名稱) 中輸入
cluster-vpc。按一下導覽窗格中的「Networking」(網路)。
在「叢集網路」部分,勾選「啟用私人節點」核取方塊。
(Autopilot 模式為選用):將「控制層 IP 範圍」設為
172.16.0.16/28。在「Network」(網路) 下拉式清單中,選取先前建立的虛擬私有雲網路。
在「節點子網路」下拉式清單中,選取您先前建立的共用子網路。
視需要設定叢集。
點選「建立」。
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 權限的自訂角色。
清除所用資源
完成本指南中的練習後,請執行下列工作來移除資源,避免帳戶產生不必要的費用:
刪除叢集
刪除您建立的兩個叢集。
控制台
前往 Cloud de Confiance 控制台的「Google Kubernetes Engine」頁面。
在專案挑選器中,選取第一個服務專案。
選取「tier-1-cluster」,然後按一下「Delete」(刪除)。
在專案挑選器中,選取第二個服務專案。
選取「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。
控制台
前往 Cloud de Confiance 控制台的「Shared VPC」(共用虛擬私有雲) 頁面。
在專案挑選器中,選取主專案。
按一下 [Disable Shared VPC] (停用「共用 VPC」)。
在欄位中輸入
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
刪除防火牆規則
移除您建立的防火牆規則。
控制台
前往 Cloud de Confiance 控制台的「Firewall」(防火牆) 頁面。
在專案挑選器中,選取主專案。
在規則清單中,選取「my-shared-net-rule」、「my-shared-net-rule-2」和「my-shared-net-rule-3」。
點選「刪除」。
gcloud
刪除防火牆規則:
gcloud compute firewall-rules delete \
my-shared-net-rule \
my-shared-net-rule-2 \
my-shared-net-rule-3 \
--project HOST_PROJECT_ID
刪除共用網路
刪除您建立的共用網路。
控制台
前往 Cloud de Confiance 控制台的「VPC networks」(虛擬私有雲網路) 頁面。
在專案挑選器中,選取主專案。
在網路清單中,按一下「shared-net」連結。
按一下 [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
移除主機服務代理使用者角色
從兩個服務專案中移除「託管服務代理程式使用者」角色。
控制台
前往 Cloud de Confiance 控制台的「IAM」頁面。
在專案挑選器中,選取主專案。
選取「包含 Google 提供的角色授予項目」。
在成員清單中,選取顯示
service-SERVICE_PROJECT_1_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com的資料列, 該資料列會獲派 Kubernetes Engine 主機服務代理程式使用者角色。按一下「Edit principal」(編輯主體)edit。
在「Kubernetes Engine Host Service Agent User」(Kubernetes Engine 主機服務代理程式使用者) 下方,按一下 delete 圖示即可移除角色。
按一下 [儲存]。
選取顯示「已獲派 Kubernetes Engine 主機服務代理程式使用者角色」的資料列。
service-SERVICE_PROJECT_2_NUM@container-engine-robot.s3ns-system.iam.gserviceaccount.com按一下「Edit principal」(編輯主體)edit。
在「Kubernetes Engine Host Service Agent User」(Kubernetes Engine 主機服務代理程式使用者) 下方,按一下 delete 圖示即可移除角色。
按一下 [儲存]。
gcloud
從第一個服務專案的 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從第二個服務專案的 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 傳送流量時發生封包遺失的問題」。
後續步驟
- 閱讀 Shared VPC 總覽。
- 瞭解如何佈建 Shared VPC。
- 閱讀 GKE 網路總覽。
- 瞭解自動建立的防火牆規則。
- 瞭解如何排解內部 IP 位址虛擬機器 (VM) 執行個體之間的連線問題。