使用 Cloud Build 私人集區存取私人 Google Kubernetes Engine 叢集


本教學課程說明如何使用 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 網路中執行。這些虛擬私有雲網路會透過 Google Cloud與您自己的虛擬私有雲網路建立對等互連。不過,虛擬私有雲網路對等互連「不支援遞移對等互連」,因此使用 Cloud Build 私人集區時可能會受到限制。本教學課程介紹的解決方案使用 Cloud VPN,讓 Cloud Build 私人集區中的工作站存取私人 GKE 叢集的控制平面。

本教學課程假設您已熟悉 Google Kubernetes Engine、Cloud Build、gcloud 指令、虛擬私有雲網路對等互連和 Cloud VPN。

架構總覽

建立無法透過用戶端存取公開端點的私人 GKE 叢集時,用戶端只能使用私人 IP 位址存取 GKE 叢集控制層。只有在可存取 VPC 網路且位於授權網路的執行個體上執行時,kubectl 等用戶端才能與控制層通訊。

如要使用 Cloud Build 部署應用程式至這個私人 GKE 叢集,您必須使用 Cloud Build 私人集區存取 GKE 叢集。私人集區是一組工作站執行個體,會在 Google 擁有的 Google Cloud 專案中執行,並透過虛擬私有雲網路對等互連連線,與您的虛擬私有雲網路對等互連。在這個設定中,工作站執行個體可以與 GKE 叢集控制層的私人 IP 位址通訊。

不過,GKE 叢集控制層也會在 Google 擁有的專案中執行,並使用 Private Service Connect (PSC) 連線至您的 VPC 網路。虛擬私有雲網路對等互連不支援傳遞對等互連,因此封包無法在 Cloud Build 私人集區和 GKE 叢集控制層之間直接路由傳送。

如要讓 Cloud Build 工作人員執行個體存取 GKE 叢集控制平面,您可以對等互連私人集區,並使用 PSC 將 GKE 叢集控制平面與您擁有的兩個 VPC 網路連線,然後使用 Cloud VPN 連線這兩個 VPC 網路。透過這項對等互連和連線,虛擬私有雲通道的每一端都能通告私有集區和 GKE 叢集控制層網路,進而完成路徑。

下圖顯示本教學課程中使用的資源:

VPN 通道,完成 Cloud Build 私人集區與 GKE 叢集控制層之間的路由。

建議您在同一個Google Cloud 區域中建立本教學課程使用的所有資源,以降低延遲。如果您的實作需要跨區域通訊,VPN 通道可以跨越兩個不同區域。您擁有的兩個虛擬私有雲網路也可以屬於不同專案。

目標

  • 建立私人 GKE 叢集。
  • 設定 Cloud Build 私人集區。
  • 在兩個 VPC 網路之間建立高可用性 VPN 連線。
  • 啟用封包在兩個虛擬私有雲網路對等互連和虛擬私有雲連線之間的路由。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。

事前準備

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Cloud Build, Google Kubernetes Engine, and Service Networking APIs.

    Enable the APIs

  4. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

在自己的專案中建立兩個虛擬私有雲網路

在本節中,您將建立兩個虛擬私有雲網路,以及 GKE 叢集節點的子網路。

  1. 在 Cloud Shell 中建立第一個虛擬私有雲網路 (在上一個圖表中稱為「私人集區對等互連虛擬私有雲網路」)。您不需要在這個網路中建立子網路。

    gcloud compute networks create PRIVATE_POOL_PEERING_VPC_NAME \
        --subnet-mode=CUSTOM
    

    PRIVATE_POOL_PEERING_VPC_NAME 替換為要與 Cloud Build 私人集區網路對等互連的虛擬私有雲網路名稱。

  2. 建立第二個虛擬私有雲網路 (在上圖中稱為「GKE 叢集虛擬私有雲網路」):

    gcloud compute networks create GKE_CLUSTER_VPC_NAME \
        --subnet-mode=CUSTOM
    

    請將 GKE_CLUSTER_VPC_NAME 替換為要與 GKE 叢集控制層對等互連的虛擬私有雲網路名稱。

  3. 為 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 叢集控制層連線的 VPC 網路名稱。
    • GKE_SUBNET_RANGEGKE_SUBNET_NAME的 IP 位址範圍。在本教學課程中,您可以使用 10.244.252.0/22
    • REGION:代管 GKE 叢集的 Google Cloud 區域。在本教學課程中,您可以使用 us-central1

您已在自己的專案中設定兩個虛擬私有雲網路,現在可以與其他服務對等互連。

建立私人 GKE 叢集

在本節中,您將建立私人 GKE 叢集。

  1. 在 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 叢集控制層的 VPC 網路名稱。
    • GKE_SUBNET_RANGEGKE_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 叢集。請完成下列步驟:

  1. 擷取 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 做為地區,也就是您用於虛擬私有雲網路的地區。
  2. 啟用匯出自訂路徑,以便向 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 私人集區。

  1. 在 Cloud Shell 中,於 PRIVATE_POOL_PEERING_VPC_NAME VPC 網路中為 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:第一個 IP 位址 RESERVED_RANGE_NAME。在本教學課程中,您可以使用 192.168.0.0
    • PRIVATE_POOL_PREFIXRESERVED_RANGE_NAME 的前置字串。建立的每個私人集區都會使用這個範圍的 /24。在本教學課程中,您可以使用 20,最多可建立十六個集區。
    • PRIVATE_POOL_PEERING_VPC_NAME:要與 Cloud Build 私人集區網路對等互連的 VPC 網路名稱。
    • IP 範圍為 global,因為當 --purposeVPC_PEERING 時,具名 IP 位址範圍必須為 global
  2. 在包含 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 私人集區網路對等互連的 VPC 網路名稱。
  3. 啟用匯出自訂路徑,向私人集區宣傳 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 私人集區網路對等互連的虛擬私有雲網路名稱。

  4. 建立與 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 叢集。

  1. 在 Cloud Shell 中,建立兩個互相連線的高可用性 VPN 閘道。如要建立這些閘道,請按照「建立兩個互相連線的完整設定高可用性 VPN 閘道」一文的說明操作。建立 BGP 工作階段後,設定即完成。按照這些操作說明進行時,請使用下列值:

    • NETWORK_1 專用 PRIVATE_POOL_PEERING_VPC_NAME
    • NETWORK_2 專用 GKE_CLUSTER_VPC_NAME
    • REGION,售價:REGION_1REGION_2
  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 叢集控制平面的存取權。

  1. 在 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:第一個 IP 位址 RESERVED_RANGE_NAME。在本教學課程中,您可以使用 192.168.0.0
    • PRIVATE_POOL_PREFIXRESERVED_RANGE_NAME 的前置字串。建立的每個私人集區都會使用這個範圍的 /24。在本教學課程中,您可以使用 20,最多可建立十六個集區。
  2. 允許用於建構的服務帳戶存取 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 指令,確認解決方案是否正常運作。

  1. 在 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 私有集區的名稱。
  2. 啟動建構工作:

    gcloud builds submit --config=cloudbuild.yaml
    
  3. 確認輸出內容是 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 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。

刪除專案

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

刪除個別資源

  1. 在 Cloud Shell 中刪除 GKE 叢集:

    gcloud container clusters delete PRIVATE_CLUSTER_NAME \
        --region=REGION \
        --async
    

    執行這項指令時,系統會自動刪除 VPC 網路對等互連。

  2. 刪除 Cloud Build 私人集區:

    gcloud builds worker-pools delete PRIVATE_POOL_NAME \
        --region=REGION
    
  3. 刪除服務生產端虛擬私有雲網路與 PRIVATE_POOL_PEERING_VPC_NAME 之間的私人連線:

    gcloud services vpc-peerings delete \
       --network=PRIVATE_POOL_PEERING_VPC_NAME \
       --async
    
  4. 刪除用於私人集區的具名 IP 位址範圍:

    gcloud compute addresses delete RESERVED_RANGE_NAME \
        --global
    
  5. 刪除這四個 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
    
  6. 刪除這兩個 Cloud Router。使用您在「建立 Cloud Router」中指定的名稱。

    gcloud compute routers delete \
        ROUTER_NAME_1 \
        ROUTER_NAME_2 \
        --region=REGION
    
  7. 刪除這兩個 VPN 閘道。使用您在「建立高可用性 VPN 閘道」中指定的名稱。

    gcloud compute vpn-gateways delete \
        GW_NAME_1 \
        GW_NAME_2 \
        --region=REGION
    
  8. 刪除 GKE_SUBNET_NAME,這是代管 GKE 叢集節點的子網路:

    gcloud compute networks subnets delete GKE_SUBNET_NAME \
        --region=REGION
    
  9. 刪除兩個虛擬私有雲網路 PRIVATE_POOL_PEERING_VPC_NAMEGKE_CLUSTER_VPC_NAME

    gcloud compute networks delete \
        PRIVATE_POOL_PEERING_VPC_NAME \
        GKE_CLUSTER_VPC_NAME
    

後續步驟