目录
5) 部署prometheus-adapter (需要修改配置)
一、背景
在每天的不同时刻业务系统负载存在高峰,低谷和平缓的现场。为了保障业务的连续、稳定性以及高资源利用率。在业务高峰时能动态弹性出更多资源,在业务低谷时能缩减多余的资源。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 minikubeminikube 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提供弹性策略提供更多可能性。
参考文档:
https://github.com/kubernetes-sigs/metrics-serverhttps://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-adapterhttps://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/prometheushttps://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.https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus