本文共 3620 字,大约阅读时间需要 12 分钟。
[TOC]
我的kubernetes环境:
Horizontal Pod Autoscaler(HPA,Pod水平自动伸缩),根据资源利用率或者自定义指标自动调整replication controller、deployment 或 replica set,实现部署的自动扩展和缩减,让部署的规模接近于实际服务的负载。HPA不适于无法缩放的对象,例如DaemonSet。
Kubernetes从1.8版本开始,CPU、内存等资源的metrics信息可以通过 Metrics API来获取,用户可以直接获取这些metrics信息(例如通过执行kubect top
命令),HPA使用这些metics信息来实现动态伸缩。本文介绍Kubernetes集群基于metric server的HPA。在开始之前我们需要了解一下Metrics API和Metrics Server。
Metrics API:
/apis/metrics.k8s.io/
Metrics server:
kube-up.sh
脚本以deployment的方式进行部署,也可以通过yaml文件的方式进行部署 由于官方已经弃用,现作为其替代方案。
当前最新版本为v0.3.1。部署yaml文件链接:
在metrics-server-deployment.yaml
中,
containers: - name: metrics-server args: - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP - --kubelet-insecure-tls image: ygqygq2/metrics-server:v0.3.1
部署成功后,达到如下结果,则为正常:
[root@lab1 1.8+]# kubectl top nodesNAME CPU(cores) CPU% MEMORY(bytes) MEMORY% lab1 777m 2% 16064Mi 50% lab2 526m 1% 12577Mi 79% lab3 569m 1% 8819Mi 27% lab4 56m 5% 4151Mi 53% lab5 353m 2% 8287Mi 53% lab6 55m 5% 4021Mi 52% [root@lab1 1.8+]# kubectl top podsNAME CPU(cores) MEMORY(bytes) gohttpserver-849d47c88f-pqf7f 0m 4Mi nginx-cephfs-7777495b9b-5sfvv 0m 1Mi nginx-cephfs-dy1-7777495b9b-6jvph 0m 1Mi nginx-cephfs-dy2-86bdbfd977-g278z 0m 1Mi
kubectl run nginxtest --image=nginx:latest --requests=cpu=1m --expose --port=80nginxtest_ip=$(kubectl get svc nginxtest -o=jsonpath="{.spec.clusterIP}") # 获取svc IP,用于测试kubectl autoscale deployment nginxtest --cpu-percent=10 --min=1 --max=10
我们来创建一个busybox,并且循环访问上面创建的服务。
kubectl run load-generator --image=busyboxbusybox_pod=$(kubectl get pod |grep load-generator|awk '{print $1}')kubectl exec -it ${busybox_pod} -- /bin/sh -c "while true; do curl -s $nginxtest_ip; done" & # 后台跑,负载不够可多条同时执行
查看hpa状态,同时我们查看相关资源nginxtest的副本数量,副本数量在变化。CPU资源利用率也在变化,最后趋于平稳。
$ kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGEnginxtest Deployment/nginxtest 100%/10% 1 10 4 24m$ kubectl get deployment nginxtestNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEnginxtest 4 4 4 4 27m
我们关掉刚才的busbox并等待一段时间。可以看到副本数量变回为1。
$ kubectl get deployment nginxtestNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEnginxtest 1 1 1 1 36m$ kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGEnginxtest Deployment/nginxtest 0%/10% 1 10 1 33m
HPA能对服务的容器数量做自动伸缩,对于服务的稳定性是一个很好的提升,但在生产中应用较少,原因是因为不太容易衡量业务负载是否正常,影响服务稳定性的因素非常多。
参考资料:
[1] [2]转载于:https://blog.51cto.com/ygqygq2/2295972