我们可以利用 CUR 通过使用 Amazon EKS Split cost allocation data来监控每个 pod 的 Amazon EKS 费用。Split cost allocation data扩展了 AWS CUR,通过显示 EC2 实例内 CPU 和内存利用率的 pod 资源核算,包含了 pod 级别的成本和使用情况。
以下查询显示所有集群上每个 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;
运行结果示例如下:

以下查询显示所有集群上按命名空间的月度 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;
运行结果:
