本文說明如何為叢集中現有的無狀態工作負載設定水平 Pod 自動調度資源功能。水平 Pod 自動調度資源功能會根據即時需求,自動調整應用程式的執行中 Pod (副本) 數量,在負載減少時移除 Pod,負載增加時新增 Pod。這種擴充和縮減功能至關重要,可確保應用程式可用性、有效運用資源,並根據使用者流量精確調整容量,進而節省成本,且無需手動介入。隨著容器工作負載需求演變,Pod 自動調度功能可讓運算子不必持續監控效能,也不必手動調整 Pod 數量。
本文適用於管理底層技術基礎架構生命週期的管理員、架構師和營運人員。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。 Google Cloud
調度 Deployment 資源
使用 Kubernetes 的擴縮功能,適當擴縮部署中執行的 Pod 數量。
自動調度部署的 Pod 資源
Kubernetes 提供自動調度資源功能,因此需求變化時,您不必手動更新部署作業。如要自動調度部署的 Pod 資源,請完成下列步驟:
為確保水平 Pod 自動調度器能適當測量 CPU 百分比,請在部署作業中設定 CPU 資源要求。
在部署作業中設定水平 Pod 自動配置器:
kubectl --kubeconfig CLUSTER_KUBECONFIG \ -n NAMESPACE \ autoscale deployment DEPLOYMENT_NAME \ --cpu-percent=CPU_PERCENT \ --min=MIN_NUMBER_REPLICAS \ --max=MAX_NUMBER_REPLICAS更改下列內容:
CLUSTER_KUBECONFIG:叢集的 kubeconfig 檔案。NAMESPACE:命名空間。如果是共用叢集,這必須是專案命名空間。如果是標準叢集,則可以是任何命名空間。DEPLOYMENT_NAME:要自動調整規模的部署作業名稱。CPU_PERCENT:所有 Pod 的目標平均 CPU 使用率 (以百分比表示)。MIN_NUMBER_REPLICAS:自動配置器可佈建的 Pod 數量下限。MAX_NUMBER_REPLICAS:自動配置器可佈建的 Pod 數量上限。
檢查水平 Pod 自動調度器的目前狀態:
kubectl get hpa輸出結果會與下列內容相似:
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE DEPLOYMENT_NAME Deployment/DEPLOYMENT_NAME/scale 0% / 50% 1 10 1 18s
手動調度 Deployment 的 Pod
如要手動調度 Deployment 的資源,請執行下列指令:
kubectl --kubeconfig CLUSTER_KUBECONFIG \
-n NAMESPACE \
scale deployment DEPLOYMENT_NAME \
--replicas NUMBER_OF_REPLICAS
更改下列內容:
CLUSTER_KUBECONFIG:叢集的 kubeconfig 檔案。NAMESPACE:命名空間。如果是共用叢集,這必須是專案命名空間。如果是標準叢集,則可以是任何命名空間。DEPLOYMENT_NAME:要自動調整規模的部署作業名稱。DEPLOYMENT_NAME:部署作業中複製的Pod物件數量。
使用 Prometheus 的自訂指標自動調整資源配置
水平自動調度 Pod 資源功能預設會使用標準資源指標,例如 CPU 和記憶體使用率。標準指標適用於一般調整作業,但對於特殊應用程式負載則不適用。
使用 Prometheus 的自訂指標進行水平 Pod 自動調度時,您可以根據應用程式專屬指標 (例如 HTTP 要求率、佇列深度和處理延遲時間) 調度工作負載。叢集可運用 Prometheus 監控堆疊已收集的豐富資料,更準確地回應實際需求。
搭配水平 Pod 自動調度功能使用 Prometheus 的先決條件
啟用這項功能前,請先確認符合下列條件:
現有 Prometheus 伺服器:必須已部署 Prometheus 伺服器,且可從叢集內存取網路 (HPA 控制器本身不會管理 Prometheus 執行個體)。詳情請參閱「如何在 Kubernetes 中部署及設定 Prometheus Operator」。
管理權限:您必須具備修改叢集自訂資源的必要權限。
沒有 API 衝突:預檢會驗證是否有其他元件已為
custom.metrics.k8s.io註冊 APIService。如有衝突,就無法啟用轉接程式。
啟用及設定 Prometheus
這個程序包括定義指標規則,以及更新叢集設定:
建立一或多個指標規則 ConfigMap。
在目標叢集命名空間內的一或多個 ConfigMap 中,定義自訂指標的 PromQL 規則。控制器會監看這些 ConfigMap、合併這些 ConfigMap,並自動套用至介面卡。
如要進一步瞭解如何定義規則,請參閱 kubernetes-sigs/prometheus-adapter 中的「Metrics Discovery and Presentation Configuration」。
下列範例顯示 ConfigMap,其中
data欄位中定義了http_requests_per_second的規則:apiVersion: v1 kind: ConfigMap metadata: name: my-app-rules namespace: <cluster-namespace> data: config.yaml: | rules: - seriesQuery: 'http_requests_total' resources: overrides: namespace_name: {resource: "namespace"} pod_name: {resource: "pod"} name: matches: "^(.*)_total$" as: "${1}_per_second" metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>)'如果 Prometheus 伺服器需要驗證 (例如相互傳輸層安全性 (mTLS)),請以 kubeconfig 格式建立 Kubernetes Secret,其中包含必要的憑證。
以下範例顯示支援基本驗證的 Secret:
apiVersion: v1 kind: Secret metadata: name: prometheus-auth-secret namespace: <cluster-namespace> annotations: baremetal.cluster.gke.io/mark-source: "true" type: Opaque stringData: config: authentication-credentials更新叢集自訂資源:
將
preview.baremetal.cluster.gke.io/metrics-adapter: "true"註解新增至叢集的自訂資源metadata。新增
spec.metricsAdapter區段,定義 Prometheus 網址並參照規則 ConfigMap。apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: <cluster-name> namespace: <cluster-namespace> annotations: preview.baremetal.cluster.gke.io/metrics-adapter: "true" spec: # ... other existing cluster configurations ... metricsAdapter: prometheus: url: "http://prometheus-k8s.monitoring.svc.cluster.local:9090" orgID: "production-environment" auth: configSecretRef: name: prometheus-auth-secret key: config # This is the key within the Secret's 'data' field rules: configMapKeyRefs: - name: my-app-rules key: config.yaml # This is the key within the ConfigMap's 'data' field # - name: base-system-rules # key: config.yaml如果 Prometheus 執行個體不需要驗證,您可以從叢集規格中省略
metricsAdapter.prometheus.auth區段。
套用更新後的叢集自訂資源。
控制器會自動將 Prometheus 介面卡部署到
kube-system命名空間。建立 HorizontalPodAutoscaler 資源,以 ConfigMap
rules欄位中定義的自訂指標為目標,即可在水平 Pod 自動調度資源功能中使用自訂指標。先前步驟中的 ConfigMap 範例定義了
http_requests_per_second自訂指標。如要使用這項指標,HorizontalPodAutoscaler 資源應與下列範例類似:apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: <name> namespace: <namespace> spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: <workload-name> minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: http_requests_per_second target: type: AverageValue averageValue: 10
停用 Prometheus
如要停用 Prometheus 與水平 Pod 自動調度資源的搭配使用,請從叢集自訂資源中移除 spec.metricsAdapter 區段。