[TOC]node
个人kubernetes环境:nginx
Horizontal Pod Autoscaler(HPA,Pod水平自动伸缩),根据资源利用率或者自定义指标自动调整replication controller、deployment 或 replica set,实现部署的自动扩展和缩减,让部署的规模接近于实际服务的负载。HPA不适于没法缩放的对象,例如DaemonSet。 git
Kubernetes从1.8版本开始,CPU、内存等资源的metrics信息能够经过 Metrics API来获取,用户能够直接获取这些metrics信息(例如经过执行kubect top
命令),HPA使用这些metics信息来实现动态伸缩。本文介绍Kubernetes集群基于metric server的HPA。在开始以前咱们须要了解一下Metrics API和Metrics Server。 github
Metrics API: docker
/apis/metrics.k8s.io/
Metrics server: json
kube-up.sh
脚本以deployment的方式进行部署,也能够经过yaml文件的方式进行部署 因为官方已经弃用heapster,现metrics-server做为其替代方案。 api
当前最新版本为v0.3.1。部署yaml文件连接:deploy bash
在metrics-server-deployment.yaml
中,
image可以使用:ygqygq2/metrics-server:v0.3.1
另还需添加2个参数: app
containers: - name: metrics-server args: - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP - --kubelet-insecure-tls image: ygqygq2/metrics-server:v0.3.1
部署成功后,达到以下结果,则为正常: curl
[root@lab1 1.8+]# kubectl top nodes NAME 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 pods NAME 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=80 nginxtest_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=busybox busybox_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 AGE nginxtest Deployment/nginxtest 100%/10% 1 10 4 24m $ kubectl get deployment nginxtest NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginxtest 4 4 4 4 27m
咱们关掉刚才的busbox并等待一段时间。能够看到副本数量变回为1。
$ kubectl get deployment nginxtest NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginxtest 1 1 1 1 36m $ kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginxtest Deployment/nginxtest 0%/10% 1 10 1 33m
HPA能对服务的容器数量作自动伸缩,对于服务的稳定性是一个很好的提高,但在生产中应用较少,缘由是由于不太容易衡量业务负载是否正常,影响服务稳定性的因素很是多。
参考资料:
[1] https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
[2] https://cloud.tencent.com/developer/article/1005406