写点什么

Kubernetes 成本优化

作者:俞凡
  • 2023-11-19
    上海
  • 本文字数:4927 字

    阅读完需:约 16 分钟

云原生可以帮助团队更精细化利用资源,但如果缺乏工具的帮助,很难采取适当的措施优化资源的使用。本文介绍了若干用于可视化 Kubernetes 资源使用情况的工具,并且可以自定义策略优化资源使用,实现更好的成本优化。原文: Kubernetes Cost Optimization Made Easy: Efficient Tools for Streamlining FinOps

概述

随着组织将 Kubernetes 用于工作负载的容器化,对有效成本优化的需求也就变得至关重要。


利用高效工具驾驭云原生基础设施的复杂性,是简化 FinOps 实践和最大限度节省成本的关键。


幸运的是,有很多有效工具可以简化 FinOps 实践并显著节省成本。


本文将讨论 Cloudability、Kube-Green、Cloud Custodian 和 Kubecost 等前沿解决方案。


了解这些工具如何帮助企业实现成本可视化,优化资源利用率,并在 Kubernetes 部署中实现更好的财务安排。接下来我们将深入了解 Kubernetes 成本优化的世界。💸


kube-green 简介🍀

我们会尝试了解 kube-green 的诞生以及为什么对减少资源浪费很有用。

kube-green 的想法

在 Kubernetes 集群中,非生产的命名空间通常在工作时间运行,每周大约运行 40 个小时,而每周总共有 168 个小时。


通常我们需要将资源提前分配给这些命名空间中的 pod,而这些资源可能并没有被使用,结果就是造成不必要的 CPU 和内存资源消耗。


Kube-Green 提供了简单的解决方案,通过停止这些命名空间中的 pod 来解决这个问题,从而有效优化非工作时间的资源利用率。

这怎么可能?🤔

kube-green 是一个 Kubernetes 控制器,定义了一个名为 SleepInfo 的自定义资源定义(Custom Resource Definition),SleepInfo CRD 定义了何时停止和重启命名空间中的 pod。


例如,在开发命名空间中,可以在非工作时间停止所有 pod,即周一到周五每天早上启动 pod,周一到周五每天晚上停止 pod。

实操👷

要进行以下练习,应该在本地安装kubectlkind



有了所需工具,让我们开始吧!

➡️安装 cert-manager

用如下命令安装最新版本的 cert-manager



用如下命令检查 cert-manager 部署是否正确,验证所有 pod 都正确运行。


安装 kube-green㊙

用默认的静态安装安装 kube-green,或者查看其他安装方法


用如下命令安装 kube-green:


kubectl apply -f https://github.com/kube-green/kube-green/releases/latest/download/kube-green.yaml
复制代码


该命令创建 kube-green 命名空间并部署 kube-green-controller-manager。检查 pod 是否正确运行:


kubectl -n kube-green get pods
复制代码
➡️在 dev 命名空间中设置 kube-green

要设置 kube-green,必须在 dev 命名空间中创建SleepInfo资源。


SleepInfo 规范包含:


  • weekdays: 一周中的一天。*代表每天,1代表星期一,1-5代表星期一到星期五

  • sleepAt: 命名空间进入睡眠状态的时间,以小时和分钟为单位(HH:mm)。例如 19:00,或者*:*表示每小时每分钟。休眠的资源是 Deployment(将 replicas 值设置为 0),如果suspendCronjobs选项设置为 true,则 cron 作业将被挂起。

  • wakeUpAt(可选): 需要将 namespace 恢复到初始状态(休眠前)的时间,单位为小时和分钟(HH:mm)。例如 19:00,或者*:*表示每小时每分钟。如果不设置 wake up 值,则不恢复该命名空间中的 pod,而是需要部署初始命名空间配置来恢复。

  • timeZone(可选,默认为 UTC): IANA 规范中的时区。例如,对于意大利时间,设置为Europe/Rome

  • suspendDeployments(可选,默认为 true): 如果设置为 false,deployments 就不会被挂起。

  • suspendCronJobs(可选,默认为 false): 如果设置为 true,将挂起 cronjobs。

  • excludeRef(可选): 对象数组,包含要从休眠中排除的资源。可以精确指定指定资源名称或根据标签进行匹配。可能的格式有:

  • apiVersion: 资源版本号。当前支持"apps/v1","batch/v1beta1"和"batch/v1"

  • kind: 资源种类。当前支持"Deployment"和"CronJob"。

  • Name: 资源名称

  • matchLabels: 带有标签的字符串对象,用来标识资源。文档中有更多示例。

示例 🏗
apiVersion: kube-green.com/v1alpha1kind: SleepInfometadata:  name: working-hoursspec:  weekdays: "1-5"  sleepAt: "20:00"  wakeUpAt: "08:00"  timeZone: "Europe/Rome"
复制代码


如果应用这个 CRD,Deployment 在工作日的睡眠时间为 20:00,唤醒时间为 08:00。

通过 kubecost💰介绍 OpenCost

kubectl-cost是一个kubectl插件,提供了通过OpenCost API轻松访问 Kubernetes 成本分配指标的 CLI,允许开发人员、devops 和其他人员快速确定任何 Kubernetes 工作负载的成本和效率。

OpenCost 设置

OpenCost 需要 Prometheus 抓取指标和数据存储,按照以下步骤安装 OpenCost。

快速安装📁

以下命令可以帮助我们立即开始使用 OpenCost。

安装 Prometheus
helm install my-prometheus --repo https://prometheus-community.github.io/helm-charts prometheus \  --namespace prometheus --create-namespace \  --set pushgateway.enabled=false \  --set alertmanager.enabled=false \  -f https://raw.githubusercontent.com/opencost/opencost/develop/kubernetes/prometheus/extraScrapeConfigs.yaml
复制代码
安装 OpenCost
kubectl apply --namespace opencost -f https://raw.githubusercontent.com/opencost/opencost/develop/kubernetes/opencost.yaml
复制代码
安装 kubecost

需要在集群中运行Kubecost,推荐使用 Helm,但也有其他安装选项


  • Helm 3


helm repo add kubecost https://kubecost.github.io/cost-analyzer/ helm upgrade -i --create-namespace kubecost kubecost/cost-analyzer --namespace kubecost --set kubecostToken="a3ViZWN0bEBrdWJlY29zdC5jb20=xm343yadf98"
复制代码


  • 安装 kubectl cost

  • Krew 如果已经安装了kubectl插件管理器Krew:


kubectl krew install cost
复制代码


Github 上有Krew manifest

示例

Kubecost 通过命名空间、部署、控制器、标签、pod 和节点等子命令提供基于聚合的成本监控,这些子命令提供按各自名称聚合的成本信息。有两种模式: rate(默认)和 non-rate(历史信息)。rate 模式显示基于活动的预计每月成本,而非 rate 模式显示指定窗口持续时间的总成本。


显示每个命名空间的预计每月费率,并显示所有成本组件。


kubectl cost namespace --show-all-resources
复制代码


输出:


+-------------------+-----------+----------+----------+-------------+----------+----------+----------+-------------+--------------------+| NAMESPACE         | CPU       | CPU EFF. | MEMORY   | MEMORY EFF. | GPU      | PV       | NETWORK  | SHARED COST | MONTHLY RATE (ALL) |+-------------------+-----------+----------+----------+-------------+----------+----------+----------+-------------+--------------------+| kube-system       | 29.366083 | 0.066780 | 5.226317 | 0.928257    | 0.000000 | 0.000000 | 0.000000 | 137.142857  |         171.735257 || kubecost-stage    | 6.602761  | 0.158069 | 1.824703 | 1.594699    | 0.000000 | 2.569600 | 0.000000 | 137.142857  |         148.139922 || kubecost          | 6.499445  | 0.116629 | 1.442334 | 1.461370    | 0.000000 | 2.569600 | 0.000000 | 137.142857  |         147.654236 || default           | 3.929377  | 0.000457 | 0.237937 | 0.283941    | 0.000000 | 0.000000 | 0.000000 | 137.142857  |         141.310171 || logging           | 0.770976  | 0.003419 | 0.645843 | 0.260154    | 0.000000 | 0.000000 | 0.000000 | 137.142857  |         138.559676 || frontend-services | 0.710425  | 0.003660 | 0.595008 | 0.244802    | 0.000000 | 0.000000 | 0.000000 | 137.142857  |         138.448290 || data-science      | 0.000284  | 2.000000 | 0.009500 | 2.000000    | 0.000000 | 0.000000 | 0.000000 | 137.142857  |         137.152641 |+-------------------+-----------+----------+----------+-------------+----------+----------+----------+-------------+--------------------+| SUMMED            | 47.879350 |          | 9.981644 |             | 0.000000 | 5.139200 | 0.000000 | 960.000000  |        1023.000194 |+-------------------+-----------+----------+----------+-------------+----------+----------+----------+-------------+--------------------+
复制代码

Cloud Custodian 简介

组织可以利用Custodian作为强大工具来有效管理云环境,其重点在于cost management


借助 Custodian,企业可以确保遵守安全策略、执行标签策略、对未使用的资源执行垃圾收集,并积极管理成本——所有这些都在一个统一而全面的解决方案中。通过将 Custodian 整合进云运维,组织能够优化资源利用率,消除不必要的费用,并更好的控制云成本,最终有助于提高财务效率并节省开支。


Kubernetes Provider (Alpha)是一个可选包,可以用来编写与 Kubernetes 相关资源交互的策略。

安装 Kubernetes Plugin

首先确保已经安装了基础Cloud Custodian应用。Cloud Custodian 是一个 Python 应用程序,必须运行在支持的版本上。


一旦基础版本安装完成,就可以使用以下选项之一安装 Kubernetes provider 程序包了:

选项 1: 将发布包安装到本地 Python 环境
pip install c7npip install c7n_kube
复制代码
选项 2: 从存储库安装最新版本
git clone https://github.com/cloud-custodian/cloud-custodian.gitpip install -e ./cloud-custodianpip install -e ./cloud-custodian/tools/c7n_kube
复制代码

连接到集群

Custodian Kubernetes provider 自动读取 Kubectl 配置或由环境变量KUBECONFIG设置的配置文件。有关更多信息,请参阅Kubernetes文档

编写第一份策略⚡️

策略是配置 Custodian 管理云资源的主要方式,是 YAML 格式文件,遵循预先定义的模式来描述希望 Custodian 执行的操作。


在下面的例子中,我们将编写一个过滤带有"custodian"标签的 pod 并将其删除的策略:


首先,创建一个我们想要用策略来管理的 pod 资源:


kubectl run nginx --image=nginx --labels=name=custodiankubectl get pod -o wide --show-labels NAME    READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES   LABELS nginx   1/1     Running   0          24s   10.0.1.224   worker   <none>           <none>    
复制代码


然后过滤带有“custodian”标签的 pod 并删除:


文件名: custodian.yml


policies:  - name: my-first-policy    description: |      Deletes pods with label name:custodian    resource: k8s.pod    filters:      - type: value        key: metadata.labels.name        value: custodian    actions:      - type: delete
复制代码


运行以下命令使用 Custodian 执行策略:


custodian run --output-dir=output custodian.yml --cache-period 0 -v
复制代码

➡️Cloudability 简介

Apptio Cloudability通过自动发现和映射与每个集群相关的云资源,提供全面的计费数据,简化了 Kubernetes 成本管理,其交互式工具使用户能够深入了解选定时间范围内的集群成本和资源消耗。


自动映射集群成本

Apptio Cloudability 可以自动发现支持每个 Kubernetes 集群的所有云资源,并将这些信息映射回详细的计费数据。同时为用户提供专门的交互工具,使他们能够在可定义的时间窗口内快速了解每个集群的全部成本和底层资源消耗。

合理分配开支

复杂的算法分析每个节点上的资源利用指标——CPU、内存、网络和磁盘——并评估 pod 级别的服务质量设置,以便这些集群成本可以基于 Kubernetes 命名空间和标签进行拆分和公平分配。

🌟结论🌟

为了使采用云的投资回报最大化,有效管理 Kubernetes 的成本至关重要。事实证明,传统的计算资源消耗和相关费用的方法往往不够。随着组织发展,可能会需要寻求通过战略性的利用资源来提高成本效率。💮




你好,我是俞凡,在 Motorola 做过研发,现在在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

发布于: 刚刚阅读数: 5
用户头像

俞凡

关注

公众号:DeepNoMind 2017-10-18 加入

俞凡,Mavenir Systems研发总监,关注高可用架构、高性能服务、5G、人工智能、区块链、DevOps、Agile等。公众号:DeepNoMind

评论

发布
暂无评论
Kubernetes成本优化_Kubernetes_俞凡_InfoQ写作社区