Kubernetes成本优化

news2024/11/24 12:55:55

云原生可以帮助团队更精细化利用资源,但如果缺乏工具的帮助,很难采取适当的措施优化资源的使用。本文介绍了若干用于可视化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.coloradmin.cn/o/1415647.html

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

相关文章

【计算机二级考试C语言】C强制类型转换

C 强制类型转换 强制类型转换是把变量从一种类型转换为另一种数据类型。例如&#xff0c;如果您想存储一个 long 类型的值到一个简单的整型中&#xff0c;您需要把 long 类型强制转换为 int 类型。您可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型&#x…

【NodeJS】004- NodeJS的模块化与包管理工具

模块化 1. 介绍 1.1.什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 ,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用 1.2 什么是模块化项目 ? 编码时是按照模…

openssl3.2 - 测试程序的学习 - test\aesgcmtest.c

文章目录 openssl3.2 - 测试程序的学习 - test\aesgcmtest.c概述笔记能学到的流程性内容END openssl3.2 - 测试程序的学习 - test\aesgcmtest.c 概述 openssl3.2 - 测试程序的学习 aesgcmtest.c 工程搭建时, 发现没有提供 test_get_options(), cleanup_tests(), 需要自己补上…

公考之判断推理(一、图形推理)

一、前言 判断推理这一题型主要具体分为四种题型&#xff1a; 1.图形推理 2.类比推理 3.定义判断 4.逻辑判断每种题型做题方法又不一样。 才本文采用总分的形式结构。 每一小标题的下面紧接着就是总结。二、图形推理常见的命题形式 图形推理常见的命题形式&#xff1a; 1.…

路飞项目--04

分析后端接口 # 用户板块--原型图--分析需要写哪些接口 多方式登录接口 短信登录接口 发送短信接口 短信注册接口 校验手机号是否注册接口 手机号是否存在接口 思路&#xff1a; 1 用了全局异常捕获&#xff0c;直接抛出异常报错 2 路由用了自定义路由&…

剑指offer——删除链表的节点

题目描述&#xff1a;给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。返回删除后的链表的头节点。 数据范围&#xff1a; 0 <链表节点值 < 10000 0 <链表长度 < 10000 示例1&#xff1a; 输入&#xff1a;{2,5,1,9}&#xff…

NIO-Selector详解

NIO-Selector详解 Selector概述 Selector选择器&#xff0c;也可以称为多路复⽤器。它是Java NIO的核⼼组件之⼀&#xff0c;⽤于检查⼀个或多个Channel的状态是否处于可读、可写、可连接、可接收等。通过⼀个Selector选择器管理多个Channel&#xff0c;可以实现⼀个线程管理…

STM32标准库——(5)EXTI外部中断

1.中断系统 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行 中断优先级&#xff…

Ribbon 体系架构解析

前面已经介绍了服务治理相关组件&#xff0c;接下来趁热打铁&#xff0c;快速通关Ribbon&#xff01;前面我们了解了负载均衡的含义&#xff0c;以及客户端和服务端负载均衡模型&#xff0c;接下来我们就来看下SpringCloud 下的客户端负载均衡组件Ribbon 的特点以及工作模型。 …

day04 两两交换链表中的节点、删除链表倒数第N个节点、链表相交、环形链表II

题目链接&#xff1a;leetcode24-两两交换链表中的节点, leetcode19-删除链表倒数第N个节点, leetcode160-链表相交, leetcode142-环形链表II 两两交换链表中的节点 基础题没有什么技巧 解题思路见代码注释 时间复杂度: O(n) 空间复杂度: O(1) Go func swapPairs(head *Li…

Android Handler完全解读

一&#xff0c;概述 Handler在Android中比较基础&#xff0c;本文笔者将对此机制做一个完全解读。读者可简单参考上述类图与时序图&#xff0c;便于后续理解。 二&#xff0c;源码解读 1&#xff0c;主线程伊始 众所周知&#xff0c;通过Zygote的fork方式&#xff0c;新创建…

腾讯云轻量应用Ubuntu服务器如何一键部署幻兽帕鲁Palworld私服?

幻兽帕鲁/Palworld是一款2024年Pocketpair开发的开放世界生存制作游戏&#xff0c;在帕鲁的世界&#xff0c;玩家可以选择与神奇的生物“帕鲁”一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。而帕鲁可以进行战斗、繁殖、协助玩家做农活&#xff0c;也…

网页转文件下载工具

为了更快捷copy博客 做了个 网页转文件下载工具 1.0.1 更新如下&#xff1a; javaphpjava提供页面转换文件的微服务APIphp调用接口&#xff0c;输出文件下载支持网页转md 1.0.2 更新如下&#xff1a; 样式表切换&#xff0c;白天or黑夜&#xff0c;cookie七天保质期 未…

全国首条智慧高速开通,“车牌付” 会取代传统 ETC 收费吗?

2024年1月19日&#xff0c;全国首条智慧高速--杭绍甬高速杭绍段正式建成通车&#xff01;项目全长约52.8公里&#xff0c;设计速度120公里/小时&#xff0c;是长三角智慧交通示范项目。 01 杭绍甬 “慧眼”感知系统 全国首条智慧高速公路--杭绍甬高速在视频AI算法、IoT物联网、…

SpringBoot系列之MybatisPlus实现分组查询

SpringBoot系列之MybatisPlus实现分组查询 我之前博主曾记写过一篇介绍SpringBoot2.0项目怎么集成MybatisPlus的教程&#xff0c;不过之前的博客只是介绍了怎么集成&#xff0c;并没有做详细的描述各种业务场景&#xff0c;本篇博客是对之前博客的补充&#xff0c;介绍在mybat…

mac裁剪图片

今天第一次用mac裁剪图片&#xff0c;记录一下过程&#xff0c;差点我还以为我要下载photoshop了&#xff0c; 首先准备好图片 裁剪的目的是把图片的标题给去掉&#xff0c;但是不能降低分辨率&#xff0c;否则直接截图就可以了 解决办法 打开原始图片(不要使用预览&#xf…

【机器学习笔记】0 基础知识之python基础

注&#xff1a;本文内容仅为个人学习笔记&#xff0c;教程为黄海广老师主讲的机器学习入门系列&#xff0c; 课程链接&#xff08;中国大学慕课&#xff0c;有习题和证书&#xff09; 课程资源&#xff08;pdf版本课件和代码&#xff09;公布在Github链接 课程视频也可以在b站观…

python10-Python的字符串之拼接字符串

如果直接将两个字符串紧挨着写在一起&#xff0c;Python就会自动拼接它们&#xff0c;例如如下代码。 s1 "软件测试划水老师傅&#xff0c;"软件测试老痞print(s1) 上面代码将会输出: 软件测试划水老师傅&#xff0c;软件测试老痞 上面这种写法只是书写字符串的一…

数学知识第三期 欧拉函数

前言 相信大家在高中的时候接触过欧拉函数&#xff0c;希望大家通过本篇文章能够进一步理解欧拉函数&#xff01;&#xff01;&#xff01; 一、什么是欧拉函数&#xff1f; 欧拉函数是一个在数论中用于描述特定正整数的互质数的概念。具体来说&#xff0c;对于一个正整数n&…

初识人工智能,一文读懂机器学习之逻辑回归知识文集(7)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…