取得 GKE 資源分配和叢集費用的重要支出深入分析

本文將說明如何使用 Google Kubernetes Engine (GKE) 成本分配功能,取得重要支出深入分析,做為資源分配和成本最佳化決策的依據。瞭解 GKE 費用分配與叢集用量計算之間的差異、GKE 費用分配的限制、如何在新叢集和現有叢集上啟用 GKE 費用分配,以及如何篩選及查詢 Cloud Billing BigQuery 匯出資料。

本文適用於操作員、雲端架構師、開發人員和資料管理員,協助他們在 GKE 中建立及設定叢集,以及部署工作負載時管理成本。如要進一步瞭解常見角色,請參閱「常見的 GKE 使用者角色和工作」。

閱讀本文前,建議您先熟悉在 GKE 上執行最具成本效益的 Kubernetes 應用程式的最佳做法

資料量可能增加

啟用 GKE 費用分配功能可能會增加 BigQuery 的儲存空間和查詢費用。確切的增幅取決於您在 Pod 和叢集中使用的不同標籤和命名空間組合數量。

啟用 GKE 費用分配功能不會改變 GKE 用量的總費用。匯出項目中的費用明細項目總和相同,且您在帳單匯出項目中建立的現有查詢和報表會傳回相同的值。

GKE 費用分配和叢集用量計算

GKE 費用分配與叢集用量計算的不同之處如下:

  • 除了叢集用量計量功能,您也可以透過 GKE 費用分配功能取得叢集資訊。
  • GKE 費用分配功能會在您的 Cloud Billing 帳戶中計算叢集費用,而不是在數據分析範本中匯總資料。
  • 啟用 GKE 費用分配功能後,您就能在 Cloud Billing Google Cloud 控制台和 Cloud Billing 詳細匯出資料中,查看叢集的費用資料。

事前準備

開始之前,請務必先完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。

限制和規定

  • 您只能在 Cloud Billing 詳細使用費用資料匯出至 BigQuery 的資料中,查看 GKE 費用分配資料。匯出至 BigQuery 的標準使用費用資料不含 GKE 分配資料。
  • 啟用 GKE 費用分配後,帳單匯出作業會從當天起,開始納入 GKE 資源的額外明細項目。帳單匯出功能不會回填資料。
  • 停用 GKE 費用分配功能後,帳單匯出作業就不會再納入額外委刊項,但不會修改或移除啟用這項功能時產生的先前委刊項。
  • GKE 成本分配資料是根據資源要求,而非耗用的資源。如要進一步瞭解資源要求、資源限制和資源耗用量之間的差異,請參閱「Kubernetes 最佳做法:資源要求與限制」。
  • GKE 費用分配功能支援下列資源 SKU 類型:
    • Compute Engine VM 執行個體 vCPU SKU
    • Compute Engine VM 執行個體 RAM SKU
    • Compute Engine VM 自訂擴充執行個體 RAM SKU
    • Compute Engine VM 執行個體 GPU SKU
    • Compute Engine PD 容量 SKU
    • Cloud TPU 執行個體 SKU
  • 如果 Pod 的 Kubernetes 標籤超過 50 個, Google Cloud 控制台的 Cloud Billing 專區或 Cloud Billing 詳細匯出內容中,就不會顯示任何標籤。
  • 啟用 GKE 費用分配功能後,資料最多需要三天才會顯示在 Cloud Billing 中。
  • GKE 費用分配包含永久磁碟的資料,但有下列例外狀況:
    • 僅支援透過 PersistentVolumeClaims 或一般臨時磁碟區動態佈建的 PersistentVolume 資源。
    • 僅支援由 Compute Engine 永久磁碟 CSI 驅動程式佈建的 PersistentVolume 資源,或採用 ReadWriteOnce 或 ReadWriteOncePod 存取模式、已淘汰的 kubernetes.io/gce-pd 儲存空間外掛程式。
    • 運作時間不到 30 分鐘的 Persistent Disk 可能不會列入追蹤。系統一律會追蹤運作時間至少 30 分鐘的永久磁碟。
  • Cloud TPU 版本必須為 Cloud TPU v4 以上。
  • GKE 費用分配功能不適用於 A4 或 A4X VM 執行個體,也不適用於連結至這些執行個體的 GPU。
  • 使用會略過 GKE 節點集區的外部節點管理解決方案時,系統不支援 GKE 費用分配。
  • 如果使用承諾使用折扣 (CUD) 並啟用折扣共用功能,GKE 費用分配可能不會完整細分 CUD 涵蓋的執行個體費用,且可能歸因於 goog-k8s-unsupported-sku 等命名空間。

查看 GKE 叢集費用

啟用 GKE 費用分配功能後,GKE 工作負載的叢集名稱和命名空間會顯示在匯出至 BigQuery 的帳單資料的 labels 欄位中:

資源標籤鍵 (labels.key) 資源標籤值 (labels.value)
說明 Kubernetes 標籤 的格式如下: k8s-label/${k8s-label-key},其中 ${k8s-label-key} 是 Pod 的 Kubernetes 標籤鍵。帳單標籤 k8s-label/${k8s-label-key} 的值與對應的 Kubernetes Pod 標籤相同。 如果 Kubernetes 標籤鍵與 VM 標籤鍵衝突,Kubernetes 標籤值會覆寫 VM 標籤值。叢集和節點集區資源標籤會套用至資源,優先順序由高到低如下:
  • 個別資源,例如執行個體或儲存空間
  • 節點集區
  • 叢集
叢集名稱 goog-k8s-cluster-name [叢集名稱]
命名空間 k8s-namespace [namespace]
工作負載類型 k8s-workload-type [workload-type]
(例如 apps/v1-Deployment、apps/v1-StatefulSet、apps/v1-DaemonSet、apps/v1-ReplicaSet、batch/v1-Job、batch/v1-CronJob、core/v1-Pod)
工作負載名稱 k8s-workload-name [workload-name]

詳情請參閱「詳細用量費用資料的結構定義」。

此外,下列命名空間用於追蹤額外負荷和未分配的資源:

  • kube:system-overhead:這會計入 Pod 無法使用的節點資源。系統會保留這些資源,用於執行 Kubernetes 架構 (包括但不限於 kubelet、kube-proxy、containerd)。這就是節點容量與可分配資源的差異。
  • kube:unallocated:工作負載未要求資源,系統額外負荷也未要求資源。

如果 GKE 無法判斷資源的費用分配,匯出內容會包含下列其中一個值:

  • goog-k8s-unknown:Cloud Billing 無法處理 SKU。這可能是因為系統正在佈建新的 Compute Engine 執行個體。節點啟動和關閉期間,您可能會看到一些 goog-k8s-unknown 值,例如 GKE 自動調度叢集資源時。
  • goog-k8s-unsupported-sku:GKE 費用分配功能不支援這個 SKU。請將此值視為 <blank>/NULL。SKU 不一定會標示這個值。
  • <blank>/NULL:GKE 費用分配不會追蹤這項資源。如果未啟用 GKE 費用分配功能,或資源不屬於 GKE 管理的叢集,就可能發生這種情況。

當 Pod 聲明 Persistent Disk 的備份 PersistentVolumeClaims時,系統會追蹤 Persistent Disk 的費用。在刪除 Persistent Disk 之前,這類磁碟的費用會沿用聲明 Pod 的所有中繼資料,例如 Pod 標籤和命名空間。PersistentVolumeClaims如果PersistentVolumeClaims遭到刪除,但根據回收政策保留 PersistentVolumes,系統會將永久磁碟的費用追蹤為未分配。

直接套用至 PersistentVolumeClaims 的標籤不會顯示在 Google Cloud 控制台的 Cloud Billing 專區或 Cloud Billing 詳細匯出內容中。

對於擴充 RAM,系統會根據資源要求,為一般 RAM 和擴充 RAM SKU 的工作負載分配相同比例的總費用。

啟用 GKE 費用分配功能

您可以使用 gcloud CLI 或 Google Cloud 控制台,在新叢集或現有叢集上啟用 GKE 費用分配功能。

gcloud

使用 --enable-cost-allocation 旗標更新叢集:

gcloud container clusters update CLUSTER_NAME \
    --enable-cost-allocation

將 CLUSTER_NAME 替換為叢集名稱。

使用 gcloud container clusters create 指令建立新叢集時,也可以使用 --enable-cost-allocation 旗標。

控制台

如要在現有叢集上啟用 GKE 費用分配功能,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。 前往「Google Kubernetes Engine」
  2. 按一下您要修改的叢集名稱。
  3. 在「叢集」頁面的「功能」部分,按一下「費用分配」旁的 。
  4. 在「編輯費用分配」對話方塊中,勾選「啟用費用分配功能」核取方塊。
  5. 按一下 [儲存變更]。

確認已啟用 GKE 費用分配功能

gcloud

說明叢集:

gcloud container clusters describe CLUSTER_NAME

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

...
costManagementConfig:
  enabled: true
...

在這個輸出內容中,costManagementConfig 表示已啟用 GKE 費用分配。

控制台

如要檢查現有叢集是否已啟用 GKE 費用分配功能,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。 前往「Google Kubernetes Engine」
  2. 按一下您要修改的叢集名稱。
  3. 在「叢集」頁面的「功能」部分,系統會在「費用分配」旁顯示 GKE 費用分配功能是否已啟用。

查看及篩選帳單資料匯出

您可以使用本文所述的 Kubernetes 標籤,在 Google Cloud 控制台的 Cloud Billing 帳單報表頁面中篩選費用。

您可以使用下列任一方法,在 BigQuery 資料集中篩選及分組 GKE 費用:

您可以搭配這些方法使用下列範例查詢,篩選匯出的帳單資料,找出 GKE 專屬資訊:

  • 依命名空間取得扣除抵免額後的費用:

    SELECT
      labels.value as namespace,
      SUM(cost) + SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0)) AS cost_after_credits,
    FROM `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX`
    LEFT JOIN UNNEST(labels) as labels
      ON labels.key = "k8s-namespace"
    GROUP BY namespace
    ;
    
  • 取得扣除抵免額前的叢集費用:

    SELECT
      SUM(cost) AS cost_before_credits,
      labels.value AS cluster_name
    FROM  `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX`
    LEFT JOIN UNNEST(labels) as labels
      ON labels.key = "goog-k8s-cluster-name"
    GROUP BY labels.value
    ;
    
  • 依 SKU 取得 GKE 相關總費用:

    SELECT
      project.id AS project_id,
      labels.value AS cluster_name,
      sku.id AS sku_id,
      sku.description AS sku_description,
      SUM(cost) AS cost
    FROM `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX`
    JOIN UNNEST(labels) AS labels
      ON labels.key = "goog-k8s-cluster-name"
    GROUP BY
      cluster_name, project_id, sku_description, sku_id
    ;
    
  • 依工作負載名稱取得扣除抵免額前的費用:

    SELECT
      labels.value as workload_name,
      SUM(cost) AS cost
    FROM `project-ID.dataset.gcp_billing_export_resource_v1_YYYYYY-YYYYYY-YYYYYY`
    LEFT JOIN UNNEST(labels) as labels
      ON labels.key = "k8s-workload-name"
    WHERE labels.value IS NOT NULL
    GROUP BY workload_name
    ORDER BY cost DESC
    ;
    

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本頁面所用資源的費用,請為叢集停用 GKE 費用分配功能:

gcloud container clusters update CLUSTER_NAME \
    --no-enable-cost-allocation

您也可以刪除自己建立的叢集。

您也可以使用 gcloud 指令列工具查看及管理標籤。詳情請參閱 gcloud resource-manager tags 說明文件。

後續步驟