云原生可以帮助团队更精细化利用资源,但如果缺乏工具的帮助,很难采取适当的措施优化资源的使用。本文介绍了若干用于可视化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。
实操👷
要进行以下练习,应该在本地安装kubectl
和kind
。
-
kubernetes命令行工具: kubectl -
docker -
kubernetes集群
有了所需工具,让我们开始吧!
➡️安装cert-manager
用如下命令安装最新版本的cert-manager。
用如下命令检查cert-manager部署是否正确,验证所有pod都正确运行。
安装kube-green㊙
用默认的静态安装安装kube-green,或者查看其他安装方法[1]。
用如下命令安装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: 带有标签的字符串对象,用来标识资源。 文档 [2]中有更多示例。
-
示例 🏗
apiVersion: kube-green.com/v1alpha1
kind: SleepInfo
metadata:
name: working-hours
spec:
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,但也有其他安装选项[3]。
-
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应用[4]。Cloud Custodian是一个Python应用程序,必须运行在支持的版本[5]上。
一旦基础版本安装完成,就可以使用以下选项之一安装Kubernetes provider 程序包了:
选项1: 将发布包安装到本地Python环境
pip install c7n
pip install c7n_kube
选项2: 从存储库安装最新版本
git clone https://github.com/cloud-custodian/cloud-custodian.git
pip install -e ./cloud-custodian
pip 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=custodian
kubectl 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",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!
Install kube-green: https://kube-green.dev/docs/install
[2]kube-green exclude-reference: https://kube-green.dev/docs/configuration/#exclude-reference
[3]Kubecost Install: https://docs.kubecost.com/install
[4]Install Cloud Custodian: https://cloudcustodian.io/docs/quickstart/index.html#install-cc
[5]Status of Python branches: https://devguide.python.org/#status-of-python-branches
本文由 mdnice 多平台发布