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

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

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

事前準備

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

選取或建立專案

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

  1. In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance 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

  2. Verify that billing is enabled for your Cloud de Confiance project.

啟用 API

啟用 GKE 和 Cloud Logging API。

啟用 API 時所需的角色

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

啟用 API

設定 Cloud Shell

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

在 Cloud de Confiance 控制台中啟用 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:您的 Cloud de Confiance 專案 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

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

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

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

  1. 前往 Cloud de Confiance 控制台的「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:您的 Cloud de Confiance 專案 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 記錄,請聯絡Cloud de Confiance 支援團隊

後續步驟