本頁說明如何使用區域拓撲,指示 Google Kubernetes Engine (GKE) 在特定 Google Cloud 區域的節點上執行 Pod。這類刊登位置適用於下列情況:
- Pod 必須存取儲存在可用區 Compute Engine 永久磁碟中的資料。
- Pod 必須與其他可用區資源 (例如 Cloud SQL 執行個體) 一併執行。
您也可以搭配使用區域放置位置和拓撲感知流量路由,縮短用戶端與工作負載之間的延遲時間。如要進一步瞭解拓撲感知流量轉送,請參閱「拓撲感知轉送」。
使用區域拓撲控管 Pod 配置是進階 Kubernetes 機制,只有在需要 Pod 在特定區域中執行的情況下才應使用。在多數正式環境中,建議您盡可能使用區域性資源 (GKE 預設值)。
可用區配置方法
可用區拓撲內建於 Kubernetes,並具有 topology.kubernetes.io/zone: ZONE 節點標籤。如要讓 GKE 將 Pod 放在特定區域,請使用下列其中一種方法:
- nodeAffinity:在 Pod 規格中,為一或多個 Google Cloud 區域指定 nodeAffinity 規則。這個方法比 nodeSelector 更有彈性,因為您可以將 Pod 放在多個可用區。
nodeSelector:在單一 Google Cloud 可用區的 Pod 規格中指定 nodeSelector。
運算類別:設定 Pod 使用 GKE 運算類別。 這種做法可讓您定義優先區域集清單。 Google Cloud 當這些可用區有節點時,工作負載就能動態移至最偏好的可用區組合。詳情請參閱「關於自訂運算級別」。
注意事項
使用可用區拓撲進行可用區 Pod 部署時,請注意下列事項:
- 叢集必須與要求的區域位於相同 Google Cloud 區域。
- 在 Standard 叢集中,您必須使用自動佈建節點功能,或在要求的可用區中建立含有節點的節點集區。Autopilot 叢集會自動為您管理這項程序。
- 標準叢集必須是區域叢集。
定價
區域拓撲是 Kubernetes 的排程功能,GKE 提供這項功能時不會額外收費。
如需定價詳細資料,請參閱 GKE 定價。
事前準備
開始之前,請務必先完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
- 請確認您在要放置 Pod 的可用區所在的Google Cloud 區域中,已有現有的 GKE 叢集。如要建立新叢集,請參閱「建立 Autopilot 叢集」。
使用 nodeAffinity 將 Pod 放在多個可用區
Kubernetes nodeAffinity 提供彈性的排程控制機制,支援多個標籤選取器和邏輯運算子。如要讓 Pod 在一組區域中執行 (例如 us-central1-a 或 us-central1-f),請使用 nodeAffinity。
將下列資訊清單儲存為
multi-zone-affinity.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx-multi-zone template: metadata: labels: app: nginx-multi-zone spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - us-central1-a - us-central1-f這個資訊清單會建立含有三個副本的 Deployment,並根據節點可用性,將 Pod 放置在
us-central1-a或us-central1-f中。請確認叢集位於
us-central1區域。如果叢集位於不同區域,請將資訊清單值欄位中的可用區變更為叢集區域中的有效可用區。選用:如要佈建 TPU VM,請使用 AI 可用區,例如
us-central1-ai1a。AI 可用區是專門的地點,經過最佳化調整,可處理 Google Cloud 區域內的 AI/機器學習工作負載。建立 Deployment:
kubectl create -f multi-zone-affinity.yamlGKE 會在其中一個指定可用區的節點中建立 Pod。多個 Pod 可能會在同一個節點上執行。您也可以選擇使用 Pod 反親和性,指示 GKE 將每個 Pod 放在不同的節點上。
使用 nodeSelector 將 Pod 放在單一可用區
如要將 Pod 放在單一可用區,請在 Pod 規格中使用 nodeSelector。nodeSelector 等於指定單一可用區的 requiredDuringSchedulingIgnoredDuringExecution nodeAffinity 規則。
將下列資訊清單儲存為
single-zone-selector.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: nginx-singlezone spec: replicas: 3 selector: matchLabels: app: nginx-singlezone template: metadata: labels: app: nginx-singlezone spec: nodeSelector: topology.kubernetes.io/zone: "us-central1-a" containers: - name: nginx image: nginx:latest ports: - containerPort: 80這份資訊清單會告知 GKE 將 Deployment 中的所有副本放置在
us-central1-a可用區。建立 Deployment:
kubectl create -f single-zone-selector.yaml
使用運算類別,優先在所選可用區中放置 Pod
GKE 運算類別提供控制機制,可讓您定義節點設定優先順序清單。可用區偏好設定可讓您定義要 GKE 將 Pod 放置在哪些可用區。
使用位置區域優先順序
如要使用位置可用區優先順序,在運算類別中定義可用區偏好設定,必須使用 GKE 1.33.1-gke.1545000 以上版本。
以下範例會建立運算級別,指定 Pod 的偏好可用區清單。
這些步驟假設叢集位於 us-central1 區域。如果叢集位於其他區域,請將資訊清單中的可用區值變更為叢集區域中的有效可用區。
將下列資訊清單儲存為
zones-custom-compute-class.yaml:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: zones-custom-compute-class spec: priorities: - location: zones: [us-central1-a, us-central1-b] - location: zones: [us-central1-c] activeMigration: optimizeRulePriority: true nodePoolAutoCreation: enabled: true whenUnsatisfiable: ScaleUpAnyway這項運算類別資訊清單會變更縮放行為,如下所示:
- GKE 會嘗試將 Pod 放在
us-central1-a或us-central1-b中。 - 如果
us-central1-a和us-central1-b沒有可用容量,GKE 會嘗試將 Pod 放置在us-central1-c中。 - 如果
us-central1-c沒有可用容量,whenUnsatisfiable: ScaleUpAnyway欄位會讓 GKE 將 Pod 放在該區域中的任何可用可用區。 - 如果運算類別中優先順序較高的可用區稍後可用,
activeMigration.optimizeRulePriority: true欄位會讓 GKE 將 Pod 從優先順序較低的可用區移至該可用區。這項遷移作業會使用 Pod 中斷預算,確保服務可用性。
- GKE 會嘗試將 Pod 放在
建立自訂 Compute Class:
kubectl create -f zones-custom-compute-class.yamlGKE 會建立工作負載可參照的自訂運算類別。
將下列資訊清單儲存為
custom-compute-class-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: nginx-zonal-preferences spec: replicas: 3 selector: matchLabels: app: nginx-zonal-preferences template: metadata: labels: app: nginx-zonal-preferences spec: nodeSelector: cloud.google.com/compute-class: "zones-custom-compute-class" containers: - name: nginx image: nginx:latest ports: - containerPort: 80建立 Deployment:
kubectl create -f custom-compute-class-deployment.yaml
使用位置 zoneTypes 優先順序
如要在運算類別中定義可用區偏好設定,並使用位置區域類型優先順序,必須使用 GKE 1.35.2-gke.1842000 以上版本。為 Pod 選取區域類型後,系統會視您的設定使用或建立新的節點集區,涵蓋特定類型的所有區域。
您可以在運算類別中指定下列區域類型:
STANDARD:區域中的一般用途 Google Cloud 可用區。建議用於非機器學習工作負載。AI:專為 AI/加速器容量最佳化的特殊可用區。建議用於 AI/機器學習工作負載。CLUSTER_DEFAULT:叢集autoprovisioning-locations中指定的可用區 (如為空白,則為叢集的位置)。
如要進一步瞭解標準可用區和 AI 可用區,請參閱「關於 AI 可用區」一文。
合併欄位的限制
在同一個優先順序項目中,您無法將 zoneTypes 欄位與 location.zones 欄位或 reservations.specific 欄位合併。只要將 zoneTypes 欄位和 location.zones 欄位放在不同的優先順序項目中,即可在同一個運算類別中使用這兩個欄位。
此外,priorityDefaults 欄位會套用至運算類別中的每個優先順序。這項規則的影響是,在 priorityDefaults 欄位中設定 zoneTypes 欄位,會導致您無法在任何優先順序中使用 location.zones 欄位或 reservations.specific 欄位。
有效範例:優先順序不同
以下範例有效,因為 zones 和 zoneTypes 是在不同的優先順序項目中指定:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: valid-zonal-preferences
spec:
priorities:
- location:
zones: [us-central1-a]
- location:
zoneTypes: [AI]
無效示例:優先順序相同
以下範例無效,因為 zones 和 zoneTypes 是在同一個優先順序項目中指定:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: invalid-same-priority
spec:
priorities:
- location:
zones: [us-central1-a]
zoneTypes: [AI] # Error: mutually exclusive
無效範例:與預設值衝突
以下範例無效,因為在 priorityDefaults 區段中設定 zoneTypes 欄位,會與優先順序項目的 zones 欄位衝突:
apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
name: invalid-defaults-conflict
spec:
priorityDefaults:
location:
zoneTypes: [AI]
priorities:
- location:
zones: [us-central1-a] # Error: merges with defaults
使用範例
以下範例會建立運算類別,指定 Pod 的偏好區域類型清單。
將下列資訊清單儲存為
zone-types-custom-compute-class.yaml:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: zone-types-custom-compute-class spec: priorities: - location: zones: [us-central1-c] - location: zoneTypes: - AI - location: zoneTypes: - CLUSTER_DEFAULT activeMigration: optimizeRulePriority: true nodePoolAutoCreation: enabled: true whenUnsatisfiable: ScaleUpAnyway這個運算類別資訊清單會變更資源調度行為,如下所示:
- GKE 會嘗試將 Pod 放在
us-central1-c可用區。 - 如果
us-central1-c沒有可用容量,GKE 會嘗試將 Pod 放在該區域中的任何AI可用區。 - 如果所有
AI可用區都沒有可用容量,GKE 會嘗試將 Pod 放在任何CLUSTER_DEFAULT可用區。 - 如果所有
CLUSTER_DEFAULT可用區都沒有可用容量,whenUnsatisfiable: ScaleUpAnyway欄位會讓 GKE 將 Pod 放在該區域中任何可用的可用區。 - 如果運算類別中優先順序較高的可用區稍後可用,
activeMigration.optimizeRulePriority: true欄位會讓 GKE 將 Pod 從任何優先順序較低的可用區移至該可用區。這項遷移作業會使用 Pod 中斷預算,確保服務可用性。
- GKE 會嘗試將 Pod 放在
建立自訂 Compute 類別:
kubectl create -f zone-types-custom-compute-class.yamlGKE 會建立工作負載可參照的自訂運算類別。
將下列資訊清單儲存為
custom-compute-class-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: nginx-zonal-preferences spec: replicas: 3 selector: matchLabels: app: nginx-zonal-preferences template: metadata: labels: app: nginx-zonal-preferences spec: nodeSelector: cloud.google.com/compute-class: "zone-types-custom-compute-class" containers: - name: nginx image: nginx:latest ports: - containerPort: 80建立 Deployment:
kubectl create -f custom-compute-class-deployment.yaml
NAP 如何評估 zoneTypes
判斷是否要重複使用現有節點集區或建立新節點集區時,自動佈建節點 (NAP) 通常會要求節點集區的現有可用區與您要求的 zoneTypes 完全相符。如果更新優先順序以納入更廣泛的區域類型 (例如從 [AI] 移至 [AI, STANDARD]),NAP 會佈建新的節點集區,以符合新的確切形狀。
依機型修剪
如果某個機型 (例如 h3-standard-88) 僅適用於類型定義的可用區子集 (例如僅適用於 us-central1-a),GKE 會自動將節點集區位置清單縮減為僅包含實際提供該硬體的可用區。
指定 AI 可用區
AI 可用區是專門的可用區,用於 AI/機器學習訓練和推論工作負載。這些區域提供大量機器學習加速器容量。詳情請參閱 AI 可用區說明文件。
在本文件和 GKE 說明文件中,「標準可用區」或「可用區」是指 Google Cloud 區域內的非 AI 可用區。
在 GKE 中使用 AI 專區前,請先考量下列特性:
- AI 可用區與標準可用區實體隔離,可提供額外的儲存空間和電力。這種分離可能會導致延遲時間變長,但一般來說,AI/機器學習工作負載可容許這種情況。
- AI 可用區的後置字串會加上
ai標記。舉例來說,us-central1區域中的 AI 可用區名稱為us-central1-ai1a。 - 目前僅支援 TPU VM。
- 叢集的控制層會在與 AI 可用區相同區域的一或多個標準可用區中執行。
如要執行未附加 TPU 的 VM,必須符合下列條件:
- 您已在同一可用區中執行其他使用 TPU VM 的工作負載。
- 非 TPU VM 可以是 Spot VM、與預留項目綁定,或是節點集區的一部分,且具有特定的加速器與一般用途 VM 比例。
AI 可用區與相同區域內具有相同後置字串的標準可用區共用元件,例如網路連線和軟體推出。如果是高可用性工作負載,建議您使用不同可用區。舉例來說,請避免同時使用
us-central1-ai1a和us-central1-a來確保高可用性。
根據預設,GKE 不會在 AI 區域部署工作負載。如要使用 AI 專區,請設定下列任一選項:
- (建議) ComputeClasses:將最高優先順序設為在 AI 可用區中要求隨選 TPU。您可以透過 ComputeClass,為工作負載定義優先順序清單的硬體設定。如需範例,請參閱「關於 ComputeClasses」。
- 自動佈建節點:在 Pod 規格中使用
nodeSelector或nodeAffinity,指示自動佈建節點功能在 AI 可用區中建立節點集區。如果工作負載未明確指定 AI 可用區,節點自動佈建功能在建立新的節點集區時,只會考慮標準可用區或--autoprovisioning-locations中的可用區。這項設定可確保未執行 AI/機器學習模型的工作負載,仍會保留在標準可用區中,除非您明確設定其他選項。如要查看使用nodeSelector的資訊清單範例,請參閱「設定自動建立節點的預設可用區」。 - GKE Standard:如果您直接管理節點集區,請在建立節點集區時,於
--node-locations旗標中使用 AI 可用區。如需範例,請參閱「在 GKE Standard 中部署 TPU 工作負載」。
確認 Pod 放置位置
如要驗證 Pod 的放置位置,請列出 Pod 並檢查節點標籤。單一節點中可能會執行多個 Pod,因此如果您使用 nodeAffinity,可能不會看到 Pod 分散在多個區域。
列出 Pod:
kubectl get pods -o wide輸出內容會列出執行中的 Pod 和對應的 GKE 節點。
說明節點:
kubectl describe node NODE_NAME | grep "topology.kubernetes.io/zone"將
NODE_NAME替換為節點名稱。輸出結果會與下列內容相似:
topology.kubernetes.io/zone: us-central1-a
如要讓 GKE 將 Pod 平均分散到多個可用區,以便在多個故障域中改善容錯移轉,請使用 topologySpreadConstraints。