Kubernetes HPA 自定义指标弹性伸缩-设计思路

目录

一、背景

二、设计思路

        2.1 整体架构思路

        2.2 环境准备

             1) Kubernetes构建(minikube)

             2) metrics-server 部署

             3) 部署Demo​​​​​​​​​​​​​​

             4) 部署prometheus

             5) 部署prometheus-adapter​​​​​​​​​​​​​​ (需要修改配置)

        2.3 测试验证

三、改进空间

四、小结

参考文档:


一、背景

        在每天的不同时刻业务系统负载存在高峰,低谷和平缓的现场。为了保障业务的连续、稳定性以及高资源利用率。在业务高峰时能动态弹性出更多资源,在业务低谷时能缩减多余的资源。Kubernetes的HPA策略再结合云厂商的容器服务就能很好的实现这样的需求。    

        Kubernetes HPA默认只支持的弹性指标是CPU和内存的。这在一定程度上需求也满足了部分弹性需求。而在实际的业务需求中可能需要支持更多维度的弹性指标。例如:消息队列积压数,网络请求连接数等。此时需要一个弹性方案能满足任意维度自定义指标触发Kubernetes HPA弹性伸缩。


二、设计思路

 2.1 整体架构思路

        我们利用Kubernetes API Aggregator的特性,支持将第三方的服务注册到Kubernetes API。这样就能实现直接通过Kubernetes API访问到外部服务。外部服务作为数据源,那就有了更好的灵活性和扩展性了。具体落地时我们使用的是prometheus作为监控数据源,prometheus-adapeter作为扩展服务注册到Kubernetes API。整体逻辑架构图如下:

 2.2 环境准备

基础环境: Kubernetes

基础组件:  metrics-server / prometheus / prometheus-adapter

验证demo:  demo-hpa(测试demo)

1) Kubernetes构建(minikube)

如果已经有Kubernetes环境了可跳过此步骤。

brew install kubectl 
brew install minikube

minikube start --image-mirror-country='cn' \

--vm-driver hyperkit 

## 一些常用命令

​​​​​​​minikube start --image-mirror-country='cn'

minikube status

minikube stop

minikube start

minikube delete

启动可视化页面

minikube dashboard --port 8001 

​​​​​

注意:

如何启动失败 可以看看是不是端口占用了

### 查看是否端口占用

lsof -i :8001
### 删除占用进程

kill -9 14651

2) metrics-server 部署

如果已经有metrics-server ​​​​​​​环境了可跳过此步骤。

验证是否存在

kubectl get po -n kube-system | grep "metrics-server"

kubectl top po -A

kubectl get apiservice

部署 

### 直接远端下载安装

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

或者下载到本地再安装 (修改镜像地址或者亲和性等等)

kubectl apply -f components.yaml

如果启动报错则 添加--kubelet-insecure-tls 跳过验证

注意事项:

如果启动报错 则需要添加跳过验证参数 

kubectl edit deployment -n kube-system metrics-server

追加上跳过验证参数

--kubelet-insecure-tls

3) 部署Demo​​​​​​​​​​​​​​

## 源码包已经上传

helm upgrade --instsall demo demo

确保prometheus能获取到数据

4) 部署prometheus

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

### 安装prometheus

helm upgrade --install prometheus prometheus-community/prometheus  -n kube-system

或者使用文章开头提供的helm包

helm install prometheus prometheus -n kube-system

如果使用的是minikube的话 需要暴露一下服务

minikube service prometheus-server-n kube-system --url

正常情况下 访问Prometheus页面能查询到监控指标数据

5) 部署prometheus-adapter​​​​​​​​​​​​​​ (需要修改配置)

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm upgrade --install prometheus-adapter  prometheus-community/prometheus-adapter -n kube-system

或者使用文章开头提供的helm包

helm install prometheus-adapter prometheus-adapter -n kube-system

配置相关 :

连接prometheus

或者deployment.yaml

配置HPA自定义指标:
限于篇幅 等后续补充自定义指标配置的细节说明,也可以参考github prometheus-adapter仓库里面的说明。(文章开头helm包 里面已经配置好了)

2.3 测试验证

验证HPA指标是否存在

验证自定义HPA指标是否生效

## 查看目标指标是否已经可以通过apiservice查询到了

kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/" | jq .

kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/nginx_vts_test_second" | jq .

再观察HPA指标数据可以看到已经能正常获取到数据了

### 循环脚本访问 触发指标上涨

while true; do curl -I http://demo:80; sleep 1; done

三、改进空间

        prometheus-adapter 扩展自定义指标配置中心化问题。后续可以采用KEDA事件驱动组件来替代prometheus-adapter。和ingress配置类似,为不同的业务创建自定义的HPA资源对象。

        HPA 配置behive 可以更加平稳和扩和缩

        max和min的需要严格监控。因为在云环境在指标异常时,可能会弹性出过量的资源造成大量浪费。

四、小结

        利用Kubernetes API Aggregator的特性,使用prometheus-adapter和prometheus 实现任意扩展监控指标作为HPA的弹性指标。为Kubernetes提供弹性策略提供更多可能性。

参考文档:

Pod 水平自动扩缩 | Kubernetes在 Kubernetes 中,HorizontalPodAutoscaler 自动更新工作负载资源 (例如 Deployment 或者 StatefulSet), 目的是自动扩缩工作负载以满足需求。水平扩缩意味着对增加的负载的响应是部署更多的 Pod。 这与“垂直(Vertical)”扩缩不同,对于 Kubernetes, 垂直扩缩意味着将更多资源(例如:内存或 CPU)分配给已经为工作负载运行的 Pod。如果负载减少,并且 Pod 的数量高于配置的最小值, HorizontalPodAutoscaler 会指示工作负载资源(Deployment、StatefulSet 或其他类似资源)缩减。水平 Pod 自动扩缩不适用于无法扩缩的对象(例如:DaemonSet。)HorizontalPodAutoscaler 被实现为 Kubernetes API 资源和控制器。资源决定了控制器的行为。 在 Kubernetes 控制平面内运行的水平 Pod 自动扩缩控制器会定期调整其目标(例如:Deployment)的所需规模,以匹配观察到的指标, 例如,平均 CPU 利用率、平均内存利用率或你指定的任何其他自定义指标。使用水平 Pod 自动扩缩演练示例。HorizontalPodAutoscaler 是如何工作的? graph BT hpa[Pod 水平自动扩缩] --> scale[规模] subgraph rc[RC / Deployment] scale end scale -.-> pod1[Pod 1] scale -.-> pod2[Pod 2] scale -.-> pod3[Pod N] classDef hpa fill:#D5A6BD,stroke:#1E1E1D,stroke-width:1px,color:#1E1E1D; classDef rc fill:#F9CB9C,stroke:#1E1E1D,stroke-width:1px,color:#1E1E1D; classDef scale fill:#B6D7A8,stroke:#1E1E1D,stroke-width:1px,color:#1E1E1D; classDef pod fill:#9FC5E8,stroke:#1E1E1D,stroke-width:1px,color:#1E1E1D; class hpa hpa; class rc rc; class scale scale; class pod1,pod2,pod3 pod 必须启用 JavaScript 才能查看此页内容 图 1.icon-default.png?t=N7T8https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/

大数据-查询引擎(trino)-云原生化设计思路-CSDN博客文章浏览阅读303次,点赞9次,收藏6次。大数据场景里面,针对Trino/Presto的云原生化方案的设计思路。利用容器化技术,解决解决了查询引擎扩展性不足的问题。https://blog.csdn.net/weixin_39403185/article/details/141606678?spm=1001.2014.3001.5501

https://github.com/kubernetes-sigs/metrics-servericon-default.png?t=N7T8https://github.com/kubernetes-sigs/metrics-server

GitHub - kubernetes-sigs/prometheus-adapter: An implementation of the custom.metrics.k8s.io API using PrometheusAn implementation of the custom.metrics.k8s.io API using Prometheus - kubernetes-sigs/prometheus-adaptericon-default.png?t=N7T8https://github.com/kubernetes-sigs/prometheus-adapterGitHub - prometheus/prometheus: The Prometheus monitoring system and time series database.The Prometheus monitoring system and time series database. - prometheus/prometheusicon-default.png?t=N7T8https://github.com/prometheus/prometheushelm-charts/charts/prometheus at main · prometheus-community/helm-charts · GitHubPrometheus community Helm charts. Contribute to prometheus-community/helm-charts development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值