設定水平 Pod 自動調度資源

水平自動調度 Pod 資源功能可讓您根據即時需求,自動調整叢集中現有無狀態工作負載的執行中 Pod 數量。自動配置器會在負載增加時新增 Pod,並在需求下降時移除 Pod,有助於維持應用程式可用性、有效運用資源,以及控管成本,不需手動介入。您可以根據標準資源指標 (例如 CPU 使用率) 或 Prometheus 的自訂應用程式指標 (例如 HTTP 要求率) 進行調度。

調度 Deployment 資源

使用 Kubernetes 的資源調度功能,適當調整部署作業中執行的 Pod 數量。

自動調度部署作業的 Pod 資源

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

  1. 為確保水平 Pod 自動配置器能適當測量 CPU 百分比,請在 Deployment 設定 CPU 資源要求。

  2. 在 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 數量上限。

  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 名稱。

  • 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

這項程序包括定義指標規則和更新叢集設定:

  1. 建立一或多個指標規則 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>>)'
    
  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. 如要使用自訂指標水平自動調度 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 區段。