建立叢集
本頁說明如何在 Kubernetes 1.31.6-gke.200 版的 Azure 專用 GKE 中建立叢集和節點集區。
事前準備
如要完成本頁的步驟,請執行下列操作:
請按照「設定必要條件」一文中的步驟操作。
選擇要在多個區域還是單一區域執行控制層。
選取無類別跨網域路由 (CIDR) 範圍,提供給叢集。
控制層可用區位置
根據預設,Azure 上的 GKE 會在所選區域的三個可用區中,將個別控制層副本放在同一個子網路。您可以選擇這些可用區和子網路。
如要使用預設的控制層副本放置位置,請跳至「選取叢集的 CIDR 範圍」。
Azure NAT 閘道和叢集控制層
每個控制層副本也必須連線至 Google 代管的管理服務,才能正常運作。
如果您使用 Azure NAT 閘道提供外送連線,請務必考量區域故障對叢集控制平面的影響。一個 NAT 閘道端點會隔離到單一區域,或是區域/非區域,這會造成單點故障。
如要在單一區域中放置控制層副本,請使用單一子網路和區域。如果您使用 NAT 閘道進行輸出連線,請務必將端點放在同一個區域。
如要在兩個或三個區域中放置副本,可以在建立叢集時傳遞子網路和區域清單。如果您傳遞兩個子網路和區域,GKE on Azure 會將兩個副本放在第一個提供的區域。當您傳入三個子網路和區域時,Azure 上的 GKE 會將副本放置在每個子網路中。詳情請參閱「將副本放在特定子網路中」。
如要進一步瞭解如何設定 Azure 子網路和區域,確保高可用性,請參閱 Azure 說明文件中的「使用區域堆疊進行區域隔離」一文。
將副本放在特定子網路中
這個部分為選用。
如要控管控制層副本的放置區域,請使用 --replica-placements
標記,並在建立叢集時傳遞子網路 ID 和區域清單。您最多可以使用三個子網路和可用區,放置控制層副本。
如要格式化子網路清單,請執行下列步驟。
使用
az
指令列工具擷取 Azure 子網路 ID:az network vnet subnet show \ --resource-group=VNET_RESOURCE_GROUP_NAME --vnet-name=VNET_NAME \ --name SUBNET_NAME --query "id" -otsv
更改下列內容:
CLUSTER_RESOURCE_GROUP_NAME
:現有資源群組名稱,您要在其中執行叢集VNET_RESOURCE_GROUP_NAME
:包含 VNet 的資源群組名稱VNET_NAME
:您的 VNet 名稱SUBNET_NAME
:子網路名稱
輸出內容是子網路的 ID。Azure 子網路 ID 如下所示:
/subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/VNET_NAME/subnets/SUBNET_NAME
針對要在其中建立控制層副本的每個子網路,重複執行這項指令。將子網路 ID 複製到文字編輯器,以供下一個步驟使用。
建立以半形逗號分隔的子網路 ID 和 Azure 可用區清單,並以半形冒號分隔子網路和可用區。舉例來說,如要在區域 1 的
subnet1
、區域 2 的subnet2
和區域 3 的subnet3
中建立控制層副本,請使用下列字串:/subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/VNET_NAME/subnets/subnet1:1,/subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/VNET_NAME/subnets/subnet2:2,/subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/VNET_NAME/subnets/subnet3:3
複製這個字串,並在建立叢集時,將其做為
--replica-placements
旗標的值。
選取叢集的 CIDR 範圍
在 Azure 上的 GKE 中建立叢集時,您需要提供用於 Pod 和服務的 IPv4 位址範圍。
這些 IP 範圍是使用無類別跨網域路由 (CIDR) 標記法指定,例如 100.64.0.0/16
。
建議範圍
建議您為 Service 和 Pod 使用下列 CIDR 範圍:
- 服務:100.64.0.0/16
- Pod:100.96.0.0/11
這些範圍夠大,可讓您順利擴充叢集。
下列各節會提供更多詳細資料。
選取範圍的詳細資料
Azure 上的 GKE 會為 Pod 和 Service 使用疊加網路,因此這些網路的 IP 範圍不需要在 VNet 內可路由傳輸。您使用的任何 IP 範圍都必須保證可用。詳情請參閱「Dataplane V2」。
Pod 和 Service IP 範圍可以與 VNet 網路重疊,但不得涵蓋控制層或節點集區子網路 IP 範圍。
Pod 和 Service 的 IP 範圍必須落在下列其中一個私人 IP 範圍內:
10.0.0.0/8
、172.16.0.0/12
、192.168.0.0/16
- 私人 IP 位址 (RFC 1918)100.64.0.0/10
- 共用位址空間 (RFC 6598)192.0.0.0/24
- IETF 通訊協定指派項目 (RFC 6890)192.0.2.0/24
、198.51.100.0/24
、203.0.113.0/24
- 說明文件 (RFC 5737)192.88.99.0/24
- IPv6 至 IPv4 中繼 (已淘汰) (RFC 7526)198.18.0.0/15
- 基準測試 (RFC 2544)
建議使用 100.64.0.0/10
(RFC 6598) 內的 IP 範圍。這個範圍是為電信級 NAT 保留,您的 VNet 可能不會使用。
舉例來說,下列是有效的設定,其中 Pod、服務和節點網路不會重疊 (VNet 使用 RFC 1918 私人 IP 位址,而 Pod 和服務網路則疊加在 RFC 6598 私人 IP 上)。
- VNet 網路:
10.0.0.0/16
、172.16.1.0/24
、172.16.2.0/24
- Pod 網路:
100.65.0.0/16
- 服務網路:
100.66.0.0/16
即使 Pod 和 Service 網路與 VNet 網路重疊,下列設定仍有效,因為與控制層副本沒有重疊。
- 虛擬網路:
10.0.0.0/16
- Pod 網路:
10.0.1.0/24
- 服務網路:
10.0.2.0/24
- 控制平面副本子網路:
10.0.3.0/24
、10.0.4.0/24
、10.0.5.0/24
下列設定無效,因為 Pod IP 範圍與控制層網路重疊。這項重疊可能會導致工作負載無法與 VNet 網路中的控制層副本通訊:
- 虛擬網路:
10.0.0.0/16
- Pod 網路:
10.0.1.0/24
- 服務網路:
10.1.0.0/24
- 控制平面副本子網路:
10.0.1.0/24
、10.0.2.0/24
、10.0.3.0/24
Pod 位址範圍的詳細資料
Kubernetes 會從 Pod 位址範圍,將位址分配給 Pod 物件。叢集的 Pod 範圍會分割成較小的範圍,供每個節點使用。當 Pod 排程在特定節點上時,Kubernetes 會從節點的範圍指派 Pod IP 位址。
如要計算 Pod 位址範圍的大小,您需要估算叢集中的節點數量,以及要在每個節點上執行的 Pod 數量。
下表根據您打算執行的節點和 Pod 數量,提供 Pod CIDR 範圍的大小建議。
Pod 位址範圍表
Pod 位址範圍 | Pod IP 位址上限 | 節點數量上限 | Pod 數量上限 |
---|---|---|---|
/24 最小的 Pod 位址範圍 |
256 個地址 | 1 個節點 | 110 個 Pod |
/23 | 512 個地址 | 2 個節點 | 220 Pods |
/22 | 1,024 個地址 | 4 個節點 | 440 Pods |
/21 | 2,048 個地址 | 8 個節點 | 880 Pods |
/20 | 4,096 個地址 | 16 個節點 | 1,760 個 Pod |
/19 | 8,192 個地址 | 32 個節點 | 3,520 個 Pod |
/18 | 16,384 個地址 | 64 個節點 | 7,040 個 Pod |
/17 | 32,768 個地址 | 128 個節點 | 14,080 個 Pod |
/16 | 65,536 個地址 | 256 個節點 | 28,160 個 Pod |
/15 | 131,072 個地址 | 512 個節點 | 56,320 個 Pod |
/14 | 262,144 個位址 | 1,024 個節點 | 112,640 個 Pod |
服務位址範圍的詳細資料
Kubernetes 會為服務物件分配虛擬 IP 位址,例如這個位址範圍內的負載平衡器。
如要計算 Service 位址範圍的大小,您需要估算叢集中所需的服務數量。
下表根據您打算執行的 Service 數量,提供 Service CIDR 範圍的大小建議。
服務地址範圍表
服務位址範圍 | 服務數量上限 |
---|---|
/27 最小的 Service 位址範圍 |
32 項服務 |
/26 | 64 項服務 |
/25 | 128 項服務 |
/24 | 256 項服務 |
/23 | 512 個服務 |
/22 | 1,024 個服務 |
/21 | 2,048 個服務 |
/20 | 4,096 個服務 |
/19 | 8,192 項服務 |
/18 | 16,384 個服務 |
/17 | 32,768 項服務 |
/16 最大的可能服務位址範圍 |
65,536 個服務 |
向 Azure 進行驗證
Azure 上的 GKE 提供兩種 Azure 驗證方法:工作負載身分聯盟和建立用戶端憑證。建議使用 workload identity federation 驗證,因為這種方式更簡單安全。
workload identity federation
透過工作負載身分聯盟,GKE on Azure 可使用 Google 服務帳戶向 Azure 進行驗證,以便後續管理 Azure AD 應用程式中的資源。與 AzureClient 相比,您不需要管理憑證,也不必手動上傳至 Azure AD。
如要在 Azure AD 應用程式中設定同盟身分憑證,請執行下列指令。請注意,每個 Azure AD 應用程式最多可新增 20 個憑證。
將 Azure 應用程式 ID 儲存至環境變數:
APPLICATION_ID=$(az ad app list --all \ --query "[?displayName=='APPLICATION_NAME'].appId" --output tsv) PROJECT_ID="$(gcloud config get-value project)" PROJECT_NUMBER=$(gcloud projects describe "$PROJECT_ID" \ --format "value(projectNumber)")
APPLICATION_NAME
:您在建立 Azure Active Directory 應用程式時使用的 Azure AD 應用程式名稱。
建立名為
credential.json
的 JSON 檔案。{ "name": "CREDENTIAL_NAME", "issuer": "https://accounts.google.com", "subject": "service-PROJECT_NUMBER@gcp-sa-gkemulticloud.iam.gserviceaccount.com", "audiences": ["api://AzureADTokenExchange"], "description": "Allow GKE on Azure to authenticate to the Azure AD application using a Google service account." }
CREDENTIAL_NAME
:憑證名稱。PROJECT_NUMBER
:代管叢集的 Google Cloud 專案數量。
在 Azure AD 應用程式中建立同盟身分識別憑證:
az ad app federated-credential create --id "${APPLICATION_ID}" --parameters credential.json
詳情請參閱 Azure 說明文件「Azure AD workload identity federation with Google Cloud」。
您也可以使用 Terraform 佈建 Azure 聯盟身分憑證。詳情請參閱 azuread_application_federated_identity_credential。
設定憑證後,請為叢集建立或選取 SSH 金鑰組。
建立 SSH 金鑰組
建立叢集時,您需要提供 SSH 金鑰組。如果您已有要使用的金鑰組,請略過這個步驟。
如要建立新的金鑰組,請使用
ssh-keygen
指令列工具:ssh-keygen -m PEM -t rsa -b 4096 -f KEY_PATH
將
KEY_PATH
替換為新私密金鑰的路徑。將金鑰儲存在環境變數中:
SSH_PUBLIC_KEY=$(cat KEY_PATH.pub)
舉例來說,如要在
~/.ssh/anthos-multicloud-key.pub
建立新的金鑰組,並將公開金鑰儲存在環境變數中,請執行下列指令:ssh-keygen -m PEM -t rsa -b 4096 -f ~/.ssh/anthos-multicloud-key SSH_PUBLIC_KEY=$(cat ~/.ssh/anthos-multicloud-key.pub)
將公開金鑰儲存至環境變數後,即可建立叢集。
選取機群主專案
機群是將叢集劃分為較大群組的概念。Google Cloud 透過機群,您可以管理多個雲端環境中的多個叢集,並在這些叢集中套用一致的政策。建立叢集時,GKE Multi-Cloud API 會自動向機群註冊叢集。
建立叢集時,請指定機群主機專案,叢集將從該專案進行管理。由於 Azure 上的 GKE 會使用叢集名稱做為 Fleet 成員名稱,因此請務必確保叢集名稱在整個 Fleet 中不得重複。
跨專案註冊
如要使用叢集所在 Google Cloud 專案以外的 Fleet Host 專案,您必須將額外的 IAM 政策繫結套用至 Multi-Cloud Service Agent 服務帳戶。服務帳戶即可透過 Fleet 主專案管理 Fleet。
如要將服務代理程式新增至專案,請執行下列指令:
gcloud beta services identity create --service=gkemulticloud.googleapis.com \ --project=CLUSTER_PROJECT_NUMBER
將
CLUSTER_PROJECT_NUMBER
替換為您的 Google Cloud 專案編號。使用下列指令指派這個繫結:
gcloud projects add-iam-policy-binding FLEET_PROJECT_ID \ --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@gcp-sa-gkemulticloud.iam.gserviceaccount.com" \ --role="roles/gkemulticloud.serviceAgent"
更改下列內容:
FLEET_PROJECT_ID
:機群主專案的Google Cloud 專案CLUSTER_PROJECT_NUMBER
:您的 Google Cloud 專案編號
Multi-Cloud Service Agent 帳戶名稱的格式如下:
service-CLUSTER_PROJECT_NUMBER@gcp-sa-gkemulticloud.iam.gserviceaccount.com
。
您可以在 Google Cloud 控制台的「Service account」(服務帳戶) 頁面中找到服務帳戶。如要進一步瞭解如何找出專案編號,請參閱「識別專案」。
建立叢集
如要建立叢集,請執行下列指令:
將 Azure 資源群組、VNet 和子網路 ID 儲存至環境變數:
SUBSCRIPTION_ID=$(az account show --query "id" --output tsv) TENANT_ID=$(az account list \ --query "[?id=='${SUBSCRIPTION_ID}'].{tenantId:tenantId}" --output tsv) CLUSTER_RG_ID=$(az group show --resource-group=CLUSTER_RESOURCE_GROUP_NAME \ --query "id" -otsv) VNET_ID=$(az network vnet show --resource-group=VNET_RESOURCE_GROUP_NAME \ --name=VNET_NAME --query "id" -otsv) SUBNET_ID=$(az network vnet subnet show \ --resource-group=VNET_RESOURCE_GROUP_NAME --vnet-name=VNET_NAME \ --name default --query "id" -otsv)
更改下列內容:
CLUSTER_RESOURCE_GROUP_NAME
:現有資源群組名稱,您要在其中執行叢集VNET_RESOURCE_GROUP_NAME
:包含 VNet 的資源群組名稱VNET_NAME
:VNet 名稱
使用 Google Cloud CLI 建立叢集:
workload identity federation
gcloud container azure clusters create CLUSTER_NAME \ --location GOOGLE_CLOUD_LOCATION \ --fleet-project FLEET_PROJECT \ --azure-tenant-id "${TENANT_ID}" \ --azure-application-id "${APPLICATION_ID}" \ --azure-region AZURE_REGION \ --pod-address-cidr-blocks POD_CIDR \ --service-address-cidr-blocks SERVICE_CIDR \ --vm-size VM_SIZE \ --cluster-version 1.31.6-gke.200 \ --ssh-public-key "$SSH_PUBLIC_KEY" \ --resource-group-id "$CLUSTER_RG_ID" \ --vnet-id "$VNET_ID" \ --subnet-id "$SUBNET_ID" # Optional, see following note \ --tags "control-plane=CLUSTER_NAME" \ --admin-users ADMIN_USERS_LIST
Azure 用戶端
gcloud container azure clusters create CLUSTER_NAME \ --location GOOGLE_CLOUD_LOCATION \ --fleet-project FLEET_PROJECT \ --client CLIENT_NAME \ --azure-region AZURE_REGION \ --pod-address-cidr-blocks POD_CIDR \ --service-address-cidr-blocks SERVICE_CIDR \ --vm-size VM_SIZE \ --cluster-version 1.31.6-gke.200 \ --ssh-public-key "$SSH_PUBLIC_KEY" \ --resource-group-id "$CLUSTER_RG_ID" \ --vnet-id "$VNET_ID" \ --subnet-id "$SUBNET_ID" # Optional, see following note \ --tags "control-plane=CLUSTER_NAME" \ --admin-users ADMIN_USERS_LIST
更改下列內容:
CLUSTER_NAME
:叢集名稱GOOGLE_CLOUD_LOCATION
:管理叢集的 Google Cloud 位置FLEET_PROJECT
,並向機群主機專案註冊叢集。如要從其他Google Cloud 專案管理這個叢集,請參閱跨專案註冊。AZURE_REGION
:與 Google Cloud 區域相關聯的支援 Azure 區域POD_CIDR
:叢集的 Pod 位址範圍,例如10.0.1.0/18
SERVICE_CIDR
:叢集的服務位址範圍VM_SIZE
:a 支援的 Azure VM 大小ADMIN_USERS_LIST
(選用):以半形逗號分隔的清單,列出要授予管理員權限的使用者電子郵件地址,例如「kai@example.com,hao@example.com,kalani@example.com」。預設為建立叢集的使用者CLIENT_NAME
:您的 AzureClient 名稱
檢查叢集的狀態:
gcloud container azure clusters describe CLUSTER_NAME --location GOOGLE_CLOUD_LOCATION
更改下列內容:
CLUSTER_NAME
GOOGLE_CLOUD_LOCATION
輸出內容包含叢集狀態和設定的相關資訊。
授權 Cloud Logging / Cloud Monitoring
GKE on Azure 必須獲得授權,才能建立系統記錄和指標並上傳至Google Cloud。
如要授權 Kubernetes 工作負載身分 gke-system/gke-telemetry-agent
將記錄檔寫入 Google Cloud Logging,以及將指標寫入 Google Cloud Monitoring,
請執行下列指令:
gcloud projects add-iam-policy-binding GOOGLE_PROJECT_ID \
--member="serviceAccount:GOOGLE_PROJECT_ID.svc.id.goog[gke-system/gke-telemetry-agent]" \
--role=roles/gkemulticloud.telemetryWriter
將 GOOGLE_PROJECT_ID
替換為叢集的 Google Cloud 專案 ID。
這個 IAM 繫結會授予 Google Cloud 專案中所有叢集上傳記錄和指標的權限。您只需要在為專案建立第一個叢集後執行這項指令。
除非 Google Cloud 專案中已建立至少一個叢集,否則新增這項 IAM 繫結會失敗。這是因為在建立叢集之前,系統不會佈建所參照的工作負載身分集區 (GOOGLE_PROJECT_ID.svc.id.goog
)。
建立節點集區
建立節點集區前,請先備妥下列項目:
- 使用
az
指令列工具擷取 Azure 子網路 ID 的權限。 - 叢集安全殼層公開金鑰的存取權。
如要建立節點集區,請執行下列指令:
將 Azure VNet 子網路 ID 和 SSH 公開金鑰儲存至環境變數:
SUBNET_ID=$(az network vnet subnet show \ --resource-group=VNET_RESOURCE_GROUP_NAME --vnet-name=VNET_NAME \ --name default --query "id" -otsv) SSH_PUBLIC_KEY=$(cat KEY_PATH.pub)
更改下列內容:
VNET_RESOURCE_GROUP_NAME
:包含 VNet 的資源群組名稱VNET_NAME
:VNet 名稱KEY_PATH
:金鑰組的路徑
使用 Google Cloud CLI 建立節點集區:
gcloud container azure node-pools create NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location GOOGLE_CLOUD_LOCATION \ --node-version 1.31.6-gke.200 \ --vm-size VM_SIZE \ --max-pods-per-node 110 \ --min-nodes MIN_NODES \ --max-nodes MAX_NODES \ --ssh-public-key "${SSH_PUBLIC_KEY}" \ --subnet-id "${SUBNET_ID}"
更改下列內容:
NODE_POOL_NAME
:節點集區的專屬名稱,例如node-pool-1
CLUSTER_NAME
:Azure 中 GKE 叢集的名稱GOOGLE_CLOUD_LOCATION
:管理叢集的Google Cloud 位置VM_SIZE
:a 支援的 Azure VM 大小MIN_NODES
:節點集區中的節點數量下限。詳情請參閱叢集自動調度器MAX_NODES
:節點集區中的節點數量上限
檢查節點集區的狀態:
gcloud container azure node-pools describe NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location GOOGLE_CLOUD_LOCATION
更改下列內容:
NODE_POOL_NAME
:節點集區的專屬名稱,例如node-pool-1
CLUSTER_NAME
:Azure 中 GKE 叢集的名稱GOOGLE_CLOUD_LOCATION
:管理叢集的Google Cloud 位置
輸出內容會顯示節點集區的狀態,包括
PROVISIONING
或RUNNING
。
後續步驟
- 設定 kubectl 的叢集存取權。
- 建立節點集區。
- 請嘗試快速入門導覽課程,啟動第一個工作負載。
- 請參閱
gcloud container clusters create
的參考說明文件。 - 建立叢集時發生問題嗎?詳情請參閱「疑難排解」一節。