設定水平 Pod 自動調度資源

本文說明如何為叢集中現有的無狀態工作負載設定水平 Pod 自動調度資源功能。水平 Pod 自動調度資源功能會根據即時需求,自動調整應用程式的執行中 Pod (副本) 數量,在負載減少時移除 Pod,負載增加時新增 Pod。這種擴充和縮減功能至關重要,可確保應用程式可用性、有效運用資源,並根據使用者流量精確調整容量,進而節省成本,且無需手動介入。隨著容器工作負載需求演變,Pod 自動調度功能可讓運算子不必持續監控效能,也不必手動調整 Pod 數量。

本文適用於管理底層技術基礎架構生命週期的管理員、架構師和營運人員。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。 Google Cloud

調度 Deployment 資源

使用 Kubernetes 的擴縮功能,適當擴縮部署中執行的 Pod 數量。

自動調度部署的 Pod 資源

Kubernetes 提供自動調度資源功能,因此需求變化時,您不必手動更新部署作業。如要自動調度部署的 Pod 資源,請完成下列步驟:

  1. 為確保水平 Pod 自動調度器能適當測量 CPU 百分比,請在部署作業中設定 CPU 資源要求

  2. 在部署作業中設定水平 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 數量上限。

  3. 檢查水平 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

這個程序包括定義指標規則,以及更新叢集設定:

  1. 建立一或多個指標規則 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>>)'
    
  2. 如果 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
    
  3. 更新叢集自訂資源:

    1. preview.baremetal.cluster.gke.io/metrics-adapter: "true" 註解新增至叢集的自訂資源 metadata

    2. 新增 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 區段。

  4. 套用更新後的叢集自訂資源。

    控制器會自動將 Prometheus 介面卡部署到 kube-system 命名空間。

  5. 建立 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 區段。