水平自動調度 Pod 資源功能可讓您根據即時需求,自動調整叢集中現有無狀態工作負載的執行中 Pod 數量。自動配置器會在負載增加時新增 Pod,並在需求下降時移除 Pod,有助於維持應用程式可用性、有效運用資源,以及控管成本,不需手動介入。您可以根據標準資源指標 (例如 CPU 使用率) 或 Prometheus 的自訂應用程式指標 (例如 HTTP 要求率) 進行調度。
調度 Deployment 資源
使用 Kubernetes 的資源調度功能,適當調整部署作業中執行的 Pod 數量。
自動調度部署作業的 Pod 資源
Kubernetes 提供自動調度資源功能,因此您不必在需求變化時手動更新部署作業。請按照下列步驟,自動調度部署作業的 Pod:
為確保水平 Pod 自動配置器能適當測量 CPU 百分比,請在 Deployment 設定 CPU 資源要求。
在 Deployment 中設定水平 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:要自動調度資源的 Deployment 名稱。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 名稱。DEPLOYMENT_NAME:Deployment 中複製的Pod物件數量。
使用 Prometheus 的自訂指標自動調度資源
水平自動調度 Pod 資源功能預設會使用標準資源指標,例如 CPU 和記憶體使用率。標準指標適用於一般資源調度,但不適用於特殊應用程式負載。
使用水平自動調度 Pod 資源功能,搭配 Prometheus 的自訂指標時,您可以根據應用程式專屬指標 (例如 HTTP 要求率、佇列深度和處理延遲時間) 調度工作負載。叢集可運用 Prometheus 監控堆疊已收集的豐富資料,更準確地因應實際需求。
搭配使用 Prometheus 與水平自動調度 Pod 資源功能的必要條件
啟用這項功能前,必須符合下列條件:
現有的 Prometheus 伺服器:必須已部署 Prometheus 伺服器,且可從叢集內透過網路存取 (HPA 控制器不會管理 Prometheus 執行個體本身)。詳情請參閱「如何在 Kubernetes 中部署及設定 Prometheus Operator」。
管理權限:您必須具備必要權限,才能修改叢集自訂資源。
沒有 API 衝突:預檢會確認沒有其他元件已註冊
custom.metrics.k8s.io的 APIService。如果發生衝突,就無法啟用轉接程式。
啟用及設定 Prometheus
這項程序包括定義指標規則和更新叢集設定:
建立一或多個指標規則 ConfigMap。
在目標叢集命名空間的一或多個 ConfigMap 中,為自訂指標定義以 PromQL 為基礎的規則。控制器會監控這些 ConfigMap、合併這些 ConfigMap,並自動將其套用至轉接器。
如要進一步瞭解如何定義規則,請參閱 kubernetes-sigs/prometheus-adapter 中的「指標探索和呈現設定」。
以下範例顯示 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命名空間。如要使用自訂指標水平自動調度 Pod 資源,請建立 HorizontalPodAutoscaler 資源,並指定 ConfigMap
rules欄位中定義的自訂指標。先前步驟中的 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 區段。