如何跟踪多租户Amazon EKS集群中的成本

2020-07-29 03:45:01

许多AWS客户使用Amazon Elastic Kubernetes Service(Amazon EKS)来操作多租户Kubernetes集群,其中属于不同团队或项目的工作负载在共享集群中运行。像Kubernetes这样的客户提供工作负载的集中管理,使管理员能够使用单个API创建、更新、扩展和保护工作负载。在这篇文章中,我们将演示细分EKS集群运营成本的选项。

客户与我们分享了EKS集群中租户分摊成本的重要性。我们正在努力提供一种在多租户Kubernetes环境中跟踪和分配成本的本地方法。现在,您可以使用以下方法之一按租户分配成本:

基于消耗的计费-使用资源消耗计算共享EKS集群的成本。

在单独的AWS账户中运行工作负载是跟踪成本的最简单方式。通过在专用账户中为每个租户创建单独的EKS集群,您可以确定该集群及其依赖关系的成本,而无需运行报告来确定每个租户的支出。

但是,这需要维护多个EKS群集,这可能会增加您的AWS支出,并使网络架构变得复杂。如果群集中的服务需要与其他帐户中运行的服务通信,则需要在这些帐户之间提供连接。您不仅需要支付多个EKS控制面的费用,而且每当流量通过VPC边界时,您还会产生网络传输费用。

您还会失去共享集群的效率优势;您将不得不在每个集群中运行用于监视、日志记录和联网(如服务网格)的共享组件。由于这些原因,此选项可能是不利的,除非您需要单独的账单,该账单不能包括此工作负载所产生的成本以外的任何内容。

启用成本分配的另一种方法是共享一个群集,在该群集中,每个租户都有自己的专用节点组。您可以使用节点选择器和节点亲和性等Kubernetes特性来指示Kubernetes Scheduler在专用节点组上运行租户的工作负载。您可以使用标识符(如产品名称或团队名称)标记节点组中的EC2实例,并使用标记来分配成本。

此方法的一个缺点是,您可能最终在每个节点组中都有未使用的容量,并且可能无法充分利用在运行密集群集时节省的成本。

使用此方法,您仍需要分配共享资源的成本,如EKS控制平面、共享群集级服务(用于日志记录、监控、治理等)、弹性负载均衡(ELB)、NAT网关和网络传输费用。

在多租户Kubernetes集群中跟踪成本的最有效方式是根据工作负载消耗的资源量分配产生的成本。此模式允许您最大化EC2实例的利用率,因为不同的工作负载可以共享节点,这允许您增加节点上的Pod密度。

但是,根据工作负载或命名空间计算成本是一项具有挑战性的任务。要确定一组Pod使用的资源,您必须汇总给定时间段的计算资源使用情况(已使用或保留的CPU、内存、磁盘),并计算成本。但是,容器通常是短暂的,可能会频繁伸缩,实际资源使用量会随时间波动。换句话说,您不能简单地将一天的使用量乘以30来估计每月的账单。要了解工作负载的成本责任,需要汇总某一时间范围内消耗或保留的所有资源,并根据资源成本和使用持续时间评估费用。说起来容易做起来难。

Kubecost就是这样一种工具,它允许您根据资源使用情况来分配运行Kubernetes集群的成本。遵循多租户最佳实践,您可以为每个租户创建一个名称空间,并使用Kubecost来确定每个租户的成本责任。它允许您按服务、部署、命名空间、标签、Pod、容器、团队和产品深入查看支出。

使用Kubecost,您可以跟踪租户的支出,而无需创建单独的群集或按工作节点分隔工作负载。它提供了一种在多租户Kubernetes集群中执行按存储容量使用计费的简单且经济高效的方式。

Stackwatch的开放核心工具Kubecost提供成本监控和容量管理解决方案。它的主要用例之一是提供跨Kubernetes集群的成本可见性。它使用三个指标来确定工作负载的成本:

Kubecost的开源版本将价格数据存储限制为15天。要保留超过15天的指标,您必须升级到付费版本。

Kubecost的默认安装包括优化的Prometheus服务器,该服务器仅包含对Kubecost有用的指标。与标准普罗米修斯部署相比,此优化版本保留的指标减少了70-90%。您也可以使用现有的普罗米修斯安装。

Kubecost在您的集群中运行。下面的步骤将指导您完成安装过程。

Helm是安装Kubecost的推荐方式。如果未安装Helm,请参阅将Helm与Amazon EKS配合使用。如果您不喜欢Helm,Kubecost还提供其他安装方法。本教程中的步骤使用Helm 3。

在继续之前,您需要通过访问kubecost.com/install获取唯一令牌。您必须在安装过程中输入令牌。

如果您的群集已经安装了Prometheus,您可以自定义Helm图表以跳过Kube-state-metrics和node-exporter安装。你可以在这里阅读更多关于在Kubecost中使用定制普罗米修斯的信息。

Helm update kubecost kubecost/成本分析器--命名空间kubecost\--set kubecostToken=";<;您的kubecostToken&>&34;\--set prometheus.kubeStateMetrics.enable=false\--set prometheus.nodeExporter.enable=false。

默认情况下,Kubecost使用AWS公开定价来计算运行群集的成本(控制平面和数据平面)。它允许您按命名空间、服务、部署等各个维度划分成本。此外,通过附加IAM策略并授予访问成本和使用情况报告的权限,Kubecost还可以反映有效的预留实例和节约计划费率。

Kubecost提供了一个Web仪表板,您可以通过kubectl端口转发、入口或负载均衡器进行访问。本教程使用具有基本身份验证的Inress。付费版本的Kubecost还支持使用SSO/SAML限制对仪表板的访问,并提供不同级别的访问。例如,将团队的视图限制为他们负责的产品。

您可以使用Nginx Inress将Kubecost仪表板提供给那些无法访问kubectl的用户。

#add helm稳定repo helm repo添加稳定https://kubernetes-charts.storage.googleapis.com#install nginx-inress helm安装示例-入口稳定/nginx-ingress-n kubecost。

我没有用于Kubecost仪表板的注册域,因此我必须更改Inress规范中的主机以匹配ELB DNS名称。

Echo";ApiVersion:扩展/v1beta1种类:入口元数据:注释:nginx.ingress.kubernetes.io/auth-domain:需要鉴权-ok nginx.ingress.kubernetes.io/auth-ret:kubecost-auth nginx.ingress.kubernetes.io/auth-type:基本标签:app:成本分析器app.kubernetes.io/instance:kubecost app.kubernetes.io。:Rules:-host:$ELB http:路径:-Backend:serviceName:kubecost-成本分析器servicePort:9090 path:/";|kubectl应用-f-。

我们将使用基本身份验证来限制对仪表板的访问。创建密码文件:

最终的入口配置应该如下所示(从输出中删除了一些行):

库贝特会得到入场券。Kubecost-成本分析器-o yaml-Kubecost提供了一个web仪表板,您可以通过kubectl端口转发访问该仪表板,也可以使用入口或负载均衡器将其暴露在集群外部。本教程使用具有基本身份验证的入口。Kubecost付费版本还支持使用sso/saml(http://docs.kubecost.com/user-management.html)and限制对仪表板的访问,提供不同级别的访问。n kubecost api版本:扩展/v1beta1种类:入口元数据:注释:nginx.ingress.kubernetes.io/auth-domain:需要身份验证-ok nginx.ingress.kubernetes.io/auth-secret:kubecost-auth nginx.ingress.kubernetes.io/auth。管理者:helm app.kubernetes.io/名称:成本分析器helm.sh/图表:成本分析器-1.60.1名称:kubecost-成本分析器命名空间:kubecost规范:规则:-主机:aa777bde02780402173825f8fb4c6c6-1099488085.us-west-2.elb.amazonaws.com http:路径:-后端:服务名称:kubecost-成本分析器服务端口:9090path:/status:loadbalancer:入口:-ip:192.168.130.94。

现在,您可以使用入口访问Kubecost仪表板。您可以转到ELB的地址访问您的仪表盘。您可以这样获取地址:

仪表板允许您按名称空间之类的维度深入查看月度运行率。它还支持以CSV格式导出报告。

您可以运行报告以查看共享群集中的服务产生的费用。Kubecost提供保存的报告,您可以在其中访问经常查看的按存储容量使用计费的报告。

Kubecost还提供了节省成本的机会。它可以帮助您定位未使用的卷、过度调配的复制副本或已放弃的工作负载。Savings下的Dissured Workload部分显示尚未收到任何有意义流量的Pod。您可以调整流量阈值和时长来查找可能未被活跃使用的实例。

Kubecost使用AWS Spot实例数据馈送提供准确的现货定价。它还可以帮助正确调整Pod的大小。它跟踪已声明的容器请求,并根据使用情况提供建议。随附的Grafana控制面板向您显示集群中的资源利用率。

Kubecost根据Kubernetes原生指标提供合适的大小调整建议。它使用两个主要输入:第一,您自己对集群上运行的工作类型(例如,开发、生产、高可用性)的描述;第二,它检测每个工作负载的资源需求的历史“形状”,由Kubecost度量来衡量。然后,产品考虑不同的启发式或装箱策略来满足集群的需求。

我们向您展示了如何使用Kubecost在共享EKS环境中跟踪成本。如果您选择硬多租户,您可以使用每群集不同的Kubecost实例单独跟踪成本,也可以升级到Kubecost付费支持,从而使用同一控制面板跨多个群集提供成本可见性。

EKS项目经理内森·泰伯(Nathan Taber)表示:“客户应该将多租户选项视为在操作简单性和可控性之间取得平衡的一种选择。一方面,拥有单个集群在操作上很简单,但更难审计和控制。另一方面,每个帐户拥有一个集群很容易审核和控制,但如果您有很多集群,则可能会造成操作复杂性。您的正确决策将取决于您需要运行的群集数量、您的组织结构,以及您愿意采用和维护的运营工具来管理多个群集和客户。“。无论您采用哪种模式,都可以使用Kubecost来了解、分配和降低成本。在AWS Marketplace中提供Kubecost。

Kubernetes成本分配的其他选项包括Spot.io的Ocean、Cloudability和Yotascale。EKS研讨会还有一个模块,其中包括海洋漫游。