本指南說明如何在不同專案中建立兩個使用共用虛擬私有雲的 Google Kubernetes Engine (GKE) 叢集。如需 GKE 網路的一般相關資訊,請造訪網路總覽頁面。
本指南中的範例會為雙層網路應用程式設定基礎架構,如共用虛擬私有雲總覽所述。
為什麼要搭配 GKE 使用共用虛擬私有雲
使用共用虛擬私有雲時,要先指派一個專案做為主專案,然後再將其他專案 (稱為服務專案) 附加到主專案。您會在主專案中建立網路、子網路、次要位址範圍、防火牆規則與其他網路資源。接著再與服務專案共用所選的子網路,其中包含次要範圍。服務專案內執行的元件可使用共用虛擬私有雲,跟其他服務專案內執行的元件進行通訊。
您可以使用共用虛擬私有雲搭配 Autopilot 叢集,以及區域和地區 Standard 叢集。
使用共用虛擬私有雲的標準叢集一律不能使用舊版網路,且必須啟用虛擬私有雲原生流量轉送。Autopilot 叢集一律會啟用虛擬私有雲原生流量轉送功能。
您可以在建立新叢集時,設定共用虛擬私有雲。GKE 不支援將現有叢集轉換為共用 VPC 模式。
使用共用虛擬私人雲端時,要遵循某些配額與限制。例如,專案內的網路數量是有配額的,可附加到主專案的服務專案數量也有限制。詳情請參閱配額與限制。
事前準備
開始設定使用共用虛擬私有雲的叢集前,請先完成下列事項:
- 確認您有Google Cloud 機構。
- 確認貴機構有三個Google Cloud 專案。
- 請務必熟悉共用虛擬私有雲的概念,包括共用虛擬私有雲使用的各種身分與存取權管理 (IAM) 角色。本指南中的工作必須由共用虛擬私有雲管理員執行。
- 請務必瞭解您的機構、資料夾或專案適用的所有機構政策限制。組織政策管理員可能已先設下限制,以限制何種專案可做為共享虛擬私人雲端主專案,或用於限制哪些子網路可供共享。如要瞭解詳情,請參閱組織政策限制。
開始進行本指南中的練習前,請先完成下列事項:
- 選擇其中一個專案做為主專案。
- 選擇兩個專案做為服務專案。
每個專案都有各自的名稱、ID 和號碼。在某些情況下,名稱和 ID 會相同。本指南使用下列簡短好記的名稱和預留位置來指稱您的專案:
好記名稱 | 專案 ID placeholder |
專案編號 預留位置 |
---|---|---|
主專案 | 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 或 Google Cloud 控制台,找出專案 ID 和編號。
控制台
前往 Google Cloud 控制台的「首頁」頁面。
在專案選擇工具中,選取您已選為主專案的專案。
您可以在「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 服務帳戶。
您可以使用 Google Cloud 控制台或 Google Cloud CLI 啟用 GKE API。
控制台
前往 Google Cloud 控制台的「APIs & Services」(API 和服務) 頁面。
在專案選擇工具中,選取您已選為主專案的專案。
如果
Kubernetes Engine API
已在 API 清單中,表示已經啟用,您不需執行任何操作。如果該項目不在清單中,請按一下 [Enable APIs and Services] (啟用 API 和服務)。搜尋Kubernetes Engine API
。按一下「Kubernetes Engine 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
。 - 為每個子網路建立兩個次要位址範圍:一個服務專用,另一個 Pod 專用。
172.17.0.0/16
控制台
前往 Google Cloud 控制台的「VPC networks」(虛擬私有雲網路) 頁面。
在專案選擇工具中選取主專案。
按一下 add_box「建立虛擬私有雲網路」。
在「Name」(名稱) 中輸入
shared-net
。在「Subnet creation mode」(子網路建立模式) 底下選取 [Custom] (自訂)。
在「New subnet」(新的子網路) 方塊的「Name」(名稱) 中輸入
tier-1
。在「區域」部分選取區域。
在「IP 堆疊類型」下方,選取「IPv4 (單一堆疊)」。
在「IPv4 range」(IPv4 範圍) 中,輸入
10.0.4.0/22
。按一下「建立次要 IPv4 範圍」。在「子網路範圍名稱」中輸入
tier-1-services
,並在「次要 IPv4 範圍」中輸入10.0.32.0/20
。按一下 [Add IP range] (新增 IP 範圍)。在「子網路範圍名稱」中輸入
tier-1-pods
,並在「次要 IPv4 範圍」中輸入10.4.0.0/14
。按一下 [新增子網路]。
在「Name」(名稱) 中輸入
tier-2
。在「區域」部分,選取您為上一個子網路選取的相同區域。
在「IPv4 range」(IPv4 範圍) 中,輸入
172.16.4.0/22
。按一下「建立次要 IPv4 範圍」。在「子網路範圍名稱」中輸入
tier-2-services
,並在「次要 IPv4 範圍」中輸入172.16.16.0/20
。按一下 [Add IP range] (新增 IP 範圍)。在「子網路範圍名稱」中輸入
tier-2-pods
,並在「次要 IPv4 範圍」中輸入172.20.0.0/14
。點選「建立」。
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 區域。
決定服務專案中的服務帳戶名稱
您有兩個服務專案,每個專案都分別有幾個服務帳戶。本節內容與您的 GKE 服務帳戶和 Google API 服務帳戶有關。在下一節的內容中,會需要用到這些服務帳戶的名稱。
下表列出兩個服務專案中的 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 |
啟用共用虛擬私有雲並授予角色
如要執行本節中的工作,請確認貴機構已定義共用 VPC 管理員角色。
在本節中,您將執行下列工作:
- 在主專案中啟用共用虛擬私有雲。
- 將兩個服務專案附加到主專案。
- 將適當的 IAM 角色授予服務專案裡的服務帳戶:
- 在第一個服務專案中,將主專案的
tier-1
子網路的Compute Network User
角色授予兩個服務帳戶。 - 在第二個服務專案中,將主專案的
tier-2
子網路Compute Network User
角色授予兩個服務帳戶。
- 在第一個服務專案中,將主專案的
主控台
如要啟用共用虛擬私有雲、附加服務專案和授予角色,請按照下列步驟進行:
前往 Google Cloud 控制台的「Shared VPC」(共用 VPC) 頁面。
在專案選擇工具中選取主專案。
按一下「設定共用 VPC」。「Enable host project」(啟用主專案) 畫面會隨即顯示。
按一下「儲存並繼續」。系統會顯示「Select subnets」(選取子網路) 頁面。
在「Sharing mode」(共用模式) 底下選取 [Individual subnets] (個別子網路)。
在「Subnets to share」(要共用的子網路) 底下勾選 [tier-1] 和 [tier-2]。清除其他所有核取方塊。
按一下「繼續」。「Give permissions」(授予權限) 頁面會隨即顯示。
在「Attach service projects」(附加服務專案) 底下,勾選第一個服務專案和第二個服務專案。清除「Attach service projects」(附加服務專案) 底下的其他所有核取方塊。
在「Kubernetes Engine access」(Kubernetes Engine 存取權) 底下勾選 [Enabled] (已啟用)。
按一下 [儲存]。系統會顯示新頁面。
在「Individual subnet permissions」(個別子網路權限) 底下勾選 [tier-1]。
在右側窗格中,刪除第二個服務專案的服務帳戶。也就是說,含有
SERVICE_PROJECT_2_NUM
的服務帳戶一律予以刪除。在右側窗格中,尋找第一個服務專案裡的 GKE 和 Google API 服務帳戶名稱。清單中應該要有這兩個服務帳戶名稱,如果其中一個不在清單中,請在「Add members」(新增成員) 底下輸入服務帳戶名稱,然後按一下 [Add] (新增)。
在中間窗格的「Individual subnet permissions」(個別子網路權限) 底下勾選 [tier-2],取消勾選 [tier-1]。
在右側窗格中,刪除第一個服務專案的服務帳戶。也就是說,含有
SERVICE_PROJECT_1_NUM
的服務帳戶一律予以刪除。在右側窗格中,尋找第二個服務專案裡的 GKE 和 Google API 服務帳戶名稱。清單中應該要有這兩個服務帳戶名稱,如果其中一個不在清單中,請在「Add members」(新增成員) 底下輸入服務帳戶名稱,然後按一下 [Add] (新增)。
gcloud
在主專案中啟用共用虛擬私有雲。使用的指令取決於您擁有的必要管理員角色。
如在機構層級有共用虛擬私人雲端管理員角色:
gcloud compute shared-vpc enable HOST_PROJECT_ID
如在資料夾層級有共用虛擬私人雲端管理員角色:
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
子網路的身分與存取權管理政策: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.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
子網路的 IAM 政策:gcloud compute networks subnets set-iam-policy tier-1 \ tier-1-policy.yaml \ --project HOST_PROJECT_ID \ --region COMPUTE_REGION
取得
tier-2
子網路的身分與存取權管理政策: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.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
子網路的 IAM 政策:gcloud compute networks subnets set-iam-policy tier-2 \ tier-2-policy.yaml \ --project HOST_PROJECT_ID \ --region COMPUTE_REGION
管理防火牆資源
如要讓服務專案中的 GKE 叢集在主專案中建立及管理防火牆資源,請使用下列其中一種策略,將適當的 IAM 權限授予服務專案的 GKE 服務帳戶:
將
Compute Security Admin
角色授予主專案的服務專案 GKE 服務帳戶。
主控台
前往 Google Cloud 控制台的「IAM」頁面。
選取主專案。
按一下「授予存取權」
,然後輸入服務專案的 GKE 服務帳戶主體service-SERVICE_PROJECT_NUM@container-engine-robot.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.iam.gserviceaccount.com \
--role=roles/compute.securityAdmin
更改下列內容:
HOST_PROJECT_ID
:共用虛擬私有雲主專案 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 權限:
前往 Google Cloud 控制台的「Roles」(角色) 頁面。
使用頁面頂端的下拉式清單,選取主專案。
按一下「建立角色」。
輸入角色的「標題」、「說明」、「ID」和「角色推出階段」。角色建立後即無法變更角色名稱。
按一下 [Add Permissions] (新增權限)。
篩選
compute.networks
,然後選取先前提及的 IAM 權限。選取所有必要權限後,按一下「新增」。
點選「建立」。
將主專案中新建立的自訂角色授予服務專案的 GKE 服務帳戶:
前往 Google Cloud 控制台的「IAM」頁面。
選取主專案。
按一下「授予存取權」
,然後輸入服務專案的 GKE 服務帳戶主體service-SERVICE_PROJECT_NUM@container-engine-robot.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.iam.gserviceaccount.com \ --role=projects/HOST_PROJECT_ID/roles/ROLE_ID
更改下列內容:
ROLE_ID
:角色名稱,例如gkeFirewallAdmin
ROLE_TITLE
:角色的簡單易懂名稱,例如GKE Firewall Admin
ROLE_DESCRIPTION
:角色的簡短說明,例如GKE service account FW permissions
LAUNCH_STAGE
:角色在生命週期中的推出階段,例如ALPHA
、BETA
或GA
HOST_PROJECT_ID
:共用虛擬私有雲主專案 IDSERVICE_PROJECT_NUM
:包含 GKE 服務帳戶的服務專案 ID
如果您有多個服務專案的叢集,請選擇其中一種策略,並為每個服務專案的 GKE 服務帳戶重複執行。
子網路上獲授予的角色摘要
以下是子網路上獲授予的角色摘要:
服務帳戶 | 角色 | 子網路 |
---|---|---|
service-SERVICE_PROJECT_1_NUM@container-engine-robot.iam.gserviceaccount.com | Compute 網路使用者 | tier-1 |
SERVICE_PROJECT_1_NUM@cloudservices.gserviceaccount.com | Compute 網路使用者 | tier-1 |
service-SERVICE_PROJECT_2_NUM@container-engine-robot.iam.gserviceaccount.com | Compute 網路使用者 | tier-2 |
SERVICE_PROJECT_2_NUM@cloudservices.gserviceaccount.com | Compute 網路使用者 | tier-2 |
驗證 GKE 存取權
附加服務專案時,啟用 GKE 存取權會授予服務專案的 GKE 服務帳戶權限,以便在主專案中執行網路管理作業。
啟用 GKE 存取權時,GKE 會在主機專案中自動指派下列角色:
成員 | 角色 | 資源 |
---|---|---|
service-SERVICE_PROJECT_NUM@container-engine-robot.iam.gserviceaccount.com | 託管服務代理程式使用者 | 主專案中的 GKE 服務帳戶 |
不過,您必須手動將 Compute Network User
IAM 權限新增至服務專案的 GKE 服務帳戶,才能存取主機網路。
成員 | 角色 | 資源 |
---|---|---|
service-SERVICE_PROJECT_NUM@container-engine-robot.iam.gserviceaccount.com | Compute 網路使用者 | 特定子網路或整個主專案 |
如果附加服務專案時未啟用 GKE 存取權,假設主機和服務專案都已啟用 GKE API,您可以在主機專案中新增下列 IAM 角色繫結,手動將權限指派給服務專案的 GKE 服務帳戶:
成員 | 角色 | 資源 |
---|---|---|
service-SERVICE_PROJECT_NUM@container-engine-robot.iam.gserviceaccount.com | Compute 網路使用者 | 特定子網路或整個主專案 |
service-SERVICE_PROJECT_NUM@container-engine-robot.iam.gserviceaccount.com | 託管服務代理程式使用者 | 主專案中的 GKE 服務代理程式 |
授予主機服務代理程式使用者角色
每個服務專案的 GKE 服務代理程式都必須在主專案中,繫結「主機服務代理程式使用者」(roles/container.hostServiceAgentUser
) 角色。GKE 服務代理人採用以下格式:
service-SERVICE_PROJECT_NUM@container-engine-robot.iam.gserviceaccount.com
其中 SERVICE_PROJECT_NUM
是服務專案的專案號碼。
這項繫結可讓服務專案的 GKE 服務代理程式在主專案中執行網路管理作業,就像主專案的 GKE 服務代理程式一樣。這個角色只能授予服務專案的 GKE 服務代理程式。
控制台
如果您一直在使用 Google Cloud 主控台,則不必明確授予「主機服務代理程式使用者」角色。當您使用 Google Cloud 控制台將服務專案附加到主專案時,就會自動授予該角色。
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
驗證可用的子網路和次要 IP 位址範圍
建立叢集時,您必須指定子網路和次要 IP 位址範圍,以供叢集的 Pod 和服務使用。IP 位址範圍可能無法提供使用,原因有好幾種。無論您要以 Google Cloud 控制台還是 gcloud CLI 建立叢集,皆需指定可用的 IP 位址範圍。
如果某 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: xpn-host
REGION: REGION_NAME
NETWORK: shared-net
SUBNET: tier-2
RANGE: 172.16.4.0/22
SECONDARY_RANGE_NAME: tier-2-services
IP_CIDR_RANGE: 172.20.0.0/14
STATUS: usable for pods or services
SECONDARY_RANGE_NAME: tier-2-pods
IP_CIDR_RANGE: 172.16.16.0/20
STATUS: usable for pods or services
PROJECT: xpn-host
REGION: REGION_NAME
NETWORK: shared-net
SUBNET: tier-1
RANGE: 10.0.4.0/22
SECONDARY_RANGE_NAME: tier-1-services
IP_CIDR_RANGE: 10.0.32.0/20
STATUS: usable for pods or services
SECONDARY_RANGE_NAME: tier-1-pods
IP_CIDR_RANGE: 10.4.0.0/14
STATUS: usable for pods or services
在下列情況下,list-usable
指令會傳回空白清單:
- 服務專案的 GKE 服務帳戶沒有主專案的「主機服務代理程式使用者」角色。
- 主機專案中的 GKE 服務帳戶不存在 (例如您不慎刪除了該帳戶)。
- 主專案未啟用 GKE API,表示主專案中缺少 GKE 服務帳戶。
詳情請參閱「疑難排解」一節。
次要 IP 位址範圍限制
您可以在指定的子網路中建立 30 個次要範圍。一個叢集需要有兩個次要範圍:一個 Pod 專用,另一個服務專用。
在第一個服務專案中建立叢集
如要在第一個服務專案中建立叢集,請使用 gcloud CLI 或 Google Cloud 控制台執行下列步驟。
控制台
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
在專案選擇工具中選取第一個服務專案。
按一下「add_box Create」(建立)。
在「Autopilot」或「Standard」區段中,按一下「Configure」(設定)。
在「Name」(名稱) 中輸入
tier-1-cluster
。在「Region」(區域) 下拉式清單中,選取您用於子網路的相同區域。
按一下導覽窗格中的「Networking」(網路)。
在「叢集網路」下方,選取「shared-net」。
在「Node subnet」(節點子網路) 中選取 [tier-1]。
在「Advanced networking options」(進階網路選項) 下方,針對「Cluster default Pod address range」(叢集預設 Pod 位址範圍) 選取「tier-1-pods」。
在「Service address range」(服務地址範圍) 中選取 [tier-1-services]。
點選「建立」。
建立完畢後,請在叢集清單中按一下 [tier-1-cluster]。
在「叢集詳細資料」頁面中,按一下「節點」分頁標籤。
在「Node Pools」(節點集區) 下方,按一下要檢查的節點集區名稱。
在「執行個體群組」下方,按一下要檢查的執行個體群組名稱。例如 gke-tier-1-cluster-default-pool-5c5add1f-grp。
在執行個體清單中,確認節點的內部 IP 位址位於 tier-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 區域。
建立完畢後,請確認叢集節點位於 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-... 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 或 Google Cloud 控制台執行下列步驟。
控制台
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
在專案選擇工具中選取第二個服務專案。
按一下「add_box Create」(建立)。
在「Standard」或「Autopilot」部分中,按一下「Configure」(設定)。
在「Name」(名稱) 中輸入
tier-2-cluster
。在「Region」(區域) 下拉式清單中,選取您用於子網路的相同區域。
按一下導覽窗格中的「Networking」(網路)。
在「Network」(網路) 中選取 [shared-net]。
在「Node subnet」(節點子網路) 中選取 [tier-2]。
在「叢集預設 Pod 位址範圍」中,選取「tier-2-pods」。
在「Service address range」(服務地址範圍) 中選取 [tier-2-services]。
點選「建立」。
建立完畢後,請在叢集清單中按一下 [tier-2-cluster]。
在「叢集詳細資料」頁面中,按一下「節點」分頁標籤。
在「Node Pools」(節點集區) 下方,按一下要檢查的節點集區名稱。
在「執行個體群組」下方,按一下要檢查的執行個體群組名稱。例如:
gke-tier-2-cluster-default-pool-5c5add1f-grp
。在執行個體清單中,確認節點的內部 IP 位址位於 tier-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
建立完畢後,請確認叢集節點位於 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-... 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 連線到叢集節點。
控制台
前往 Google Cloud 控制台的「Firewall」(防火牆) 頁面。
在專案選擇工具中選取主專案。
在「VPC Networking」(虛擬私人雲端網路) 選單中按一下 [Create Firewall Rule] (建立防火牆規則)。
在「Name」(名稱) 中輸入
my-shared-net-rule
。在「Network」(網路) 中選取 [shared-net]。
在「Direction of traffic」(流量方向) 中選取 [Ingress] (輸入)。
在「Action on match」(相符時執行的動作) 中選取 [Allow] (允許)。
在「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 連線至節點。
控制台
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
在專案選擇工具中選取第一個服務專案。
按一下 [tier-1-cluster]。
在「Cluster details」(叢集詳細資料) 頁面中,按一下「Nodes」(節點) 分頁標籤。
在「Node Pools」(節點集區) 下方,按一下節點集區的名稱。
在「Instance groups」(執行個體群組) 底下,按一下執行個體群組的名稱,例如,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 工具箱:
/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 權限,以便變更防火牆規則,請參閱管理防火牆資源。
至於 Ingress 負載平衡器,如果 Kubernetes 因權限不足而無法變更防火牆規則,則每幾分鐘就會產生一次 firewallXPNError
事件。在 GLBC 1.4 以上版本中,可以將 firewallXPNError
事件設為忽略項目,方法是將 networking.gke.io/suppress-firewall-xpn-error: "true"
註解新增到輸入資源。移除該註解即可取消設為忽略項目。
在共用虛擬私有雲中,根據虛擬私有雲網路對等互連建立叢集
您可以搭配使用共用虛擬私有雲與虛擬私有雲網路對等互連叢集。
如要這麼做,您必須在主專案中,將下列權限授予用於建立叢集的使用者帳戶或服務帳戶:
compute.networks.get
compute.networks.updatePeering
您也必須確保控制層 IP 位址範圍並未與共用網路中的其他保留範圍相互重疊。
在本節中,您會在預先定義的共用虛擬私有雲網路中,建立名為 cluster-vpc
的虛擬私有雲原生叢集。
控制台
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
按一下「add_box Create」(建立)。
在「Autopilot」或「Standard」區段中,按一下「Configure」(設定)。
在「Name」(名稱) 中輸入
cluster-vpc
。按一下導覽窗格中的「Networking」(網路)。
選取「私人叢集」。
(Autopilot 選用):將「控制層 IP 範圍」設為
172.16.0.16/28
。在「Network」(網路) 下拉式選單中,選取您先前建立的虛擬私有雲網路。
在「Node subnet」(節點子網路) 下拉式清單中,選取您先前建立的共用子網路。
視需要設定叢集。
點選「建立」。
gcloud
執行下列指令,在預先定義的共用虛擬私有雲中建立名為 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 位址
您可以保留內部和外部 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
權限的自訂角色授予呼叫端。
清除所用資源
完成本指南中的練習後,請執行下列工作來移除資源,以免您的帳戶產生不必要的費用:
刪除叢集
刪除您建立的兩個叢集。
控制台
前往 Google Cloud 控制台的「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
停用共用虛擬私有雲
在主專案中停用共用虛擬私有雲。
控制台
前往 Google Cloud 控制台的「Shared VPC」(共用 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
刪除防火牆規則
移除您建立的防火牆規則。
控制台
前往 Google Cloud 控制台的「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
刪除共用網路
刪除您建立的共用網路。
控制台
前往 Google Cloud 控制台的「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
移除主機服務代理程式使用者角色
從兩個服務專案中移除「主機服務代理程式使用者」角色。
控制台
前往 Google Cloud 控制台的「IAM」IAM頁面。
在專案選擇工具中選取主專案。
在成員清單中,選取顯示下列內容的資料列:
service-SERVICE_PROJECT_1_NUM@container-engine-robot.iam.gserviceaccount.com
獲授予 Kubernetes Engine 主機服務代理程式使用者角色。選取顯示下列內容的資料列:
service-SERVICE_PROJECT_2_NUM@container-engine-robot.iam.gserviceaccount.com
獲授予 Kubernetes Engine 主機服務代理程式使用者角色。按一下 [移除存取權]。
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
疑難排解
下列各節說明如何解決共用虛擬私有雲叢集的常見問題。
錯誤:無法從網路專案取得中繼資料
使用共用 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 服務帳戶已遭刪除,或沒有主專案的 Kubernetes Engine 服務代理程式 (
container.serviceAgent
) 角色。如要還原 GKE 服務帳戶或角色繫結,請停用再重新啟用 GKE API。詳情請參閱「錯誤 400/403:缺少帳戶的編輯權限」。
問題:連線
如果 Compute Engine VM 位於同一個虛擬私有雲 (VPC) 網路,或是透過虛擬私有雲網路對等互連的兩個虛擬私有雲網路,且您遇到這些 VM 之間的連線問題,請參閱虛擬私有雲 (VPC) 說明文件中的「使用內部 IP 位址排解虛擬機器 (VM) 執行個體之間的連線問題」。
問題:封包遺失
如果使用 Cloud NAT、虛擬私有雲原生叢集或 IP 偽裝代理程式,從叢集傳送流量至外部 IP 位址時發生封包遺失問題,請參閱「排解叢集 Cloud NAT 封包遺失問題」。