简介
Custom HPA 是Kubernetes中Pod水平自动伸缩的一种,不同于标准的HPA基于Pod的CPU使用率和内存使用量来控制工作负载中的副本数量,Custom HPA支持以自定义监控指标来实现对工作负载中副本数的控制
目前社区提供了基于Prometheus的Costom HPA方案,方案中包含以下组件:
- Prometheus:云原生监控告警系统,用于周期性采集Pod中的自定义监控数据
- Prometheus Adapter: Prometheus适配器,用于将接收到custom metric api 请求转换成 promethus请求,并将prometheus 返回的数据转换成 custom metric api 定义的标准数据格式
- Metrics aggreagtor:Kubernetes API 汇聚层中的一部分,用于将外部监控服务集成到 kube-apiserver中
- Horizontal Pod AutoScaler: Pod水平自动伸缩功能的核心服务,周期性获取HPA实例中定义的监控指标数据,对比定义中的期望值,动态调整工作负载中的副本数量
基于Promethus的Custom HPA 部署实践
安装Helm V2
在Kubernetes集群内任意节点上执行如下命令,安装helm client
1 | # 下载Helm二进制文件 |
安装Helm 服务端组件Tiller
1 | # 创建 ServiceAccount |
helm 官方源 https://kubernetes-charts.storage.googleapis.com ,国内的某些机器无法访问,需要配置镜像源
1 | # Azure 镜像 |
开启Kubernetes API聚合层
在集群master节点修改 kube-apiserver.yaml 配置如下启动项
注意:K8S集群默认现已开启 Kubernetes API 聚合层,用户无需手动配置
1 | # vi /etc/kubernetes/manifests/kube-apiserver.yaml |
部署Prometheus
1 | # 创建命名空间 |
部署Prometheus Adapter
1 | $ helm install stable/prometheus-adapter --values adapter-values.yaml --name prometheus-adapter --namespace monitoring |
备注:启动时,–v=6 可以打印出adapter请求prometheus的query信息
验证Prometheus Adapter服务是否可用
1 | $ kubectl get apiservice | grep prometheus-adapter |
自定义HPA功能验证
部署测试服务
1 | apiVersion: apps/v1 |
查询测试服务提供的自定义监控数据
1 | export DEMO_SVC_IP=$(kubectl get svc hpa-prom-demo -o jsonpath='{.spec.clusterIP}') |
创建HPA
1 | apiVersion: autoscaling/v2beta1 |
设置Prometheus Adapter查询规则
修改 prometheus adapter configmap 定义自定义指标查询规则,根据自定义监控指标需要配置指定查询规则,建议去掉冗余的查询规则
1 | $ kubectl edit cm prometheus-adapter -n monitoring |
配置参数使用说明
配置范例
查询自定义监控指标项,验证配置的查询规则是否生效
1 | kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/" | jq . |
查询自定义监控指标数据
1 | kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/nginx_vts_server_requests_per_second" | jq . |
对测试服务进行模拟压力测试
1 | export SERVICE_CLUSTER_IP=$(kubectl get svc hpa-prom-demo -o jsonpath='{.spec.clusterIP}') |
参数说明:
- -z : 压测持续时间
- -q : 单worker每秒请求数量(QPS)
- -c : worker数量
查看测试服务deploy的副本数
1 | $ kubectl get deploy hpa-prom-demo -w |
查看HPA事件信息
1 | $ kubectl get hpa nginx-custom-hpa |