本页面介绍如何使用 Google Kubernetes Engine (GKE) 费用分配来获取关键支出分析,以便为您的资源分配和成本优化决策提供依据。了解 GKE 费用分配与集群用量计量之间的区别、GKE 费用分配的限制、如何在新集群和现有集群上启用 GKE 费用分配,以及如何过滤和查询 Cloud Billing BigQuery 导出。
本页面适用于在 GKE 中创建和配置集群以及部署工作负载时需要管理费用的运维人员、云架构师、开发者和数据管理员。如需详细了解常见角色,请参阅常见的 GKE Enterprise 用户角色和任务。
在阅读本页之前,您应该先熟悉在 GKE 上运行费用经过优化的 Kubernetes 应用的最佳实践
潜在数据量增加
启用 GKE 费用分配会增加 BigQuery 中的存储和查询费用。确切的增加量取决于您在 Pod 和集群中使用的不同标签和命名空间组合的数量。
启用 GKE 费用分配不会更改 GKE 用量的总费用。导出文件中费用专列项的总和相同,并且基于账单导出文件构建的现有查询和报告将返回相同的值。
GKE 费用分配和集群用量计量
GKE 费用分配与集群用量计量有以下区别:
- GKE 费用分配是集群用量计量的替代方法,用于获取集群信息。
- GKE 费用分配计算 Cloud Billing 账号中的集群费用,而不是汇总 Looker 数据洞察模板中的数据。
- 使用 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 可能不支持运行本文档中的命令。
- 确保您已完成将详细使用费数据导出到 BigQuery 的步骤。如果您的组织已在导出数据,则您必须具有查询表的权限。
- 确保您已有 Standard 集群。如需创建 Standard 集群,请参阅创建区域级集群。
局限和限制
- 您只能在 Cloud Billing BigQuery 详细使用费用数据导出中查看 GKE 费用分配数据。
- 您必须使用 Google Cloud CLI 392.0.0 或更高版本
- 如果您启用 GKE 费用分配,则账单导出将从该日期开始包含 GKE 资源的其他专列项。账单导出文件不会回填数据。
- 如果您停用 GKE 费用分配,则账单导出不会再包含其他专列项,但也不会修改或移除系统以前在启用该功能时生成的专列项。
- GKE 费用分配数据基于资源请求量,而非消耗的资源量。如需详细了解资源请求、资源限制和资源消耗量之间的区别,请参阅 Kubernetes 最佳实践:资源请求和限制。
- GKE 费用分配支持以下资源 SKU 类型:- Compute Engine 虚拟机实例 vCPU SKU
- Compute Engine 虚拟机实例 RAM SKU
- Compute Engine 虚拟机自定义扩展实例 RAM SKU
- Compute Engine 虚拟机实例 GPU SKU
- Compute Engine PD 容量 SKU
- Cloud TPU 实例 SKU
 
- 如果一个 Pod 有超过 50 个 Kubernetes 标签,则 Google Cloud 控制台的 Cloud Billing 部分中或 Cloud Billing 详细导出中都不会提供这些标签。
- 启用 GKE 费用分配后,数据最多可能需要三天时间才会显示在 Cloud Billing 中。
- GKE 费用分配包括来自 Persistent Disk 的数据,但存在以下例外情况:
- 仅支持通过 PersistentVolumeClaims或通用临时卷动态预配的PersistentVolume资源。
- 仅支持由 Compute Engine 永久性磁盘 CSI 驱动程序预配或者使用具有 ReadWriteOnce或ReadWriteOncePod访问模式的已弃用kubernetes.io/gce-pd存储插件来预配的PersistentVolume资源。
- 可能无法跟踪正常运行时间少于 30 分钟的 Persistent Disk。系统会始终跟踪至少具有 30 分钟正常运行时间的 Persistent Disk。
 
- 仅支持通过 
- Cloud TPU 版本必须为 Cloud TPU v4 或更高版本。
查看 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 标签键与虚拟机标签键冲突,则 Kubernetes 标签值会替换虚拟机标签值。集群和节点池资源标签按以下从高到低的优先级应用于资源: 
 | 
| 集群名称 | goog-k8s-cluster-name | [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 的费用。永久性磁盘费用会继承声明 Pod 的所有元数据,例如 Pod 标签和命名空间,直到其 PersistentVolumeClaims 被删除为止。对于根据收回政策删除但保留 PersistentVolumes 的 PersistentVolumeClaims,Persistent Disk 的费用将作为未分配跟踪。
直接应用于 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 费用分配,请执行以下操作:
- 前往 Google Cloud 控制台中的 Google Kubernetes Engine 页面。 转到 Google Kubernetes Engine
- 点击要修改的集群的名称。
- 在集群页面的功能部分中,点击费用分配旁边的 edit。
- 在修改费用分配对话框中,选中启用费用分配复选框。
- 点击保存更改。
验证是否已启用 GKE 费用分配
gcloud
描述集群:
gcloud container clusters describe CLUSTER_NAME
输出类似于以下内容:
...
costManagementConfig:
  enabled: true
...
在此输出中,costManagementConfig 表示已启用 GKE 费用分配。
控制台
如需检查现有集群上是否已启用 GKE 费用分配,请执行以下操作:
- 前往 Google Cloud 控制台中的 Google Kubernetes Engine 页面。 转到 Google Kubernetes Engine
- 点击要修改的集群的名称。
- 在集群页面的功能部分中,费用分配旁边会显示是否已启用 GKE 费用分配。
过滤 GKE 费用数据
以下示例查询展示了如何按集群名称、命名空间和标签对所支持资源类型的 GKE 费用进行过滤和分组。
将 BILLING_DATASET_TABLE 替换为您在 BigQuery 中创建的数据集的名称。
表名称与 gcp_billing_export_resource_v1_<BILLING_ACCOUNT_ID> 类似。
清理
为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请为集群停用 GKE 费用分配:
gcloud container clusters update CLUSTER_NAME \
    --no-enable-cost-allocation
您还可以删除创建的集群。
后续步骤
- 查看更多 Cloud Billing 数据导出查询示例。
- 了解如何使用 Looker 数据洞察直观呈现您的费用。