Split cost allocation data查询

我们可以利用 CUR 通过使用 Amazon EKS Split cost allocation data来监控每个 pod 的 Amazon EKS 费用。Split cost allocation data扩展了 AWS CUR,通过显示 EC2 实例内 CPU 和内存利用率的 pod 资源核算,包含了 pod 级别的成本和使用情况。

查询1

以下查询显示所有集群上每个 pod 的每日 CPU 成本、RAM 成本和总拆分成本(CPU + RAM)。显示集群级元数据属性,如实例、集群、节点、命名空间和部署。

为了减少查询大小和输出数据,此查询将输出数据硬编码为过去七天:

SELECT 
  DATE_FORMAT(
    DATE_TRUNC(
      'day', "line_item_usage_start_date"
    ), 
    '%Y-%m-%d'
  ) AS "date",
  "line_item_resource_id" AS "resource_id",
  ARBITRARY(CONCAT(
    REPLACE(
      SPLIT_PART(
        "line_item_resource_id", 
        '/', 1
      ), 
      'pod', 
      'cluster'
    ), 
    '/', 
    SPLIT_PART(
      "line_item_resource_id", 
      '/', 2
    )
  )) AS "cluster_arn", 
  ARBITRARY(SPLIT_PART(
    "line_item_resource_id", 
    '/', 2
  )) AS "cluster_name", 
  ARBITRARY("split_line_item_parent_resource_id") AS "node_instance_id", 
  ARBITRARY("resource_tags_aws_eks_node") AS "node_name", 
  ARBITRARY(SPLIT_PART(
    "line_item_resource_id", 
    '/', 3
  )) AS "namespace",
  ARBITRARY("resource_tags_aws_eks_workload_type") AS "controller_kind", 
  ARBITRARY("resource_tags_aws_eks_workload_name") AS "controller_name", 
  ARBITRARY("resource_tags_aws_eks_deployment") AS "deployment",
  ARBITRARY(SPLIT_PART(
    "line_item_resource_id", 
    '/', 4
  )) AS "pod_name", 
  ARBITRARY(SPLIT_PART(
    "line_item_resource_id", 
    '/', 5
  )) AS "pod_uid", 
  SUM(
    CASE WHEN "line_item_usage_type" LIKE '%EKS-EC2-vCPU-Hours' THEN "split_line_item_split_cost" + "split_line_item_unused_cost" ELSE 0.0 END
  ) AS "cpu_cost", 
  SUM(
    CASE WHEN "line_item_usage_type" LIKE '%EKS-EC2-GB-Hours' THEN "split_line_item_split_cost" + "split_line_item_unused_cost" ELSE 0.0 END
  ) AS "ram_cost", 
  SUM(
    "split_line_item_split_cost" + "split_line_item_unused_cost"
  ) AS "total_cost" 
FROM 
  ${table_name} 
WHERE 
  "line_item_operation" = 'EKSPod-EC2' 
  AND CURRENT_DATE - INTERVAL '7' DAY <= "line_item_usage_start_date" 
GROUP BY 
  1, 
  2
ORDER BY 
  "cluster_arn", 
  "date" DESC;

运行结果示例如下:

image-20260125205041609

查询2 按 namespace的拆分月度成本

以下查询显示所有集群上按命名空间的月度 CPU 成本、RAM 成本和总拆分成本(CPU + RAM)。结果按月份排序,总成本降序。

为了减少查询大小和输出数据,我们建议最初将 ${date_filter} 修改为一个小的定义时间范围(例如三个月)。

SELECT 
  DATE_FORMAT(
    DATE_TRUNC(
      'month', "line_item_usage_start_date"
    ), 
    '%Y-%m-%d'
  ) AS "month", 
  CONCAT(
    REPLACE(
      SPLIT_PART("line_item_resource_id", '/', 1), 
      'pod', 
      'cluster'
    ), 
    '/', 
    SPLIT_PART("line_item_resource_id", '/', 2)
  ) AS "cluster_arn", 
  SPLIT_PART("line_item_resource_id", '/', 3) AS "namespace", 
  SUM(
    CASE WHEN "line_item_usage_type" LIKE '%EKS-EC2-vCPU-Hours' THEN "split_line_item_split_cost" + "split_line_item_unused_cost" ELSE 0.0 END
  ) AS "cpu_cost", 
  SUM(
    CASE WHEN "line_item_usage_type" LIKE '%EKS-EC2-GB-Hours' THEN "split_line_item_split_cost" + "split_line_item_unused_cost" ELSE 0.0 END
  ) AS "ram_cost", 
  SUM(
    "split_line_item_split_cost" + "split_line_item_unused_cost"
  ) AS "total_cost" 
FROM 
  ${table_name} 
WHERE 
  ${date_filter}
  AND "line_item_operation" = 'EKSPod-EC2' 
GROUP BY 
  1, 
  2, 
  3 
ORDER BY 
  "month" DESC, 
  "cluster_arn", 
  "namespace", 
  "total_cost" DESC;

运行结果:

image-20260125205516976