收集水平 Pod 自動調度事件記錄

本頁面提供 Google Kubernetes Engine (GKE) 中水平 Pod 自動調度器發出的決策事件相關資訊。分析這些事件,有助於深入瞭解水平 Pod 自動調度控制器如何管理工作負載資源調度,以及瞭解其動作背後的決策程序。

水平 Pod 自動配置器會發出決策事件,並以記錄項目的形式儲存在 Cloud Logging 中。

事前準備

請務必完成下列必要條件:

選取或建立專案

您可以使用現有專案,也可以為本教學課程建立新專案。

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

啟用 API

啟用 GKE 和 Cloud Logging API。

啟用 API 時所需的角色

您必須具備 serviceusage.services.enable 權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色

啟用 API

設定 Cloud Shell

在本教學課程中,您將使用 Cloud Shell 執行 gcloudkubectl 指令。Cloud Shell 是殼層環境,用於管理託管在 Google Cloud的資源。這個環境已預先安裝 Google Cloud CLIkubectl 指令列工具。

在 Google Cloud 控制台中啟用 Cloud Shell。

啟用 Cloud Shell

此時 Cloud Shell 工作階段會在主控台底部的頁框中開啟,

在本教學課程中執行指令前,請務必將預設專案設為要部署範例應用程式的專案 ID。如果尚未設定,請在 Cloud Shell 中執行下列指令:

gcloud config set project PROJECT_ID

PROJECT_ID 替換為專案 ID

必要角色和權限

如要取得啟用記錄檔產生功能,以及存取和處理記錄檔所需的權限,請要求管理員在專案中授予您下列 IAM 角色:

  • 如要在叢集中啟用水平 Pod 自動調度器事件記錄功能,請具備 Kubernetes Engine 叢集管理員 (roles/container.clusterAdmin) 角色。
  • 如要存取記錄檔,並使用 Logs Explorer 和 Observability Analytics:記錄檢視器 (roles/logging.viewer)

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

需求條件

  • 您的 GKE 叢集必須執行 1.31.5-gke.1090000 以上版本,或 1.32.1-gke.1260000 以上版本。
  • 在 GKE 叢集中啟用 Cloud Logging。適用 Cloud Logging 定價
  • 確認您有要監控的水平 Pod 自動配置器。確認水平 Pod 自動配置器欄位不含機密資料。

費用

啟用 Cloud Logging 並收集水平 Pod 自動配置器決策記錄時,須支付 Cloud Logging 費用

啟用水平 Pod 自動調度器決策事件

如要建立啟用 KCP_HPA 決策記錄的新叢集,請執行下列指令:

gcloud container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --logging=SYSTEM,KCP_HPA

如要在現有叢集上啟用 KCP_HPA 決策記錄,請執行下列指令:

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --logging=SYSTEM,KCP_HPA

更改下列內容:

  • CLUSTER_NAME:要建立或更新的叢集名稱。
  • PROJECT_ID:您的 Google Cloud 專案 ID。
  • LOCATION:叢集的 Compute 區域或可用區

這些指令可匯出 KCP_HPA 產生的記錄,並儲存至 Cloud Logging 中的目的地 logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fhpa-controller"

擷取叢集更新後的記錄設定,並檢查記錄清單,確認已啟用 KCP_HPA 記錄:

gcloud container clusters describe CLUSTER_NAME \
    --location=LOCATION \
    --flatten=loggingConfig \
    --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'

輸出結果會與下列內容相似:

SYSTEM_COMPONENTS,APISERVER,CONTROLLER_MANAGER,SCHEDULER,KCP_HPA

在 Google Cloud 控制台中查看水平 Pod 自動配置器記錄

您可以在Google Cloud 控制台中監控水平 Pod 自動調度資源的行為。這個檢視畫面提供便利的方式,讓您查看 Cloud Logging 中提供的相同原子和最終建議記錄,不必離開工作負載的環境。

如要在 Google Cloud 控制台中查看水平 Pod 自動調度器記錄,請完成下列步驟:

  1. 前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面:

    前往「Workloads」(工作負載)

  2. 選取由水平 Pod 自動調度器管理的工作負載。

  3. 按一下「Scaling」(縮放) 分頁標籤。

您可以在這個分頁中找到與擴縮相關的資訊,包括資源用量、效率資料和記錄。這個分頁的資料有助於找出最有效的工作負載自動調度資源設定。在「記錄」部分,您可以找到「記錄」中的相同資訊,並依類型篩選這些記錄,包括「事件」、「最終建議」和「原子建議」。如要進一步瞭解不同記錄,請參閱「記錄類型」。

停用水平 Pod 自動調度器決策事件

更新叢集,從 --logging 標記中移除 KCP_HPA 元件:

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --logging=SYSTEM

更改下列內容:

  • CLUSTER_NAME:要建立或更新的叢集名稱。
  • PROJECT_ID:您的 Google Cloud 專案 ID。
  • LOCATION:叢集的 Compute 區域或可用區

這個指令會停用匯出 KCP_HPA 產生的記錄。您無法使用 Cloud Logging 中的 logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fhpa-controller" 篩選器擷取這些記錄。

擷取叢集的更新記錄設定,並檢查記錄清單,確認 KCP_HPA 記錄已停用:

gcloud container clusters describe CLUSTER_NAME \
    --location=LOCATION \
    --flatten=loggingConfig \
    --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'

輸出結果會與下列內容相似:

SYSTEM_COMPONENTS,APISERVER,CONTROLLER_MANAGER,SCHEDULER

記錄類型

水平 Pod 自動配置器的決策事件會儲存在 Cloud Logging 中,位於與 GKE 叢集相同專案的 _Default 值區內 logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fhpa-controller" 位置。所有記錄的事件都採用 JSON 格式,且位於記錄項目的 jsonPayload 欄位中。

請務必瞭解潛在記錄檔量的儲存空間需求,以及任何效能或成本影響。以下範例說明水平 Pod 自動配置器產生各類型決策事件的頻率:

  • 原子建議:水平 Pod 自動調度器每 15 秒會為叢集中每個 HPA 物件監控的指標,產生一個原子建議事件。舉例來說,如果叢集中有兩個 HPA 物件,且每個 HPA 物件監控三個指標,則每 15 秒會記錄 六項原子建議

  • 最終建議:水平 Pod 自動調度器每 15 秒會為叢集中的每個 HPA 物件產生一個最終建議事件。舉例來說,如果叢集中有兩個 HPA 物件,系統每 15 秒就會記錄兩項最終建議

總共 兩個 HPA 物件,每個物件監控 三個指標,您的 KCP_HPA 記錄檔每 15 秒會收到 八個決策事件項目

完整建議

原子建議記錄會根據水平 Pod 自動調度器上指定的個別指標,說明建議。

原子記錄包含下列欄位:

欄位 說明
start_time 指出 HPA 開始計算建議的時間。
hpa 與建議相關聯的 HPA 物件名稱。
pod_count 表示提出建議時與 HPA 相關聯的 Pod 總數。這個數字也包括就緒、未就緒和遭忽略的 Pod。
metric 提供用於建議的指標規格和狀態相關資訊。metric 欄位包含下列子欄位:
  • indexSpec metrics 陣列中的指標索引。
  • type:指標類型,值來自 MetricSourceType (例如「Resource」、「External」)。
  • spec:指標名稱和該指標的目標。
  • status狀態條件,與擴充性和擴充限制相關。
  • newest_sample_time:最新指標樣本的時間戳記。
  • newest_sample_age_seconds:自開始計算建議以來,最近一次樣本的年齡 (以秒為單位)。負值表示指標樣本早於計算開始時間。
summary 摘要欄位包含建議結果的相關資訊,包括建議的副本數量。如果系統無法提供建議,就會顯示錯誤訊息。summary 欄位包含下列子欄位:
  • dampening:HPA 會對建議及其方向套用阻尼,盡量減少潛在的資源調度幅度。阻尼作用的發生方式如下:
    • up:向上抑制方向表示 HPA 會假設缺少指標的 Pod 的指標使用率為 100%。
    • down:向下抑制方向表示 HPA 會假設缺少指標的 Pod 或未就緒的 Pod,消耗的指標使用率為 0%。
    • none:不會套用任何阻尼。
  • override:如果未套用 HPA 建議,系統會提供原因 (例如容許度);如果沒有覆寫,則為 none
  • result:建議結果。如果無法計算建議值,系統會建議副本數量,或顯示錯誤訊息。

完整建議記錄範例:

{
  "insertId": "xiu4bty9k5b279wu",
  "jsonPayload": {
    "instance": {
      "vm_name": "my-unique-vm-identifier",
      "zone": "us-central1-a"
    },
    "atomicRecommendation": {
      "startTime": "2025-02-06T20:07:00.573419526Z",
      "hpa": "gke-managed-cim/kube-state-metrics",
      "metric": {
        "newestSampleAgeSeconds": -39.573419526,
        "status": {
          "averageValue": "25849856"
        },
        "newestSampleTime": "2025-02-06T20:06:21Z",
        "type": "Resource",
        "spec": {
          "target": {
            "averageValue": "400Mi"
          },
          "name": "memory"
        }
      },
      "podCount": {
        "ready": 1,
        "total": 1
      },
      "summary": {
        "override": "none",
        "replicas": 1,
        "dampening": "none"
      }
    }
  },
  "resource": {
    "type": "k8s_control_plane_component",
    "labels": {
      "project_id": "my-project-id",
      "cluster_name": "my-cluster",
      "location": "us-central1-a",
      "component_location": "us-central1-a",
      "component_name": "hpa-controller"
    }
  },
  "timestamp": "2025-02-06T20:07:00.593777835Z",
  "severity": "INFO",
  "labels": {
    "compute.googleapis.com/resource_name": "my-unique-vm-identifier"
  },
  "logName": "projects/my-project-id/logs/container.googleapis.com%2Fhpa-controller",
  "sourceLocation": {
    "file": "event_logger.go",
    "line": "61"
  },
  "receiveTimestamp": "2025-02-06T20:07:05.284753647Z"
}

最終建議

最終建議記錄檔會說明水平 Pod 自動調度器提出的整合建議。水平 Pod 自動調度器會合併不同指標的所有原子建議,建立最終建議並執行。啟動是指 HPA 指示 Deployment 調整備用資源數量,以符合建議值。如果最終建議的 Pod 數量與執行中的 Pod 數量不同,水平 Pod 自動調度器會觸發擴大或縮減事件,以相應調整 Deployment。

最終建議記錄包含下列欄位:

欄位 說明
start_time 指出 HPA 開始計算建議的時間。
hpa 與建議相關聯的 HPA 物件名稱。
target_ref 指出與建議相關聯的 HPA ScaleTargetRef 物件。
configured_size HPA 計算並套用這項建議前,最後記錄的副本數量。
top_level_override 如果未套用 HPA 建議的建議 (例如因容許度),則提供原因;或 none如果沒有覆寫。
top_level_limit 如果需要調整 HPA 建議,系統會提供原因 (例如,由於 HPA 規格中 MinReplicasMaxReplicas 欄位定義的副本數量)。
leading_metric_index Spec metrics 陣列中的主要指標索引,是與最終建議相關聯的指標。
normalization 如果有的話,提供穩定性和限制摘要,如下所示:

stabilization:說明是否已套用穩定功能。如果用於調度資源的指標持續波動,系統會使用穩定機制來限制副本數量波動。stabilization 欄位包含下列子欄位:

  • replicas:穩定後的副本數量。
  • reason:套用的穩定類型,可為 scaleUpscaleDown
  • stabilization_window:相關穩定時間範圍,以秒為單位。
  • replicas_before_stabilization:穩定前建議的副本數量。

limitation:說明如何處理套用的縮放限制。這項行為會根據現有的限制,修改 HPA 提出的建議。limitation 欄位包含下列子欄位:

  • replicas:限制後的副本數量。
  • reason:未超出副本數量下限或上限的原因。
  • scaling_policy:套用的縮放政策
  • selectPolicy:指定在朝特定方向縮減時,如何選取政策。MaxChange 對應於 MaxChangePolicySelectMinChange 對應於 MinChangePolicySelect。如果縮放功能已停用,則不會顯示 selectPolicy 欄位。
  • replicas_before_limitation:限制前的建議副本數量。
replicas 建議的副本數量。
actuation_error 如果啟動失敗,則為與失敗相關的錯誤訊息。
actuation_time 成功啟動的時間戳記。
actuation_latency_seconds 從建議計算開始到啟動成功為止,經過的時間 (以秒為單位)。

最終建議記錄範例:

{
  "insertId": "qzyv7alfv1sm19ns",
  "jsonPayload": {
    "finalRecommendation": {
      "actuationTime": "2025-02-06T20:06:57.487786873Z",
      "targetRef": {
        "name": "kube-state-metrics",
        "kind": "StatefulSet",
        "apiVersion": "apps/v1"
      },
      "topLevelLimit": "none",
      "hpa": "gke-managed-cim/kube-state-metrics",
      "topLevelOverride": "noRecommendation",
      "replicas": 1,
      "configuredSize": 1,
      "actuationLatencySeconds": 0.003722451,
      "startTime": "2025-02-06T20:06:57.484064422Z"
    },
    "instance": {
      "vm_name": "my-unique-vm-identifier",
      "zone": "us-central1-a"
    }
  },
  "resource": {
    "type": "k8s_control_plane_component",
    "labels": {
      "cluster_name": "my-cluster",
      "component_location": "us-central1-a",
      "component_name": "hpa-controller",
      "location": "us-central1-a",
      "project_id": "my-project-id"
    }
  },
  "timestamp": "2025-02-06T20:06:57.488193527Z",
  "severity": "INFO",
  "labels": {
    "compute.googleapis.com/resource_name": "my-unique-vm-identifier"
  },
  "logName": "projects/my-project-id/logs/container.googleapis.com%2Fhpa-controller",
  "sourceLocation": {
    "file": "event_logger.go",
    "line": "61"
  },
  "receiveTimestamp": "2025-02-06T20:06:57.844898727Z"
}

疑難排解

本節說明與水平 Pod 自動調度資源事件相關的問題和解決步驟。

沒有活動

如果沒有看到任何水平 Pod 自動配置器決策事件,請確認您已完成下列所有步驟:

  • 您已為叢集啟用 Cloud Logging。
  • 您已為叢集啟用 KCP_HPA 記錄。
  • 您已將至少一個正確設定的 hpa 物件部署至叢集。

如要查看 hpa 物件設定,請執行下列指令:

  kubectl describe hpa $HPA_NAME

如果還是沒有看到任何 KCP_HPA 記錄,請聯絡Google Cloud 支援團隊

後續步驟