容量緩衝區會使用 Kubernetes CapacityBuffer 自訂資源定義,主動管理叢集備用容量,藉此提升重要工作負載的回應速度和可靠性。使用容量緩衝區,即可在叢集中明確定義特定數量的未使用節點容量。這項預留容量可確保 GKE 提前佈建節點。
當高優先順序工作負載需要快速擴充時,新工作負載可立即使用閒置容量,不必等待節點佈建。這樣做可盡量減少延遲,並避免需求突然激增時發生資源爭用。
本頁面提供三種設定容量緩衝區的方法:固定副本緩衝區、百分比緩衝區和資源限制緩衝區。
事前準備
開始之前,請確認您已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
- 建立或存取版本為 1.35.2-gke.1842000 以上的 GKE 叢集。
- (建議選用) 在叢集上啟用自動佈建節點功能。
如要使用備用緩衝區,您必須建立叢集,並使用下列 GKE 版本:
gcloud container clusters create CLUSTER_NAME \ --region=COMPUTE_REGION \ --cluster-version=1.35.2-gke.1842002 \ --release-channel=None更改下列內容:
CLUSTER_NAME:新叢集的名稱。COMPUTE_REGION:新叢集的 Compute Engine 區域,例如us-central1。
建立必要 Kubernetes 物件
如要設定 CapacityBuffer,您需要一個命名空間來保存所有必要物件 (CapacityBuffer 本身,以及 PodTemplate 或工作負載等其他資源)。PodTemplate 和 CapacityBuffer 必須位於相同命名空間。您可以建立命名空間或使用現有命名空間,包括 default 命名空間。
視您設定的 CapacityBuffer 類型而定,您也需要下列其中一項:
- PodTemplate:定義單一緩衝區容量單位的資源需求。CapacityBuffer 物件中指定的設定會參照 Pod 範本。
工作負載:您在 CapacityBuffer 物件中參照的現有工作負載。本指南以 Deployment 物件做為工作負載範例,但容量緩衝區支援下列任一資源類型:
- 部署作業
- ReplicaSet
- StatefulSet
- ReplicationController
- 工作
實作
scale子資源的 CustomResourceDefinitions (CRD)。
本節提供這些物件的範例。如果您已有要設定容量緩衝區的工作負載,請繼續套用容量緩衝區。
如要建立 Kubernetes 工作負載範例,請完成下列步驟:
將下列資訊清單儲存為
namespace.yaml:apiVersion: v1 kind: Namespace metadata: name: capacity-buffer-example labels: name: capacity-buffer-example這份資訊清單會建立名為
capacity-buffer-example的命名空間。將下列資訊清單儲存為
buffer-pod-template.yaml:apiVersion: v1 kind: PodTemplate metadata: name: buffer-unit-template namespace: capacity-buffer-example # the namespace must be the same namespace as the CapacityBuffer template: spec: terminationGracePeriodSeconds: 0 containers: - name: buffer-container image: registry.k8s.io/pause:3.9 resources: requests: cpu: "1" memory: "1Gi" limits: cpu: "1" memory: "1Gi"這個資訊清單會建立
PodTemplate,定義緩衝區容量單位的資源需求 (1CPU 和1Gi記憶體)。這項設定會指定 GKE 為緩衝區佈建的容量單位大小。舉例來說,如果叢集擴大,GKE 就不會將可用資源少於 1 個 CPU 和 1Gi 的節點視為緩衝區的一部分。將下列資訊清單儲存為
sample-workload-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: critical-workload-ref namespace: capacity-buffer-example # the namespace must be the same namespace as the CapacityBuffer spec: replicas: 10 selector: matchLabels: app: critical-workload template: metadata: labels: app: critical-workload spec: containers: - name: busybox image: busybox command: ["sleep", "3600"] resources: requests: cpu: 100m這份資訊清單會建立含有 10 個副本的範例 Deployment,這是下一節中以百分比為準的緩衝區範例參考物件。
將資訊清單套用至叢集:
kubectl apply -f namespace.yaml -f buffer-pod-template.yaml -f sample-workload-deployment.yaml確認 GKE 已建立物件:
kubectl get podtemplate -n capacity-buffer-example kubectl get deployment critical-workload-ref -n capacity-buffer-example輸出結果會與下列內容相似:
NAME AGE buffer-unit-template 1m NAME READY UP-TO-DATE AVAILABLE AGE critical-workload-ref 10/10 10 10 1m
套用容量緩衝區
本節提供不同類型容量緩衝區的範例,您可以將這些緩衝區套用至工作負載。
設定固定備用資源緩衝區
使用固定副本設定 CapacityBuffer 時,系統會根據 PodTemplate 指定您需要的緩衝區單元確切數量。
如要建立具有固定副本的緩衝區,請完成下列步驟:
將下列資訊清單儲存為
cb-fixed-replicas.yaml:apiVersion: autoscaling.x-k8s.io/v1beta1 kind: CapacityBuffer metadata: name: fixed-replica-buffer namespace: NAMESPACE spec: podTemplateRef: name: POD_TEMPLATE replicas: 3 provisioningStrategy: "STRATEGY"更改下列內容:
NAMESPACE:命名空間的名稱,例如capacity-buffer-example。POD_TEMPLATE:定義資源需求的 PodTemplate,例如buffer-unit-template。STRATEGY:佈建策略,可為"buffer.x-k8s.io/active-capacity"(預設) 或"buffer.gke.io/standby-capacity"。
這份資訊清單會建立 CapacityBuffer 資源,參照 PodTemplate 要求特定數量的緩衝區單元。
套用資訊清單:
kubectl apply -f cb-fixed-replicas.yaml確認 GKE 已套用容量緩衝區:
kubectl get capacitybuffer fixed-replica-buffer -n NAMESPACE狀態中的
replicas欄位應顯示3,這會反映您在資訊清單中定義的備用資源數量。STATUS欄位應顯示ReadyForProvisioning。
設定以百分比為準的緩衝區
設定百分比緩衝區時,系統會根據現有可擴充工作負載的百分比,動態調整緩衝區大小。凡是定義規模子資源的物件 (例如 Deployment、StatefulSet、ReplicaSet 或 Job),都支援以百分比為單位的緩衝區。Pod 範本沒有 replicas 欄位,因此您無法為 Pod 範本定義百分比緩衝區。
如要建立以百分比為準的緩衝區,請完成下列步驟:
將下列資訊清單儲存為
cb-percentage-based.yaml:apiVersion: autoscaling.x-k8s.io/v1beta1 kind: CapacityBuffer metadata: name: percentage-buffer namespace: NAMESPACE spec: scalableRef: apiGroup: apps kind: Deployment name: SCALABLE_RESOURCE_NAME percentage: 20 provisioningStrategy: "STRATEGY"更改下列內容:
NAMESPACE:命名空間名稱。SCALABLE_RESOURCE_NAME:可擴充資源的名稱,例如critical-workload-ref。STRATEGY:佈建策略,可為"buffer.x-k8s.io/active-capacity"(預設) 或"buffer.gke.io/standby-capacity"。
這份資訊清單會建立 CapacityBuffer 資源,要求緩衝區空間相當於所參照資源副本的 20%。如果您使用上一節的部署範例,副本值會設為
10。套用資訊清單:
kubectl apply -f cb-percentage-based.yaml確認 GKE 已套用容量緩衝區:
kubectl get capacitybuffer percentage-buffer -n NAMESPACE檢查 CapacityBuffer 狀態。「
replicas」欄位應顯示百分比計算值。如果您使用上一節的 Deployment 範例,應該會看到2緩衝區單元,這是 Deployment 中定義的 10 個副本的 20%。手動將 Deployment 擴充至 20 個副本,測試動態調度功能:
kubectl scale deployment critical-workload-ref -n NAMESPACE --replicas=20CapacityBuffer 控制器會做出反應,並自動將緩衝區調度至 4 個副本。
設定資源限制緩衝區
您可以根據 PodTemplate 大小,使用 limits 欄位定義緩衝區應消耗的資源數量上限。
如要建立資源限制緩衝區,請完成下列步驟:
將下列資訊清單儲存為
cb-resource-limits.yaml:apiVersion: autoscaling.x-k8s.io/v1beta1 kind: CapacityBuffer metadata: name: resource-limit-buffer namespace: NAMESPACE spec: podTemplateRef: name: POD_TEMPLATE limits: cpu: "5" memory: "5Gi" provisioningStrategy: "STRATEGY"更改下列內容:
NAMESPACE:命名空間的名稱,例如capacity-buffer-example。POD_TEMPLATE:定義資源需求的 PodTemplate,例如buffer-unit-template。STRATEGY:佈建策略,可為"buffer.x-k8s.io/active-capacity"(預設) 或"buffer.gke.io/standby-capacity"。
這份資訊清單會建立 CapacityBuffer 資源,總限制為 5 個 CPU 和 5 GiB 記憶體。如果您使用上一個步驟中的 PodTemplate 範例,請將每個單位定義為
1CPU 和1Gi記憶體,這應該會產生 5 個緩衝區單位。套用資訊清單:
kubectl apply -f cb-resource-limits.yaml確認 GKE 已套用容量緩衝區:
kubectl get capacitybuffer resource-limit-buffer -n NAMESPACE檢查 CapacityBuffer 狀態。
replicas欄位應顯示從您定義的限制衍生而來的值。如果您使用上一節的 PodTemplate 範例,應該會看到5個緩衝區單元,因為這是符合定義上限的單元數量上限。
自訂待機緩衝區行為
您可以使用註解,自訂待機緩衝區的啟動和重新整理方式。
將這些註解新增至 CapacityBuffer 資源的 metadata.annotations 欄位:
buffer.gke.io/standby-capacity-init-time:節點在建立後到暫停前維持活動狀態的時間長度。格式為時間長度字串 (例如5m或1h)。預設值為5m。buffer.gke.io/standby-capacity-refresh-frequency:暫停節點的重新整理頻率。預設值為1d。
以下範例顯示含有這些選用欄位的資訊清單,可自訂待命緩衝區的行為:
apiVersion: autoscaling.x-k8s.io/v1beta1
kind: CapacityBuffer
metadata:
name: customized-standby-buffer
namespace: my-namespace
annotations:
buffer.gke.io/standby-capacity-init-time: "15m"
buffer.gke.io/standby-capacity-refresh-frequency: "12h"
spec:
podTemplateRef:
name: buffer-unit-template
replicas: 3
provisioningStrategy: "buffer.gke.io/standby-capacity"
在待命緩衝區預先載入圖片
如要加快待命節點恢復運作時的工作負載啟動時間,可以使用 DaemonSet 預先載入容器映像檔。DaemonSet 會在節點暫停前的啟動期間執行。
如要使用 DaemonSet 預先載入映像檔,請完成下列步驟:
將下列資訊清單儲存為
image-puller-daemonset.yaml:apiVersion: apps/v1 kind: DaemonSet metadata: name: image-prefetch-daemonset namespace: NAMESPACE spec: selector: matchLabels: name: image-prefetch template: metadata: labels: name: image-prefetch spec: tolerations: - key: "buffer.gke.io/standby-node-suspended" operator: "Exists" initContainers: - name: image-puller image: IMAGE_NAME command: ["sh", "-c", "true"] containers: - name: pause image: registry.k8s.io/pause:3.9更改下列內容:
NAMESPACE:DaemonSet 的命名空間,例如capacity-buffer-example。IMAGE_NAME:要預先載入的圖片名稱,例如your-app-image:latest。
將 DaemonSet 資訊清單套用至叢集:
kubectl apply -f image-puller-daemonset.yaml確認 DaemonSet 已建立:
kubectl get daemonset image-prefetch-daemonset -n NAMESPACE確認容量緩衝區已建立,並可供佈建:
kubectl get capacitybuffer CAPACITY_BUFFER_NAME -n NAMESPACE依據換購狀態
STATUS欄位應顯示ReadyForProvisioning。
移除容量緩衝區
如果工作負載不再需要容量緩衝區,請刪除 CapacityBuffer 物件。這會移除預留位置 Pod,並允許叢集自動配置器縮減節點。
kubectl delete capacitybuffer CAPACITY_BUFFER_NAME -n NAMESPACE
將 CAPACITY_BUFFER_NAME 替換為要刪除的 CapacityBuffer 名稱。
疑難排解
下節提供資訊,說明如何解決容量緩衝區的常見問題。
帳單模式導致容量緩衝區尚未準備就緒
如果您為使用以 Pod 為準的計費模型 (依 Pod 付費) 的工作負載建立 CapacityBuffer,系統將無法佈建容量緩衝區。
如要找出這個問題,請檢查 CapacityBuffer 狀態:
kubectl describe capacitybuffer BUFFER_NAME -n NAMESPACE
尋找類型為 ReadyForProvisioning 且狀態為 False 的條件。
如要解決這個問題,請確認 CapacityBuffer 參照的工作負載或 PodTemplate 與以節點為準的計費方式相容。
自訂可擴充資源的權限錯誤
如果您設定 CapacityBuffer 與自訂可調度物件搭配使用 (使用 scalableRef 欄位),叢集自動調度器可能缺少必要權限,而無法調度緩衝區。
如要解決這個問題,請手動建立 ClusterRole 和 ClusterRoleBinding,授予必要權限,例如:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: custom-scale-getter
rules:
- apiGroups: ["api.example.com"]
resources: ["customreplicatedresources/scale"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: ca-custom-scale-getter
subjects:
- kind: User
name: "system:cluster-autoscaler"
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: custom-scale-getter
如要進一步瞭解如何設定 RBAC,請參閱 Kubernetes RBAC 說明文件。
後續步驟
- 進一步瞭解容量緩衝區。
- 請參閱 CapacityBuffer CRD 說明文件。