kubernetes之HPA
1.什么是HPA?
在Kubernetes中,HorizontalPodAutoscaler自动更新工作负载资源(例如 Deployment或者 StatefulSet),目的是自动扩缩工作负载以满足需求。
水平扩缩意味着对增加的负载的响应是部署更多的Pods。 这与"垂直(Vertical")扩缩不同,对于 Kubernetes,垂直扩缩意味着将更多资源(例如:内存或 CPU)分配给已经为工作负载运行的Pod。
如果负载减少,并且 Pod 的数量高于配置的最小值,HorizontalPodAutoscaler会指示工作负载资源(Deployment、StatefulSet 或其他类似资源)缩减。
水平Pod自动扩缩不适用于无法扩缩的对象(例如: DaemonSet.)
HorizontalPodAutoscaler被实现为Kubernetes API资源和控制器。
资源决定了控制器的行为,在Kubernetes控制平面内运行的水平Pod自动扩缩控制器会定期调整其目标(例如:Deployment)的所需规模,以匹配观察到的指标,例如,平均 CPU 利用率、平均内存利用率或你指定的任何其他自定义指标。
官方是这样给出的。
2.下载Metrics-Server,因为kubectl autoscale自动控制在K8s集群中运行的Pod数量,(水平自动伸缩),需要提前设置Pod范围及触发条件。
K8s从1.1版本开始增加了名称为HPA(Horizontal Pod AutoScaler)的控制器,用于实现基于Pod中资源(CPU/Memory)利用率进行对Pod的自动扩缩容功能的实现,早期的版本只能基于Heapster组件实现对CPU利用率作为触发条件,但是在K8s1.11版本开始使用Metrics Server完成数据采集,然后将采集的数据通过API(Aggregated API,汇总API)例如metrics.k8s.io、custom.metrics.k8s.io、external.metrics.k8s.io然后再把数据提供给HPA控制器进行查询,以实现基于某个资源利用率对Pod进行扩缩容的目的。
GitHUB地址
https://github.com/kubernetes-sigs/metrics-server
3.(注意:使用HPA前我们要确保K8s集群的DNS服务和Metrics服务是正常运行的,并且我们所创建的服务需要配置指标分配)
Pod运行正常。
# 选择标签查看Pod
root@kubernetes-master01:~# kubectl get pods -l version=v0.3.6 -n kube-system
NAME READY STATUS RESTARTS AGE
metrics-server-6595f875d6-hdkpb 2/2 Running 5 15d
然后测试也是没有问题。Metrics-Server正常工作。
root@kubernetes-master01:~# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
kubernetes-master01 183m 4% 1279Mi 21%
kubernetes-node01 49m 1% 1111Mi 18%
kubernetes-node02 39m 0% 369Mi 6%
4.创建测试应用
root@kubernetes-master01:~# cat web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web-nginx-hpa
name: web-deployment-nginx-test
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: web-nginx-hpa
template:
metadata:
labels:
app: web-nginx-hpa
spec:
containers:
- image: nginx
name: web-deployment-nginx-test
resources: # 注意Resources必须要配置,否则无法探测到
limits:
cpu: "50m" # 限制单个Pod最多可以使用0.05核CPU和20Mi内存
memory: 20Mi
requests: # 默认可以只配置Requests,但根据生产中的经验,建议把limits资源限制也加上,因为对kubernetes来说,只有这两个都配置了且配置的值都要一样,这个pod资源的优先级才是最高的,在node资源不够的情况下,首先是把没有任何资源分配配置的pod资源给干掉,其次是只配置了requests的,最后才是两个都配置的情况,根据QOS服务质量。
cpu: "50m"
memory: 20Mi
root@kubernetes-master01:~# kubectl apply -f web.yaml
5.创建Serivce,这一步可以为前端提供一个访问入口。方便我们测试使用。
root@kubernetes-master01:~# cat service-hpa.yaml
apiVersion: v1
kind: Service
metadata:
name: hpa-service
spec:
selector:
app: web-nginx-hpa
ports:
- name: http
port: 80
targetPort: 80
root@kubernetes-master01:~# kubectl apply -f service-hpa.yaml
6.创建HPA资源
root@kubernetes-master01:~# cat web.hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: web-deployment-nginx-test
spec:
scaleTargetRef:
apiVersion: apps/v1 # API的版本
kind: Deployment # 资源类型
name: web-deployment-nginx-test # Deployment的具体名称
minReplicas: 2 # 最小Pod数量
maxReplicas: 10 # 最大Pod数量
targetCPUUtilizationPercentage: 30 # CPU到百分之30使用扩缩容。
root@kubernetes-master01:~# kubectl apply -f web.hpa.yaml
7.创建完毕后测试。
root@kubernetes-master01:~# while :;do wget -q -O- http://nginx-hpa;done
8.随着不断访问,流量渐渐上来了。会触发扩缩容。
root@kubernetes-master01:~# kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web-deployment-nginx-test Deployment/web-deployment-nginx-test 0%/30% 2 10 2 90m
web-deployment-nginx-test Deployment/web-deployment-nginx-test 76%/30% 2 10 2 90m
web-deployment-nginx-test Deployment/web-deployment-nginx-test 76%/30% 2 10 4 91m
web-deployment-nginx-test Deployment/web-deployment-nginx-test 55%/30% 2 10 6 91m
web-deployment-nginx-test Deployment/web-deployment-nginx-test 50%/30% 2 10 6 91m
9.停止压测。因为默认情况下,每30s检测一次指标,只要检测到了配置HPA的目标值,则会计算出预期的工作负载的副本数,再进行扩缩容操作。同时,为了避免过于频繁的扩缩容,默认在5min内没有重新扩缩容的情况下,才会触发扩缩容。 不过,HPA本身的算法相对比较保守,可能并不适用于很多场景。例如,一个快速的流量突发场景,如果正处在5min内的HPA稳定期,这个时候根据HPA的策略,会导致无法扩容。 另外,在一些Serverless场景下,有缩容到0然后冷启动的需求,但HPA默认不支持。
root@kubernetes-master01:~# kubectl get pod -w
web-deployment-nginx-test-54f8c5b657-c2wc4 1/1 Running 0 44m
web-deployment-nginx-test-54f8c5b657-c54w4 0/1 ContainerCreating 0 1s
web-deployment-nginx-test-54f8c5b657-cgf74 0/1 ContainerCreating 0 16s
web-deployment-nginx-test-54f8c5b657-k4mpc 0/1 ContainerCreating 0 1s
web-deployment-nginx-test-54f8c5b657-qv9f2 1/1 Running 0 16s
web-deployment-nginx-test-54f8c5b657-v5zfr 1/1 Running 0 3m4s
web-deployment-nginx-test-54f8c5b657-cgf74 1/1 Running 0 27s
相关文章
- Docker高级篇:实战Redis集群!从3主3从变为4主4从
- CentOS7-命令-重启网卡命令(systemctl restart network)
- CSS Flex 弹性布局使用
- 【stars-one】JetBrains产品试用重置工具
- JB一键重置
- 修改阿里云DNS 解决蓝奏云无法访问问题
- IDEA无限试用插件
- 油猴脚本——快速引用某篇文章的标题和地址
- lzupdate
- 封装TornadoFx常用控件库
- 蓝奏云正则字符串
- stars-one的原创工具——文档生成器
- Tornadofx学习笔记(4)——IconTextFx开源库,整合5000+个字体图标
- rpc框架dubbo学习入门及环境搭建(spring boot+Kotlin)
- Tornadofx学习笔记(3)——使用Maven编译成jar包
- 探究Spring Boot中的接收参数问题与客户端发送请求传递数据
- 提问须知
- Spring boot返回时间与MySql数据库中不相同问题及解决方法
- Java IO学习笔记八:多路复用到Netty
- Spring框架学习笔记(9)——API接口设计相关知识及具体编码实现