取得 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 分鐘,系統可能不會追蹤。 系統一律會追蹤運作時間至少 30 分鐘的永久磁碟。
  • Cloud TPU 版本必須為 Cloud TPU v4 以上。
  • GKE 費用分配功能不適用於 A4 或 A4X VM 執行個體,或連接至這些執行個體的 GPU。
  • 如果使用外部節點管理解決方案,略過 GKE 節點集區,則不支援 GKE 費用分配。
  • 啟用折扣共用功能後,如果使用承諾使用折扣 (CUD),GKE 費用分配功能可能無法完整細分 CUD 涵蓋的執行個體費用,且費用可能會歸給 goog-k8s-unsupported-sku 等命名空間。
  • GKE 費用分配不支援原生邊車容器,也就是具有 restartPolicy: Always 設定的 init 容器。邊車容器要求的資源不會歸因於 Pod 的命名空間,而是回報至 kube:unallocated 命名空間。

查看 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. 在「Clusters」(叢集) 頁面的「Features」(功能) 區段中,按一下「Cost Allocation」(費用分配) 旁邊的 。
  4. 在「Edit Cost Allocation」(編輯費用分配) 對話方塊中,勾選「Enable Cost Allocation」(啟用費用分配功能) 核取方塊。
  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. 在「Clusters」(叢集) 頁面的「Features」(功能) 區段中,「Cost Allocation」(費用分配) 旁會顯示是否已啟用 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 說明文件。

後續步驟