您现在的位置是:首页 >技术杂谈 >【腾讯云 Finops Crane 集训营】基于 Kubernetes 实现云资源分析与成本优化平台网站首页技术杂谈

【腾讯云 Finops Crane 集训营】基于 Kubernetes 实现云资源分析与成本优化平台

愿许浪尽天涯 2024-06-17 10:31:55
简介【腾讯云 Finops Crane 集训营】基于 Kubernetes 实现云资源分析与成本优化平台


前言:

为推进云原生用户在确保业务稳定性的基础上做到真正的极致降本,腾讯云推出了国内第一个基于云原生技术的成本优化开源项目 Crane(Cloud Resource Analytics and Economics)。Crane 遵循 FinOps 标准,旨在为云原生用户提供云成本优化一站式解决方案。

一、基本介绍

Crane 是一个基于 FinOps 的云资源分析与成本优化平台。它的愿景是在保护客户应用运行质量的前提下实现极致的降本。

1.主要功能

在这里插入图片描述

1)成本可视化和优化评估

  • 提供一组 Exporter 计算集群云资源的计费和账单数据并存储到你的监控系统,比如 Prometheus。
  • 多维度的成本洞察,优化评估。通过 Cloud Provider 支持多云计费。

2)推荐框架

  • 提供了一个可扩展的推荐框架以支持多种云资源的分析,内置了多种推荐器:资源推荐,副本推荐,HPA 推荐,闲置资源推荐。

3)基于预测的水平弹性器

  • EffectiveHorizontalPodAutoscaler 支持预测驱动的弹性;
  • 基于社区的 HPA 做底层的弹性控制,支持更丰富的弹性触发策略(预测,观测,周期),让弹性更加高效,并保障了服务的质量。

4)负载感知的调度器

  • 动态调度器根据实际的节点利用率构建了一个简单但高效的模型,并过滤掉那些负载高的节点来平衡集群。

5)拓扑感知的调度器

  • Crane SchedulerCrane Agent 配合工作,支持更为精细化的资源拓扑感知调度和多种绑核策略,使得资源得到更合理高效的利用。

6)基于 QOS 的混部

  • QOS 相关能力保证了运行在 Kubernetes 上的 Pod 的稳定性。
  • 具有多维指标条件下的干扰检测和主动回避能力,支持精确操作和自定义指标接入;
  • 具有预测算法增强的弹性资源超卖能力,复用和限制集群内的空闲资源;
  • 具备增强的旁路 cpuset 管理能力,在绑核的同时提升资源利用效率。

2.整体架构

Crane 的整体架构如下:
在这里插入图片描述


Craned 是 Crane 的最核心组件,它管理了 CRDs 的生命周期以及 API。 Craned 通过 Deployment 方式部署且由两个容器组成:

  • Craned:运行了 Operators 用来管理 CRDs,向 Dashboard 提供了 WebAPI,Predictors 提供了 TimeSeries API;
  • Dashboard:基于 TDesign’s Starter 脚手架研发的前端项目,提供了易于上手的产品功能。

Fadvisor 提供一组 Exporter 计算集群云资源的计费和账单数据并存储到你的监控系统, 比如 Prometheus。

  • Fadvisor 通过 Cloud Provider 支持了多云计费的 API。

Metric Adapter 实现了一个 Custom Metric Apiserver

  • Metric Adapter 读取 CRDs 信息并提供基于 Custom/External Metric API 的 HPA Metric 的数据。

  • Crane Agent 通过 DaemonSet 部署在集群的节点上。

二、基于 Kubernetes 实现云资源分析与成本优化平台

1.准备工作


1)安装 Helm

[root@k8s-master01 ~]# wget https://get.helm.sh/helm-v3.7.2-linux-amd64.tar.gz
[root@k8s-master01 ~]# tar zxf helm-v3.7.2-linux-amd64.tar.gz
[root@k8s-master01 ~]# mv linux-amd64/helm /usr/local/bin
[root@k8s-master01 ~]# helm version
version.BuildInfo{Version:"v3.7.2", GitCommit:"663a896f4a815053445eec4153677ddc24a0a361", GitTreeState:"clean", GoVersion:"go1.16.10"}

2.安装 Prometheus/Grafana 软件包

1)安装 Prometheus

[root@k8s-master01 ~]# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
[root@k8s-master01 ~]# helm install prometheus -n crane-system --version 19.6.1 
--set pushgateway.enabled=false 
--set alertmanager.enabled=false 
--set server.persistentVolume.enabled=false 
-f https://raw.githubusercontent.com/gocrane/helm-charts/main/integration/prometheus/override_values.yaml 
--create-namespace  prometheus-community/prometheus

2)安装 Grafana

[root@k8s-master01 ~]# helm repo add grafana https://grafana.github.io/helm-charts
[root@k8s-master01 ~]# helm install grafana --version 6.11.0 
-f https://raw.githubusercontent.com/gocrane/helm-charts/main/integration/grafana/override_values.yaml 
-n crane-system 
--create-namespace grafana/grafana

3.安装 Crane 软件包

1)安装 Crane 和 Fadvisor

[root@k8s-master01 ~]# helm repo add crane https://gocrane.github.io/helm-charts
[root@k8s-master01 ~]# helm install crane -n crane-system --create-namespace crane/crane
[root@k8s-master01 ~]# helm install fadvisor -n crane-system --create-namespace crane/fadvisor

2)验证安装是否成功

[root@k8s-master01 ~]# kubectl get pod,deploy -n crane-system

在这里插入图片描述
3)修改 Craned 服务的 ConfigMap 配置,调整反向代理的地址

[root@k8s-master01 ~]# kubectl get service craned -n crane-system -o yaml > 1.yaml
[root@k8s-master01 ~]# sed -i 's/type: ClusterIP/type: NodePort/g' 1.yaml 
[root@k8s-master01 ~]# sed -i '/targetPort: 9090/a    nodePort: 30080' 1.yaml
[root@k8s-master01 ~]# kubectl apply -f 1.yaml
[root@k8s-master01 ~]# kubectl edit cm nginx-conf -n crane-system
:%s/craned.crane-system:8082/127.0.0.1:8082/g

[root@k8s-master01 ~]# kubectl get pod -n crane-system | awk '/^craned/{print $1}' | xargs kubectl delete pod -n crane-system
  • 因为 Dashboard 和 Craned 服务都在同一个 Pod 里,而 Dashboard 容器是通过 Service 加端口的方式代理到 Craned 服务上的;
  • 但是 Pod 并不能直接通过 Service 加 端口的方式访问到本身,所以我们这里通过 127.0.0.1(Lo)的方式进行代理。

在这里插入图片描述

4. 使用智能弹性 EffectiveHPA

Kubernetes HPA 支持了丰富的弹性扩展能力,Kubernetes 平台开发者部署服务实现自定义 Metric 的服务,Kubernetes 用户配置多项内置的资源指标或者自定义 Metric 指标实现自定义水平弹性。


EffectiveHorizontalPodAutoscaler(简称 EHPA)是 Crane 提供的弹性伸缩产品,它基于社区 HPA 做底层的弹性控制,支持更丰富的弹性触发策略(预测,观测,周期),让弹性更加高效,并保障了服务的质量。

  • 提前扩容,保证服务质量: 通过算法预测未来的流量洪峰提前扩容,避免扩容不及时导致的雪崩和服务稳定性故障。
  • 减少无效缩容: 通过预测未来可减少不必要的缩容,稳定工作负载的资源使用率,消除突刺误判。
  • 支持 Cron 配置: 支持 Cron-based 弹性配置,应对大促等异常流量洪峰。
  • 兼容社区: 使用社区 HPA 作为弹性控制的执行层,能力完全兼容社区。

1)安装 Metrics Server

[root@k8s-master01 ~]# wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.3/components.yaml
[root@k8s-master01 ~]# sed -i '/- args:/a        - --metric-resolution=15s' components.yaml
[root@k8s-master01 ~]# sed -i 's@image:.*@image: docker.io/gocrane/metrics-server:v0.6.3@g' components.yaml
[root@k8s-master01 ~]# kubectl apply -f components.yaml

2)创建测试应用

[root@k8s-master01 ~]# kubectl apply -f https://raw.githubusercontent.com/gocrane/crane/main/examples/autoscaling/php-apache.yaml
[root@k8s-master01 ~]# kubectl apply -f https://raw.githubusercontent.com/gocrane/crane/main/examples/analytics/nginx-deployment.yaml

3)创建 EffectiveHPA

[root@k8s-master01 ~]# kubectl apply -f https://raw.githubusercontent.com/gocrane/crane/main/examples/autoscaling/effective-hpa.yaml

在这里插入图片描述
4)增加负载,查看应用是否能够正常扩容

[root@k8s-master01 ~]# kubectl run -i --tty load-generator --rm --image=busybox:1.28.4 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"

在这里插入图片描述
在这里插入图片描述

  • 可以看到随着请求增多,CPU 利用率会不断提升,通过 EffectiveHPA 会自动扩容实例。

4.配置集群

访问:http://192.168.1.1:30080

在这里插入图片描述

三、功能验证

1.成本展示

Crane Dashboard 提供了各式各样的图表展示了集群的成本和资源用量。
在这里插入图片描述
在这里插入图片描述

2.资源推荐


Kubernetes 用户在创建应用资源时常常是基于经验值来设置 requestlimit,通过资源推荐的算法分析应用的真实用量推荐更合适的资源配置,你可以参考并采纳它提升集群的资源利用率。该推荐算法模型采用了 VPA 的滑动窗口(Moving Window)算法进行推荐:

  • 通过监控数据,获取 Workload 过去一周(可配置)的 CPU 和内存的历史用量。
  • 算法考虑数据的时效性,较新的数据采样点会拥有更高的权重。
  • CPU 推荐值基于用户设置的目标百分位值计算,内存推荐值基于历史数据的最大值。

1)使用资源推荐
在这里插入图片描述
在这里插入图片描述

3.副本数推荐

Kubernetes 用户在创建应用资源时常常是基于经验值来设置副本数。通过副本数推荐的算法分析应用的真实用量推荐更合适的副本配置,同样可以参考并采纳它提升集群的资源利用率。

其实现的基本算法是基于工作负载历史 CPU 负载,找到过去七天内每小时负载最低的 CPU 用量,计算按 50%(可配置)利用率和工作负载 CPU Request 应配置的副本数。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、总结

整体操作体验下来,安装相对比较简单,通过使用 Helm 工具实现便捷安装。安装完成后,便可以通过提供的 Dashboard 面板来进行访问。界面简单明了,易上手,同时在功能层面上实现了实时监控成本、应用资源使用量、资源推荐、智能弹性等功能。

  • 实时监控成本:Crane 提供每小时、每天、每周和每月的费用概览,并且可以按集群、命名空间和工作负载分解成本。
  • 资源监控:通过调用 Prometheus 和 Grafana 实现资源监控以及可视化 UI。
  • 资源推荐:使用 VPA 算法模型,先分析出应用的真实用量,再通过计算得出应用的最佳资源配置。
  • 智能弹性:基于社区 HPA 做底层的弹性控制,支持更加丰富的弹性触发策略,让弹性更加高效,并保证服务的质量。

因此,我们可以通过 Crane 服务提供的成本计算、资源使用率,以及上述功能,来观察是否需要对云服务器进行资源扩容或减配。避免出现资源不足或资源浪费的情况,达到真正意义上的降本增效。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。