在过去的几年中,我们已经看到 Kubernetes 被广泛用作容器编排平台。随之而来的还有不同的方式来操作 Kubernetes 集群。一些企业更喜欢一个集群一租户(硬多租户),而另一些企业更喜欢一个集群 n 租户(软多租户)模型。我们已经看到许多企业都采用后一种模型,因为它可以帮助他们减少很多运营工作。对于软多租户模型,明智地提供成本分配租户的可见性非常重要,以便可以相应地向组织收费。
我们正在运行一个软多租户 Amazon EKS 集群。使用 Kubernetes 命名空间可以实现多租户。现在用于成本报告,AWS 提供了成本资源管理器,如果您想对节点,EBS 和整个网络收取费用,这将非常有用。但是不可能使用它来实现共享资源或池化资源的成本分离。我们希望基于租户创建报告,以便可以将其与预算相对应。市场上有许多用于 Kubernetes 成本报告的解决方案,我们一直在寻找开源的东西,最终选择了 Kubecost。在此博客文章中,我将详细说明如何将 Kubecost 用于多租户 EKS 集群,以获得更好的可见性。
Kubecost 可帮助您监视和管理 Kubernetes 环境中的成本和容量。- Kubecost 文档(https://docs.kubecost.com/
)
Kubecost 既可以作为开源产品也可以作为商业产品。该商业产品具有少量附加功能,例如用户身份验证,报告保存,企业支持以及更长的度量保留期。
可以在这里找到安装 Kubecost(https://docs.kubecost.com/install
) 的多种方法。我们使用 Helm 在集群中安装 Kubecost。这些命令可用于在默认配置下使用 Helm 3 安装 Kubecost。您将需要一个唯一的令牌,可以在这里获得(https://kubecost.com/install
)。
kubectl create namespace kubecost
helm repo add kubecost https://kubecost.github.io/cost-analyzer/
helm install kubecost kubecost/cost-analyzer --namespace kubecost --set kubecostToken="YWp1bmVqYUB0YXZpc2NhLmNvbQ==xm343yadf98"
有许多配置选项可用于在安装时配置 Kubecost。以下是我们在使用过程中的一些用例。
networkCosts.enabled=true
如果您想捕获网络成本并根据群集中的名称空间或租户进行隔离,这是一个非常重要的标识。通常,启用此标识将提供一个 DaemonSet,它将通过节点的流量映射到成本模型,并将其用于成本报告中。网络费率使用云提供商费率进行调整。有关如何工作的详细信息,请参见此处(http://docs.kubecost.com/network-allocation
)。收集的网络数据分为不同类别,例如互联网出口,跨区域出口和跨集群出口。您可以覆盖这些网络分类并自行设置。
prometheus.kubeStateMetrics.enabled=false
prometheus.nodeExporter.enabled=false
prometheus.serviceAccounts.nodeExporter.create=false
Prometheus,Grafana 和 Metrics Server 也随附 Kubecost 默认安装。有多种方法可以重新利用您现有的 Prometheus 和 Grafana 设置,但过程非常繁琐(https://docs.kubecost.com/getting-started#custom-prom
)。它需要对Prometheus scrape配置、重新标记、记录规则等进行一些修改。Kubecost安装的建议方法是重用集群中现有的节点导出器和度量服务器(如果可用),并设置Kubecost安装附带的单独Prometheus和Grafana。
prometheus.server.retention=15d
prometheus.server.persistentVolume.size=32Gi
默认情况下,您只有 15 天的度量标准保留和 32Gb 永久卷可用于 Prometheus 度量标准保留。您可以使用以下公式根据保留期限来计算存储需求:
needed_disk_space = retention_time_minutes * ingested_samples_per_minutes * bytes_per_sample
您可以在入门文档页面的度量标准存储配置部分中了解有关此内容的更多信息(https://docs.kubecost.com/getting-started#storage-config
)。
如果您正在为 Kubernetes 进行成本优化,或者想清楚了解特定租户或服务的成本,那么Kubecost 成本分配视图就是您大部分时间将花费的空间。您可以为所有 Kubernetes 对象(例如 Deployments,StatefulSets 等)过滤成本。如果您正在使用使用名称空间的软多租户,则可以基于名称空间过滤此视图,并使所有租户进行成本分配。
成本分配视图提供了 Kubernetes 主要成本组成部分的详细见解,例如计算,网络,存储等。对于计算,您将获得内存,CPU 和 GPU 的成本分配。同样,如果您使用的是 StatefulSet,则还可以获取使用云提供商存储率计算的永久卷成本。如果使用上述标志启用了网络成本核算,那么您还将获得与对象关联的网络成本。
这是 Kubecost 的一个非常有用的功能,因为它提供了一些有价值的建议,可以节省很多钱。这些报告可能并非每次都非常准确,但是它们或多或少地被概括了下来,将帮助您确定集群中某些部分的节省量。
节省建议实际上主要涵盖以下几个方面:
节点和容器的大小调整
它生成有关计算节点大小的建议以及带有超额配置请求的 Pod 的报告。这些建议可以帮助您调整节点和 Pod 的请求,帮助您更好地利用集群容量。
未充分利用的节点报告
这提供了当前未充分利用的节点报告,并且可以在其他节点中迁移或调整其工作负载。这是一份非常重要的报告。集群自动缩放器缩减了集群的规模,但是它具有某些检查功能,可用于识别并缩减资源浪费的节点。该报告实际上为您提供了有关为什么即使节点未被充分利用也无法缩小规模的详细信息。
未充分利用的存储
这提供了有关未声明的持久卷以及连接到节点且当前未充分利用的任何本地存储的详细信息。
Kubecost 报告包含有关集群成本分配的详细信息。就像成本分配视图一样,您可以基于名称空间,Kubernetes 对象或标签生成这些报告。您可以添加过滤器并创建特定于特定租户或团队的报告。它还提供了导出功能,有助于定期与团队共享此功能,从而提高了可见性。确保使用以上安装部分中提到的标识,根据您的报告要求设置正确的保留期。
我们正在使用 AWS Savings Plan for Compute 资源,因此集群节点的实际费率与按需价格不同。使用默认安装的 Kubecost,您将看到节点的按需费率,因为这会导致群集成本高昂。Kubecost 具有与 AWS Cost and Usage Reports 集成的非常好的功能,它提供了 AWS 资源的详细成本,还涵盖了价格调整的详细信息(如果您购买了任何储蓄计划或预留实例)。集成过程并非易事,并且根据您的 AWS 账户的结构,有不同的设置方法。如果您的计费帐户与运行 Kubecost 的帐户相同,则设置起来会稍微容易一些。在我们的案例中,AWS 账户是使用 AWS Organization 构建的,并且 Kubecost 在其中一个成员账户中运行。由于账单账户是主账户,因此我们在主账户中创建了 AWS CUR,并在成员账户中创建了进一步的步骤。下图说明了该设置的实现方式。有关集成的更多详细信息,请参见此处(https://docs.kubecost.com/aws-out-of-cluster.html
)。
它是 Kubecost 集成与云提供商成本报告的扩展。从设置的角度来看,这与上图非常相似。唯一的区别是,您需要执行一些标签关联。很多时候,我们将大量的云提供商托管服务与诸如 RDS,MSK 等 Kubernetes 一起使用。集群外成本功能可帮助您通过这些成本核算来增强 Kubernetes 成本报告,并最终将 Kubecost 用作完整的堆栈成本报告解决方案。它与标签相关的方式完全基于资源标签。例如,您可以使用名称空间标识符,然后相应地标记您的云资源。我们没有使用此功能,因为我们的云资源由租户共享。
Kubecost 中还有许多其他功能尚未使用,我觉得一篇文章无法涵盖全部。一些值得研究的功能,关于 Slack 和电子邮件的通知。您可以为名称空间设置成本阈值,并在任何名称空间超出预算时获得警报。如果您正在使用竞价型实例,则可以集成竞价型概要以获取正确的定价详细信息。Kubecost 可以与 AWS 和 GCP 集成。它还可以为您提供自定义定价,以免与计费帐户集成。
Kubernetes十大必知设计模式
Kubernetes成熟度模型
使用Kubernetes和Istio构建大规模集群带来的挑战和解决方案