在TKE上使用Kubecost进行成本管理

joseph · · 472 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
## 概述 Kubernetes 作为 IaaS 和 PaaS 的中间层,当前对于资源的计费依托于 IaaS 层的资源计费。一个 Kubernetes 的集群,按照其购买的节点实例 CVM 计费。而用户则使用的是 Pod,在实际场景中,通常需要面临这些问题,一个 Pod 如何承担成本、如何评估集群的成本、如何进行成本预测和优化建议。针对上述问题,我们推荐用户使用 Kubecost 进行解决。 Kubecost 是一款成本分析工具,可以为集群成本提供洞察、分析、推荐和建议。作为您优化集群成本的财务分析师,Kubecost 可以为您提供全面的成本分析报告。本文将介绍 Kubecost 使用场景、优化建议、详细的功能说明以及如何安装使用。 ## 使用场景 ### 评估每种资源消耗的成本 成本支出,即为计算 Pod 资源请求(Request)或者使用量(Usage)消耗的成本。根据不同类型的资源,按照 Pod 所在 Node 的 IaaS 计价方式作为基本参考,来计算 Pod 所使用的成本费用。 目前云厂商的 Node 计费模式一般是**包年包月(Month)**、**按量计费(Hour)**和**竞价实例**。当 Kubecost 计算 Pod 成本时,即使是相同请求量的 Container,在不同类型的 Node 上成本消耗也不一致。 上述三种计费模式中,由于用户购买的是一个整体实例,因此按照实例计费,不针对单独一个资源计费。而通过使用 Kubecost,可以参照模型分析资源类型分摊成本、每种资源分摊成本。 例如,一个云厂商提供的某种 Node(虚拟机、物理机),CPU 为1核(C),内存 Mem 为1G,价格为20元/月。 通过使用 Kubecost,需要添加云厂商说明的每种资源的基础价格,例如 CPU、Mem 价格。或者按照业务需要配置对应的比例,例如1C:1G 的价格比是3:1,CPU/Mem=3:1等。可以得知分摊到每种资源(CPU/GPU/Mem/PV/Network)的计费。 具体计算公式如下: **sum (normalized_resource_price[i] × resource_quantity[i]) = node_price** 因此得到,整个 Node 的价格为20元/月,按照 CPU 15元/月、Mem 5元/月进行分摊成本。 ### 评估成本效率 成本加权平均评估效率,由于每一种资源的成本权重不同(成本权重即为不同类型的资源,售卖的价格不同。例如 CPU 和 GPU 等计算资源价格相对较高,Mem 价格相对较低,而 Disk 价格则更低),相同的资源利用效率,不同资源对成本的贡献度也不一样。 例如,100%的 Disk 利用率,但是由于磁盘相对便宜,对最终的成本控制的贡献就较低。但如果是 CPU 资源,即使资源利用率为30%,由于 CPU 资源价格相对昂贵,最终可能对成本起到关键作用,因此需要用加权平均来评估成本效率,例如: - Mem 的效率:MemEfficiency = MemUsage / MemRequest - CPU 的效率:CPUEfficiency = cpuUsage / cpuRequest - Mem 的成本效率:MemCostEff = a.MemEfficiency() × a.MemTotalCost() - CPU 的成本效率:cpuCostEff = a.CPUEfficiency() × a.CPUTotalCost() - **总成本效率**:totalEff=(MemCostEff + cpuCostEff) / (a.CPUTotalCost() + a.MemTotalCost()) ### 优化建议 在判断哪些业务需要优化以及如何优化成本结构,可以先查找 TOP 10 的某种资源浪费,例如资源的 Usage 和 Request 差别较大,可以根据应用监控画像给出推荐的 Request,最后计算出每种资源可节省的成本。 ### 评估经济学边际成本 关于节点自动扩容部分,可以衡量一个集群中每个节点,假设 CPU 和 Mem 每增加 1C1G,最终成本达到多少,是否会出现规模效应(规模效应即为资源数量增加,成本并不会爆炸,但是却可以解决装箱问题)。 如有上述需求和问题,您都可以使用 Kubecost 来分析自己的集群成本趋势。 ## 前提条件 - 已创建容器服务 TKE 集群。如果您还未创建集群,请参见 [快速创建一个标准集群](https://cloud.tencent.com/document/product/457/54231)。 - 已使用命令行工具 Kubectl 连接集群。如果您还未连接集群,请参见 [连接集群](https://cloud.tencent.com/document/product/457/32191)。 ## 功能说明 - Kubecost 主要给出 cost 分析,包括 Service、Application、Pod、Workload 等各种标签类型维度分析。 - 资源分配和使用。 - 包含一个集群健康检查的功能,类似集群巡检和健康检查。 ### Overview ![](https://main.qcloudimg.com/raw/5d189e38aab69d433a9a6bda3320e0e2.png) **上述图中数字序号标示处相关说明可参考下文对应说明介绍**: 1. 月度预估可以节省的**金额**以及可以节省成本的**优化建议数量**。 2. **月度账单和成本效率**: - 月度账单:基于过去7天资源消耗的**预测值**。 - 成本效率:基于过去2天的成本效率。 计算方法:(每种资源利用率 × 各自的价格之和)/ 总价格 3. **月度集群账单**。账单维度包括 Total cost、Compute、Memory、Storage。 4. **资源效率**: - 基于当前的资源提供量和过去7天的资源使用量计算。 - 资源分成三个维度: Compute、Memory、Storage。 - 成本构成四个维度:空闲、系统、应用、其他。 5. **Controller Allocation**:按 Controller 分类,通过过去两天计算每个 Controller 的成本。 6. **Service Allocation**:按 Service 分类,通过过去两天计算每个 Service 的成本。 7. **Namespace Allocation**:按 Namespace 分类,通过过去两天计算每个 NS 的成本以及成本效率。 计算方法:每种资源利用率 × 各自的价格之和 / 总价格 8. **Infrastructure health**:集群基础架构状态评分,比较像我们的集群巡检,给出一些优化建议,例如: - Worker nodes 跨可用区部署。 - Master 多副本。 - 检测 CPU 被 throttling 的 Pod。 ### Cost Allocation ![img](https://main.qcloudimg.com/raw/b9469008a0b87974c3796657ff505efd.png) **上述图中数字序号标示处相关说明可参考下文对应说明介绍**: 1. **显示的指标**: - 累积成本:在选定时间窗口的实际/历史支出。 - 费率指标:每小时、每天或每月的成本,基于所选时间窗口中的样本,也用于预计成本。 2. **聚合**: Cost Allocation 可以查看所有原生 Kubernetes 概念的分配支出,例如 NS、Label、Service。 Cost Allocation 还允许将成本分配给 team、product/project、department、or environment 等组织概念。 3. **时间窗口**: 用于衡量成本的指定时间窗口。默认情况下会缓存 1d、2d、7d 和 30d 查询的结果。 4. **过滤**: 按 NS、clusterId 、lable、Pod prefix 过滤资源,以更密切地查询成本支出的关键位置。 5. **Allocate idle costs(分配空闲成本)**: Allocate idle costs 按比例将空闲或空闲集群成本分配给租户。具体来说,这适用于已配置但未被租户完全使用或请求的资源。例如,如果您的集群的利用率仅为25%,以资源的最大使用量和 Request 来衡量,则 Allocate idle costs 会按比例增加每个 pod/NS/Deployment 的成本到原来的4倍。 6. **图表选择**: 切换到条形图视图以查看所选窗口的汇总成本,或切换到时间序列视图以查看成本随时间的变化。 7. **附加选项**: 查看其他选项以将成本数据导出为 CSV 或查看帮助文档。 ### Assets ![img](https://main.qcloudimg.com/raw/275c22510f157d3b3710aa147eb2f69f.png) Kubecost Assets 视图显示了按集群中单个资源细分的 Kubernetes 集群成本(例如,按节点、磁盘和其他资源划分的成本)。 ### Savings 展示月度预估可以节省的金额以及可以节省成本的优化建议数量,即 Overview 页面里面第一个入口。 以 Request 推荐为例,如下面第二张图所示,这里提供了以下三种不同等级的推荐值,并且推荐值与给定的时间窗口也存在关系: - **Development:**the aim is 80% resource utilization at 85th-percentile resource usage over the given window。 - **Production:**the aim is 65% resource utilization at 98th-percentile resource usage over the given window。 - **High-availability:**the aim is 50% resource utilization at 99.9th-percentile resource usage over the given window。 ![img](https://main.qcloudimg.com/raw/1d5e1383cf4ffe108b4f2221f811e6e8.png) ![img](https://main.qcloudimg.com/raw/c17bd39a6b90666d88a99542552ffc2b.png) ### Health 集群基础架构状态评分,建议修复的会标识红色感叹号❗,如下图所示: ![img](https://main.qcloudimg.com/raw/def229e1eeb39af2abb6c029294329dd.png) ### Reports Reports 主要保存一些观测数据,观测粒度和 Cost Allocation 里一致,支持按照某种方式聚合/观测数据之后,一键保存。如下图所示: ![](https://main.qcloudimg.com/raw/a550844cd1b0b3dfa866e46385dd0c04.png) ## 操作步骤 ### 安装 helm 登录到某个 Node 节点,执行以下命令安装 helm: ```sh curl https:``//raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash ``` ### 下载 Kubecost helm 执行以下命令下载 Kubecost helm: ```sh wget https:``//qitian-1251707795.cos.ap-beijing.myqcloud.com/cost-analyzer-1.81.0.tgz ``` ### 安装 Kubecost 1. 执行以下命令安装 Kubecost: ```sh kubectl create ns kubecost``helm install cost-analyzer cost-analyzer-``1.81``.``0``.tgz -n kubecost ``` 2. 执行以下命令,查看服务 Pod 是否都正常运行。示例如下: ```sh kubectl get pods -n kubecost -o wide ``` 执行结果如下图所示: ![img](https://main.qcloudimg.com/raw/bff2c85ed8a62458d90a5b06580bb5ed.png) ### 更改服务访问方式 1. 登录 [容器服务控制台](https://console.cloud.tencent.com/tke2/cluster)。 2. 单击对应的集群 ID/名称,进入集群管理页面。 3. 单机**服务和路由** > **Service**进入 Service 页面。 4. 找到您想要更改的 Service,在其右侧操作栏下单击**更新访问方式**进入更新访问方式页面。 ![](https://main.qcloudimg.com/raw/7949fd01702d5f779cb2ccb00b6efe3a.jpg) 5. service cost-analyzer-cost-analyzer 的访问方式为负载均衡方式,更新服务访问方式之后会得到一个公网 IPv4 地址,便可在公网进行访问。 - 访问地址:` http://[服务公网地址]:9090` - 初始用户名和密码:admin、admin。 ### 卸载 执行以下命令可卸载 kubecost: ```sh helm uninstall cost-analyzer -n kubecost ```

关注本站微信公众号(和以上内容无关)InfraPub ,扫码关注:InfraPub

472 次点击  
加入收藏 微博
1 回复  |  直到 2021-09-10 15:50:06
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传