本教學課程說明如何使用 Cloud Build 私人集區存取私人 Google Kubernetes Engine (GKE) 叢集。有了這項存取權,您就能使用 Cloud Build 將應用程式部署至私有 GKE 叢集。本教學課程適用於網路管理員,以及所有需要讓 Cloud Build 私人集區與對等虛擬私有雲 (VPC) 網路中執行的服務通訊的情況。舉例來說,私人集區工作站可以與下列服務通訊:
- 私人 GKE 叢集
- Cloud SQL 資料庫
- Memorystore 執行個體
- 在與 Cloud Build 私人集區對等互連的 VPC 網路以外,執行的 Compute Engine 執行個體
- Cloud SQL 執行個體 (使用私人 IP),在與 Cloud Build 私人集區所用虛擬私有雲網路不同的虛擬私有雲網路中執行。
Cloud Build 私人集區和 GKE 叢集控制層都會在 Google 擁有的 VPC 網路中執行。這些 VPC 網路會與您在 Google Cloud上的 VPC 網路對等互連。不過,虛擬私有雲網路對等互連不支援遞移對等互連,因此使用 Cloud Build 私人集區時可能會受到限制。本教學課程介紹的解決方案使用 Cloud VPN,讓 Cloud Build 私人集區中的 worker 存取私人 GKE 叢集的控制層。
本教學課程假設您已熟悉 Google Kubernetes Engine、Cloud Build、gcloud 指令、虛擬私有雲網路對等互連和 Cloud VPN。
架構總覽
建立無法透過用戶端存取公開端點的私人 GKE 叢集時,用戶端只能使用私人 IP 位址存取 GKE 叢集控制層。用戶端 (例如 kubectl) 必須在可存取虛擬私有雲網路且位於授權網路的執行個體上執行,才能與控制層通訊。
如要使用 Cloud Build 部署應用程式至這個私人 GKE 叢集,您必須使用 Cloud Build 私人集區存取 GKE 叢集。私人集區是一組工作站執行個體,會在 Google 擁有的專案中執行,並透過虛擬私有雲網路對等互連連線,與您的虛擬私有雲網路對等互連。 Google Cloud 在這個設定中,工作站執行個體可以與 GKE 叢集控制層的私人 IP 位址通訊。
不過,GKE 叢集控制層也會在 Google 擁有的專案中執行,並使用 Private Service Connect (PSC) 連線至您的虛擬私有雲網路。虛擬私有雲網路對等互連不支援遞移對等互連,因此封包無法在 Cloud Build 私人集區和 GKE 叢集控制層之間直接路由傳送。
如要讓 Cloud Build worker 執行個體存取 GKE 叢集控制層,您可以對等互連私人集區,並使用 PSC 將 GKE 叢集控制層與您擁有的兩個虛擬私有雲網路連線,然後使用 Cloud VPN 連線這兩個虛擬私有雲網路。透過這項對等互連和連線,虛擬私有雲通道的每一端都能通告私有集區和 GKE 叢集控制層網路,進而完成路徑。
下圖顯示本教學課程中使用的資源:
建議您在Google Cloud 同一區域中建立本教學課程使用的所有資源,以降低延遲。如果您的實作需要跨區域通訊,VPN 通道可以跨越兩個不同區域。您擁有的兩個虛擬私有雲網路也可以屬於不同專案。
目標
- 建立私人 GKE 叢集。
- 設定 Cloud Build 私人集區。
- 在兩個虛擬私有雲網路之間建立高可用性 VPN 連線。
- 啟用封包在兩個 VPC 網路對等互連和一個 VPC 連線之間的路由。
費用
在本文件中,您會使用下列 Google Cloud的計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。
事前準備
-
在 Google Cloud 控制台的專案選擇器頁面中,選取或建立 Google Cloud 專案。
選取或建立專案所需的角色
- 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
-
建立專案:如要建立專案,您需要專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
啟用 Cloud Build、Google Kubernetes Engine 和 Service Networking API。
啟用 API 時所需的角色
您必須具備
serviceusage.services.enable權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。 -
在 Google Cloud 控制台中啟用 Cloud Shell。
控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。 Google Cloud Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已針對您目前的專案設定好相關值。工作階段可能要幾秒鐘的時間才能初始化。
在自己的專案中建立兩個虛擬私有雲網路
在本節中,您將建立兩個虛擬私有雲網路,以及 GKE 叢集節點的子網路。
在 Cloud Shell 中建立第一個虛擬私有雲網路 (在上一個圖表中稱為「私人集區對等互連虛擬私有雲網路」)。您不需要在這個網路中建立子網路。
gcloud compute networks create PRIVATE_POOL_PEERING_VPC_NAME \ --subnet-mode=CUSTOM將 PRIVATE_POOL_PEERING_VPC_NAME 替換為要與 Cloud Build 私人集區網路對等的虛擬私有雲網路名稱。
建立第二個虛擬私有雲網路 (在上圖中稱為「GKE 叢集虛擬私有雲網路」):
gcloud compute networks create GKE_CLUSTER_VPC_NAME \ --subnet-mode=CUSTOM將 GKE_CLUSTER_VPC_NAME 替換為要與 GKE 叢集控制層對等的虛擬私有雲網路名稱。
為 GKE 叢集節點建立子網路:
gcloud compute networks subnets create GKE_SUBNET_NAME \ --network=GKE_CLUSTER_VPC_NAME \ --range=GKE_SUBNET_RANGE \ --region=REGION更改下列內容:
- GKE_SUBNET_NAME:子網路的名稱,用於代管 GKE 叢集節點。
- GKE_CLUSTER_VPC_NAME:要與 GKE 叢集控制層連線的虛擬私有雲網路名稱。
- GKE_SUBNET_RANGE:GKE_SUBNET_NAME的 IP 位址範圍。在本教學課程中,您可以使用
10.244.252.0/22。 - REGION:代管 GKE 叢集的 Google Cloud 區域。在本教學課程中,您可以使用
us-central1。
您已在自己的專案中設定兩個虛擬私有雲網路,現在可以與其他服務對等互連。
建立私人 GKE 叢集
在本節中,您將建立私人 GKE 叢集。
在 Cloud Shell 中建立 GKE 叢集,且用戶端無法存取控制層的公開端點。
gcloud container clusters create PRIVATE_CLUSTER_NAME \ --region=REGION \ --enable-master-authorized-networks \ --network=GKE_CLUSTER_VPC_NAME \ --subnetwork=GKE_SUBNET_NAME \ --enable-private-nodes \ --enable-private-endpoint \ --enable-ip-alias \ --master-ipv4-cidr=CLUSTER_CONTROL_PLANE_CIDR更改下列內容:
- PRIVATE_CLUSTER_NAME:私有 GKE 叢集的名稱。
- REGION:GKE 叢集的區域。在本教學課程中,請使用
us-central1做為地區,也就是您用於虛擬私有雲網路的地區。 - GKE_CLUSTER_VPC_NAME:要連線至 GKE 叢集控制層的虛擬私有雲網路名稱。
- GKE_SUBNET_RANGE:GKE_SUBNET_NAME的 IP 位址範圍。在本教學課程中,您可以使用
10.244.252.0/22。 CLUSTER_CONTROL_PLANE_CIDR:GKE 叢集控制層的 IP 位址範圍。必須加上
/28前置字串。在本教學課程中,請使用172.16.0.32/28。
您已建立私人 GKE 叢集。
為 GKE 1.28 以下版本設定虛擬私有雲網路對等互連
如果您使用本教學課程設定執行 GKE 1.28 版或更早版本的現有叢集,私人虛擬私有雲網路會使用虛擬私有雲網路對等互連連線至 GKE 叢集。請完成下列步驟:
擷取 GKE 叢集的 VPC 網路對等互連名稱。建立 GKE 叢集時,系統會自動建立這個 VPC 網路對等互連。
export GKE_PEERING_NAME=$(gcloud container clusters describe PRIVATE_CLUSTER_NAME \ --region=REGION \ --format='value(privateClusterConfig.peeringName)')更改下列內容:
- PRIVATE_CLUSTER_NAME:私有 GKE 叢集的名稱。
- REGION:GKE 叢集的區域。在本教學課程中,請使用
us-central1做為地區,也就是您用於虛擬私有雲網路的地區。
啟用匯出自訂路徑,以便向 GKE 叢集控制層宣傳私人集區網路:
gcloud compute networks peerings update $GKE_PEERING_NAME \ --network=GKE_CLUSTER_VPC_NAME \ --export-custom-routes \ --no-export-subnet-routes-with-public-ip將 GKE_CLUSTER_VPC_NAME 替換為要與 GKE 叢集控制層連線的虛擬私有雲網路名稱。
如要進一步瞭解自訂路徑,請參閱「匯入及匯出自訂路徑」。
建立 Cloud Build 私人集區
在本節中,您將建立 Cloud Build 私人集區。
在 Cloud Shell 中,於 PRIVATE_POOL_PEERING_VPC_NAME 虛擬私有雲網路中為 Cloud Build 私人集區分配具名 IP 位址範圍:
gcloud compute addresses create RESERVED_RANGE_NAME \ --global \ --purpose=VPC_PEERING \ --addresses=PRIVATE_POOL_NETWORK \ --prefix-length=PRIVATE_POOL_PREFIX \ --network=PRIVATE_POOL_PEERING_VPC_NAME更改下列內容:
- RESERVED_RANGE_NAME:用於代管 Cloud Build 私有集區的私有 IP 位址範圍名稱。
- PRIVATE_POOL_NETWORK:RESERVED_RANGE_NAME 的第一個 IP 位址。在本教學課程中,您可以使用
192.168.0.0。 - PRIVATE_POOL_PREFIX:
RESERVED_RANGE_NAME 的前置字串。建立的每個私人集區都會使用這個範圍的
/24。在本教學課程中,您可以使用20,最多可建立 16 個集區。 - PRIVATE_POOL_PEERING_VPC_NAME:要與 Cloud Build 私人集區網路對等互連的虛擬私有雲網路名稱。
- IP 範圍為
global,因為當--purpose為VPC_PEERING時,具名 IP 位址範圍必須為global。
在包含 Cloud Build 私人集區的虛擬私有雲網路與下列項目之間建立私人連線:PRIVATE_POOL_PEERING_VPC_NAME
gcloud services vpc-peerings connect \ --service=servicenetworking.googleapis.com \ --ranges=RESERVED_RANGE_NAME \ --network=PRIVATE_POOL_PEERING_VPC_NAME更改下列內容:
- RESERVED_RANGE_NAME:用於代管 Cloud Build 私有集區的私有 IP 位址範圍名稱。
- PRIVATE_POOL_PEERING_VPC_NAME:要與 Cloud Build 私人集區網路對等互連的虛擬私有雲網路名稱。
啟用匯出自訂路徑,向私人集區宣傳 GKE 叢集控制層網路:
gcloud compute networks peerings update servicenetworking-googleapis-com \ --network=PRIVATE_POOL_PEERING_VPC_NAME \ --export-custom-routes \ --no-export-subnet-routes-with-public-ip將 PRIVATE_POOL_PEERING_VPC_NAME 替換為要與 Cloud Build 私人集區網路對等互連的虛擬私有雲網路名稱。
建立與 PRIVATE_POOL_PEERING_VPC_NAME 對等互連的 Cloud Build 私人集區:
gcloud builds worker-pools create PRIVATE_POOL_NAME \ --region=REGION \ --peered-network=projects/$GOOGLE_CLOUD_PROJECT/global/networks/PRIVATE_POOL_PEERING_VPC_NAME更改下列內容:
- PRIVATE_POOL_NAME:Cloud Build 私有集區的名稱。
- REGION:GKE 叢集的區域。在本教學課程中,請使用
us-central1做為地區,也就是您用於虛擬私有雲網路的地區。
您已建立 Cloud Build 私人集區,並與自有專案中的虛擬私有雲網路建立對等互連。
在兩個虛擬私有雲網路之間建立 Cloud VPN 連線
在您自己的專案中,您現在有一個與 Cloud Build 私人集區對等互連的虛擬私有雲網路,以及一個與私人 GKE 叢集對等互連的虛擬私有雲網路。
在本節中,您會在專案的兩個虛擬私有雲網路之間建立 Cloud VPN 連線。這項連線會完成路徑,並允許 Cloud Build 私人集區存取 GKE 叢集。
在 Cloud Shell 中,建立兩個互相連線的高可用性 VPN 閘道。如要建立這些閘道,請按照「建立兩個互相連線的完整設定高可用性 VPN 閘道」一文的說明操作。建立 BGP 工作階段後,設定即完成。按照這些操作說明進行時,請使用下列值:
NETWORK_1專用的「PRIVATE_POOL_PEERING_VPC_NAME」NETWORK_2專用的「GKE_CLUSTER_VPC_NAME」- REGION (
REGION_1和REGION_2)
設定您建立的四個 BGP 工作階段,以便將路由通告至私人集區虛擬私有雲網路和 GKE 叢集控制層虛擬私有雲網路:
gcloud compute routers update-bgp-peer ROUTER_NAME_1 \ --peer-name=PEER_NAME_GW1_IF0 \ --region=REGION \ --advertisement-mode=CUSTOM \ --set-advertisement-ranges=PRIVATE_POOL_NETWORK/PRIVATE_POOL_PREFIX gcloud compute routers update-bgp-peer ROUTER_NAME_1 \ --peer-name=PEER_NAME_GW1_IF1 \ --region=REGION \ --advertisement-mode=CUSTOM \ --set-advertisement-ranges=PRIVATE_POOL_NETWORK/PRIVATE_POOL_PREFIX gcloud compute routers update-bgp-peer ROUTER_NAME_2 \ --peer-name=PEER_NAME_GW2_IF0 \ --region=REGION \ --advertisement-mode=CUSTOM \ --set-advertisement-ranges=CLUSTER_CONTROL_PLANE_CIDR gcloud compute routers update-bgp-peer ROUTER_NAME_2 \ --peer-name=PEER_NAME_GW2_IF1 \ --region=REGION \ --advertisement-mode=CUSTOM \ --set-advertisement-ranges=CLUSTER_CONTROL_PLANE_CIDR其中,下列值與您建立兩個高可用性 VPN 閘道時使用的名稱相同:
- ROUTER_NAME_1
- PEER_NAME_GW1_IF0
- PEER_NAME_GW1_IF1
- ROUTER_NAME_2
- PEER_NAME_GW2_IF0
- PEER_NAME_GW2_IF1
啟用 Cloud Build 對 GKE 叢集控制層的存取權
專案中的兩個虛擬私有雲網路之間已建立 VPN 連線,現在請啟用 Cloud Build 對 GKE 叢集控制層的存取權。
在 Cloud Shell 中,將私人集區網路範圍新增至 GKE 的控制層授權網路:
gcloud container clusters update PRIVATE_CLUSTER_NAME \ --enable-master-authorized-networks \ --region=REGION \ --master-authorized-networks=PRIVATE_POOL_NETWORK/PRIVATE_POOL_PREFIX更改下列內容:
- PRIVATE_CLUSTER_NAME:私有 GKE 叢集的名稱。
- REGION:GKE 叢集的區域。在本教學課程中,請使用
us-central1做為地區,也就是您用於虛擬私有雲網路的地區。 - PRIVATE_POOL_NETWORK:RESERVED_RANGE_NAME 的第一個 IP 位址。在本教學課程中,您可以使用
192.168.0.0。 - PRIVATE_POOL_PREFIX:
RESERVED_RANGE_NAME 的前置字串。建立的每個私人集區都會使用這個範圍的
/24。在本教學課程中,您可以使用20,最多可建立 16 個集區。
允許用於建構的服務帳戶存取 GKE 叢集控制層:
export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format 'value(projectNumber)') gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member=serviceAccount:SERVICE_ACCOUNT \ --role=roles/container.developer
Cloud Build 私人集區現在可以存取 GKE 叢集控制層。
驗證解決方案
在本節中,您會在私人集區執行的建構步驟中執行 kubectl get nodes 指令,確認解決方案是否正常運作。
在 Cloud Shell 中,建立含有 Cloud Build 建構設定檔的暫時資料夾,並執行
kubectl get nodes指令:mkdir private-pool-test && cd private-pool-test cat > cloudbuild.yaml <<EOF steps: - name: "gcr.io/cloud-builders/kubectl" args: ['get', 'nodes'] env: - 'CLOUDSDK_COMPUTE_REGION=REGION' - 'CLOUDSDK_CONTAINER_CLUSTER=PRIVATE_CLUSTER_NAME' options: workerPool: 'projects/$GOOGLE_CLOUD_PROJECT/locations/REGION/workerPools/PRIVATE_POOL_NAME' EOF更改下列內容:
- REGION:GKE 叢集的區域。在本教學課程中,請使用
us-central1做為地區,也就是您用於虛擬私有雲網路的地區。 - PRIVATE_CLUSTER_NAME:私有 GKE 叢集的名稱。
- PRIVATE_POOL_NAME:Cloud Build 私有集區的名稱。
- REGION:GKE 叢集的區域。在本教學課程中,請使用
啟動建構工作:
gcloud builds submit --config=cloudbuild.yaml確認輸出內容是 GKE 叢集中的節點清單。主控台顯示的建構記錄會包含類似下方的表格:
NAME STATUS ROLES AGE VERSION gke-private-default-pool-3ec34262-7lq9 Ready <none> 9d v1.19.9-gke.1900 gke-private-default-pool-4c517758-zfqt Ready <none> 9d v1.19.9-gke.1900 gke-private-default-pool-d1a885ae-4s9c Ready <none> 9d v1.19.9-gke.1900
您現在已確認私人集區中的工作站可以存取 GKE 叢集。您可以使用這項存取權,透過 Cloud Build 部署應用程式至這個私人 GKE 叢集。
疑難排解
如果您在本教學課程中遇到問題,請參閱下列文件:
清除所用資源
為避免因為本教學課程所用資源,導致系統向 Google Cloud 收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除專案
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
刪除個別資源
在 Cloud Shell 中刪除 GKE 叢集:
gcloud container clusters delete PRIVATE_CLUSTER_NAME \ --region=REGION \ --async執行這項指令時,系統會自動刪除 VPC 網路對等互連。
刪除 Cloud Build 私人集區:
gcloud builds worker-pools delete PRIVATE_POOL_NAME \ --region=REGION刪除服務供應商虛擬私有雲網路與 PRIVATE_POOL_PEERING_VPC_NAME 之間的私人連線:
gcloud services vpc-peerings delete \ --network=PRIVATE_POOL_PEERING_VPC_NAME \ --async刪除用於私人集區的具名 IP 位址範圍:
gcloud compute addresses delete RESERVED_RANGE_NAME \ --global刪除這四個 VPN 通道。使用您在「建立 VPN 通道」中指定的名稱。
gcloud compute vpn-tunnels delete \ TUNNEL_NAME_GW1_IF0 \ TUNNEL_NAME_GW1_IF1 \ TUNNEL_NAME_GW2_IF0 \ TUNNEL_NAME_GW2_IF1 \ --region=REGION刪除這兩個 Cloud Router。使用您在「建立 Cloud Router」中指定的名稱。
gcloud compute routers delete \ ROUTER_NAME_1 \ ROUTER_NAME_2 \ --region=REGION刪除這兩個 VPN 閘道。使用您在建立高可用性 VPN 閘道時指定的名稱。
gcloud compute vpn-gateways delete \ GW_NAME_1 \ GW_NAME_2 \ --region=REGION刪除 GKE_SUBNET_NAME,這是代管 GKE 叢集節點的子網路:
gcloud compute networks subnets delete GKE_SUBNET_NAME \ --region=REGION刪除兩個虛擬私有雲網路 PRIVATE_POOL_PEERING_VPC_NAME 和 GKE_CLUSTER_VPC_NAME:
gcloud compute networks delete \ PRIVATE_POOL_PEERING_VPC_NAME \ GKE_CLUSTER_VPC_NAME
後續步驟
- 瞭解如何在私人集區中執行建構作業。
- 在可存取控制層的私人 GKE 叢集中執行 Proxy。
- 瞭解如何從 Cloud Build 部署至 GKE。
- 歡迎自行試用其他 Google Cloud 功能,請參考我們的教學課程。