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,一经查实,立即删除!

相关文章

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

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

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方法添加一段时间间隔…

Android发展历程及安装

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

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

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

蓝桥杯备赛 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; &…

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 …

spring-boot-starter-validation常用注解

文章目录 一、使用二、常用注解三、Valid or Validated &#xff1f;四、分组校验1. 分组校验的基本概念2. 定义验证组3. 应用分组到模型4. 在控制器中使用分组5. 总结 一、使用 要使用这些注解&#xff0c;首先确保在你的 Spring Boot 应用的 pom.xml 文件中添加了 spring-bo…

探秘Dmail:Web3世界的通讯引领者

摘要&#xff1a;在一个充满潜力并且对创新要求严格的领域中&#xff0c;Dmail作为一种开创性的Web3通讯协议应运而生。 1月24日&#xff0c;OKX Jumpstart宣布上线Dmail&#xff0c;在Web3领域引起了巨大反响&#xff0c;这是一个旨在重新定义数字通讯范式的富有远见的项目&a…

[足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - 最优控制Optimal Control Ch07-1最优控制问题与性能指标 1. 最优控制问题与性能指标2. 动态规划 Dynamic Programming2.1 基本概念2.2 代码详解2.3 简单一维案例 3. 线性二次型调节器&#xff…

GIt同时存在传入和传出更改修改,无法合并

前言 Git是常用的版本管理工具&#xff0c;之前面试被问到过一次——Git有无遇到过使用错误情况&#xff1f;当时卡壳了没答上来&#xff0c;所以这次遇到&#xff0c;特此记录学习。 问题概述 前一天提交了代码&#xff0c;mt进行了修改。但我忘记拉取最新&#xff0c;就进…

深度解析单片机:历史、发展与您关心的问题

什么是单片机&#xff1f; 定义&#xff1a;单片机是一种集成了中央处理器&#xff08;CPU&#xff09;、内存和外设功能的微型计算机系统。与传统计算机相比&#xff0c;单片机通常集成在一个芯片上&#xff0c;用于控制特定的应用。#单片机# 特点&#xff1a; 封装紧凑&…

人工智能:更多有用的 Python 库

目录 前言 推荐 JupyterLab 入门 复杂的矩阵运算 其它人工智能和机器学习的 Python 库 前言 在这篇文章中&#xff0c;我们将了解更多的矩阵操作&#xff0c;同时再介绍几个人工智能 Python 库。 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#x…

再谈Android View绘制流程

一&#xff0c;先思考何时开始绘制 笔者在这里提醒读者&#xff0c;Android的View是UI的高级抽象&#xff0c;我们平时使用的XML文件也好&#xff0c;本质是设计模式中的一种策略模式&#xff0c;其View可以理解为一种底层UI显示的Request。各种VIew的排布&#xff0c;来自于开…

如何使用 dotnet pack 打包 .NET 跨平台程序集?

如何使用 dotnet pack 打包 .NET 跨平台程序集&#xff1f; dotnet pack 介绍官方描述 dotnet pack 命令说明使用示例打包 .net 类库项目生成带注释的 nuget 包构建特定平台的 nuget 包关于 .NET RID 目录 dotnet pack 介绍 dotnet pack 是一个 .NET Core NuGet 包打包程序。 …

Python 数据分析实战——为什么销售额减少?酒卷隆治_案例1

# 为什么黑猫游戏的销售额会减少&#xff1f; # 数据集 DAU : 每天至少来访问一次的用户数据 数据内容 数据类型 字段名 访问时间 string&#xff08;字符串&#xff09; log_data 应用名称 string&#xff08;字符串&#xff09; app_name 用户 ID int&#xff08;数值&…

【机组】基于FPGA的32位算术逻辑运算单元的设计(EP2C5扩充选配类)

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《机组 | 模块单元实验》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 一、实验目的 二、实验要求 …