Kubernetes成本优化

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

概述

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

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

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

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

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

alt

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

  • kubernetes命令行工具: kubectl
  • docker
  • kubernetes集群

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

➡️安装cert-manager

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

alt

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

alt
安装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成本管理,其交互式工具使用户能够深入了解选定时间范围内的集群成本和资源消耗。

alt
自动映射集群成本

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

合理分配开支

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

🌟结论🌟

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


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

参考资料
[1]

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 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/650334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新概念英语第二册(42)上

【New words and expressions】生词和短语&#xff08;13&#xff09; musical adj. 精通音乐的 market n. 市场&#xff0c;集市 snake charmer 玩蛇者&#xff08;通常借音乐控制&#xff09; pipe …

《WebKit 技术内幕》学习之十五(5):Web前端的未来

5 Crosswalk项目 Crosswalk项目是由英特尔公司发起的一个开源项目&#xff0c;该项目基于WebKit&#xff08;Blink&#xff09;和Chromium等开源项目打造&#xff0c;其目的是提供一个跨不同操作系统的Web运行环境&#xff0c;包括Android、Tizen、Linux、Windows、MacOS等众多…

c语言-文件的读写操作(上)

文章目录 前言一、文件基础1.1 文件的分类1.2 文件路径和文件名 二、文件的打开和关闭2.1 文件指针2.2 文件的打开和关闭 三、文件顺序读写3.1 fputc()和fgetc()3.2 fputs()和fgets()3.3 fprintf()和fscanf()3.4 fwrite()和fread()3.4 对比一组函数 总结 前言 本篇文章介绍c语…

python使用PaddleOCR实现《命名实体识别项目》OCR(已实现)(ai领域必看,简单易用)

1.简介&#xff1a; PaddleOCR是飞桨&#xff08;PaddlePaddle&#xff09;推出的一个端到端的光学字符识别开源工具集&#xff0c;支持中文、英文、数字以及特殊符号等各种类型的文字检测、识别和词语整体识别。该工具集使用PaddlePaddle深度学习框架技术&#xff0c;提供了多…

Likeshop多商户商城源码系统,支持二开

在电商行业高速发展的当下&#xff0c;拥有一套功能强大、易于操作的开源商城系统至关重要。Likeshop多商户商城系统正是这样一款集H5、小程序、独立APP于一体的开源电商解决方案&#xff0c;助力商家实现智能营销。 一、产品简介 Likeshop多商户商城系统为商家提供了丰富的营…

Spring Boot 中 Service 层依赖注入问题

目录 问题描述 产生错误 问题原因 解决方法 手动注入方法 1、使用工具集 hutool&#xff0c;引入 Maven 依赖 2、编写 SpringUtil 工具类 问题描述 Controller 层方法为 static 静态&#xff0c;引入 Service 层时使用 Autowired 注解自动装配&#xff0c;Controller层方…

C#用 DateAndTime.DateAdd方法和DateTime.Add(TimeSpan) 方法分别添加一段时间间隔

目录 一、基本方法 1.用 DateAndTime.DateAdd方法添加一段时间间隔 2.用DateTime.Add方法添加一段时间间隔 二、实例 1.实例1&#xff1a;用 DateAndTime.DateAdd方法 2.实例2&#xff1a;用DateTime.Add方法 一、基本方法 1.用 DateAndTime.DateAdd方法添加一段时间间隔…

CentOS7 安装Nginx,网站部署、请求转发

文章目录 前言1. 安装2. 启动3. 开机启动4. 检查Nginx服务的状态5. 简单部署项目6. 检查Nginx配置7. 重新加载Nginx配置启动错误错误分析端口权限解决方法完整部署项目nginx.conf 配置文件证书配置、请求转发前言 Nginx是一款高性能的Web服务器和反向代理服务器,被广泛用于构…

Android发展历程及安装

目录 发展历程 下载网址 安装过程 发展历程 安卓基于Linux内核&#xff0c;Linux内核相当于房屋的地基 开源不等于免费&#xff0c;不能商用 安卓一般每半年小更新&#xff0c;一年大更新 对应API相当于别名 现在安卓安全性越来越高&#xff0c;性能越来越快&#xff0c…

2024年预制菜行业市场发展趋势分析(2021-2023年预制菜行业数据分析)

近期&#xff0c;老干妈被称为预制菜、预制菜国标报送稿出炉等事件再次引起大众对于预制菜市场的讨论。随着国家对预制菜审核标准的严格化&#xff0c;预制菜市场未来走向将会如何&#xff1f;鲸参谋带大家从数据角度来了解。 首先来看下预制菜市场的行业发展情况。 根据鲸参…

浅聊ansible的幂等 file模块源码解析

描述# 幂等性是在实际应用中经常需要考虑的概念&#xff0c;尤其是运维中。相较于将幂等性理解为各种异常情况的综合处理&#xff0c;将其理解为执行时需要考虑到在前次执行产生的影响的情况下能够正常执行则会更加容易接近业务需求。   ansible包含众多的模块&#xff0c;大…

第3章:Python 的函数和模块(基于最新版 Python3.12 编写)

文章目录 3.1 函数&#xff1a;编写你的代码乐曲3.1.1 什么是函数&#xff1f;3.1.2 如何定义函数&#xff1f;3.1.3 如何调用函数&#xff1f;3.1.4 函数的返回值3.1.5 函数的文档字符串3.1.6 默认参数值3.1.7 可变数量的参数3.1.8 局部变量和全局变量3.1.9 递归函数 3.2 模块…

蓝桥杯备赛 week 4 —— DP 背包问题

目录 &#x1f308;前言&#x1f308;&#xff1a; &#x1f4c1; 01背包问题 分析&#xff1a; dp数组求解&#xff1a; 优化&#xff1a;滚动数组&#xff1a; &#x1f4c1; 完全背包问题 &#x1f4c1; 总结 &#x1f308;前言&#x1f308;&#xff1a; 这篇文章主…

大数据就业方向-(工作)ETL开发

上一篇文章&#xff1a; 大数据 - 大数据入门第一篇 | 关于大数据你了解多少&#xff1f;-CSDN博客 目录 &#x1f436;1.ETL概念 &#x1f436;2. ETL的用处 &#x1f436;3.ETL实现方式 &#x1f436;4. ETL体系结构 &#x1f436;5. 什么是ETL技术&#xff1f; &…

每日OJ题_算法_二分查找⑧_力扣LCR 173. 点名

目录 力扣LCR 173. 点名 解析代码 力扣LCR 173. 点名 LCR 173. 点名 - 力扣&#xff08;LeetCode&#xff09; 难度 简单 某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席&#xff0c;请返回他的学号。 示例 1: 输入: records …

力扣0087——扰乱字符串

扰乱字符串 难度&#xff1a;困难 题目描述 使用下面描述的算法可以扰乱字符串 s 得到字符串 t &#xff1a; 如果字符串的长度为 1 &#xff0c;算法停止如果字符串的长度 > 1 &#xff0c;执行下述步骤&#xff1a; 在一个随机下标处将字符串分割成两个非空的子字符串…

c# cad PromptSelectionResult批量选择 PromptEntityOptions选择单个实体介绍

一、PromptSelectionResult &#xff1a; 是 AutoCAD .NET API 中的一个类&#xff0c;位于 Autodesk.AutoCAD.EditorInput 命名空间下。它代表了用户在 AutoCAD 编辑器中进行图形对象选择操作的结果。 当你通过 Editor 类的 GetSelection() 方法&#xff08;或者其他类似的方…

MySQL JSON数据类型全解析(JSON datatype and functions)

JSON&#xff08;JavaScript Object Notation&#xff09;是一种常见的信息交换格式&#xff0c;其简单易读且非常适合程序处理。MySQL从5.7版本开始支持JSON数据类型&#xff0c;本文对MySQL中JSON数据类型的使用进行一个总结。 目录 一、MySQL中的JSON 1.1 JSON数据格式 1.2 …

11. 发送邮件

1. 简介 Spring Boot 收发邮件最简便方式是通过 spring-boot-starter-mail。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency>spring-boot-starter-mail 本质…

hive - explode 用法以及练习

hive explode 的用法以及练习 一行变多行 explode 例如&#xff1a; 临时表 temp_table &#xff0c;列名为1st 1st1,2,34,5,6 变为 1 2 3 4 5 6 方式一&#xff1a;直接使用 explode select explode(split(1st,,)) from temp_table;方式二&#xff1a;使用 lateral view…