HPA(水平Pod自动伸缩器)
Horizontal Pod Autoscaler
deployment在创建pod的时候它运行一段时间发现节点不够了,deployment可以通过手工进行缩容和扩容,如果发现节点不够了,也可以通过手工进行扩容,但这种扩容是永久性的,它不会弹性的增加或减少HPA可以弹性的增加减少,你可以指定一组监控的指标,比如cpu的使用率,当前pod的cpu使用率大于百分之80了就执行扩容策略,比如现在是业务高峰,3个pod不够用了,你可以把它变成10个 100个 都可以,一旦业务高峰过去了,相当于使用率下来了,pod的整个负载 cpu 内存 都变低了 就不需要那么多pod了,这种情况它会自动的给你减少pod数量,减少到你最初定义的pod数量,这就是自动的弹性扩容和收缩一个控制器:HPA控制器(水平Pod自动伸缩器)
我们通常都是通过cpu的使用率来去定义,最初他只支持cpu这一种指标来去对他进行扩容和收缩
首先得能够获取到你pod的cpu使用率
HPA需要安装metrics-server
(项目地址: https://github.com/kubernetes-incubator/metrics
server )获取度量指标,由于在高可用集群安装中已经安装了metrics-server,不再展示
[root@k8s-master1 daemonSet]# kubectl get pods -n kube-system metrics-server-684999f4d6-p6tnj
NAME READY STATUS RESTARTS AGE
metrics-server-684999f4d6-p6tnj 1/1 Running 18 (130m ago) 11d
HPA就是靠整个组件来去获取cpu使用率
[root@k8s-master1 daemonSet]# kubectl top pods
NAME CPU(cores) MEMORY(bytes)
daemoset-1-nwwxj 0m 3Mi
daemoset-1-qb66h 0m 3Mi
daemoset-1-sqz8z 0m 3Mi
nginx-4 1m 16Mi
HAP本身是基于deployment来创建的,需要针对某一个deployment来去创建,可以新创建一个deployment也可以基于已经创建的deployment进行创建
使用已有的deployment进行创建
[root@k8s-master1 deployment]# cat nginx-deployment-1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
env: dev
template:
metadata:
name: nginx-pod
labels:
app: nginx
env: dev
spec:
containers:
- name: nginx
image: images.guoguo.com/apps/nginx:1.22.1
ports:
- containerPort: 80
resources: #资源限制
requests: #最小使用
cpu: 10m
memory: 100Mi
我们需要把80端口号暴漏出来
[root@k8s-master1 deployment]# kubectl expose deployment nginx-deployment --port=80
#为名为 nginx-deployment 的 Deployment 创建一个 Service。
#这个 Service 的端口(port)为 80。
#会与 Deployment 中容器的 80 端口对应。
#默认创建 ClusterIP 类型的 Service,在集群内部可以通过 Service 访问应用。
这样就可以用service访问了
[root@k8s-master1 deployment]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11d
nginx-deployment ClusterIP 10.102.148.164 <none> 80/TCP 24s
[root@k8s-master1 deployment]# curl 10.102.148.164
test
#访问成功
我们去定义一个HPA.当cpu使用率超过阈值扩容
因为我们是测试环境,所以就不设置80 90 了 设置为10左右
[root@k8s-master1 deployment]# kubectl autoscale deployment nginx-deployment --cpu-percent 10 --min=1 --max=10
horizontalpodautoscaler.autoscaling/nginx-deployment autoscaled
#为名为 nginx-deployment 的 Deployment 创建一个 HorizontalPodAutoscaler(HPA)对象
#指定了弹性伸缩的范围:
#数字10 为百分比 10=10%
#--min=1:最小 Pod 数为 1 当cpu超过百分之10 最少扩容1个
#--max=10:最大 Pod 数为 10 当cpu超过百分之10 最多扩容10个
#--cpu-percent=10:CPU 使用率触发弹性伸缩的阈值,当 Deployment 的 Pod 平均 CPU 使用率超过 10% 时,会进行扩容
#所以这个命令意味着:
#当 Deployment 的 Pod 平均 CPU 使用率超过 10% 时,会自动扩容 Pod 数量,扩容的范围在 1-10 个 Pod。
查看一下
[root@k8s-master1 deployment]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deployment Deployment/nginx-deployment 0%/10% 1 10 1 3m
#NAME: HPA对象的名称
#REFERENCE: 所关联的 workload对象,这里是Deployment
#TARGETS: 配置的目标指标和阈值,这里是CPU使用率0%/10%,意味着当CPU使用率超过10%时会触发弹性伸缩
#MINPODS: HPA配置的最小Pod数量
#MAXPODS: HPA配置的最大Pod数量
#REPLICAS: 当前的Pod副本数量
#AGE: HPA运行的时长
#名为nginx-deployment的HPA对象关联了一个Deployment,目标CPU使用率为0%/10%,最小Pod数为1,最大Pod数为10,当前Pod数量是1个,运行时间为3分钟。
我们去压测,写个循环
for ((i=1;i<=100000;i++)); do curl 10.102.148.164; done
#访问10000次
while true ;do curl 10.102.148.164 ;done
#无限循环访问
查看
[root@k8s-master1 ~]# kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deployment Deployment/nginx-deployment 0%/10% 1 10 1 13m
nginx-deployment Deployment/nginx-deployment 6%/10% 1 10 1 13m
nginx-deployment Deployment/nginx-deployment 79%/10% 1 10 4 13m
[root@k8s-master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-6888855468-2mb2m 1/1 Running 0 6m59s
nginx-deployment-6888855468-4gwp7 1/1 Running 0 17m
nginx-deployment-6888855468-4rn4m 1/1 Running 0 6m44s
nginx-deployment-6888855468-6xxch 1/1 Running 0 6m44s
nginx-deployment-6888855468-8phmw 1/1 Running 0 6m59s
nginx-deployment-6888855468-hltbg 1/1 Running 0 6m29s
nginx-deployment-6888855468-k6nnv 1/1 Running 0 6m59s
nginx-deployment-6888855468-s7b7n 1/1 Running 0 6m44s
nginx-deployment-6888855468-v8v4f 1/1 Running 0 6m44s
nginx-deployment-6888855468-zcprt 1/1 Running 0 6m29s
#给我们扩容了10个
以上就是HPA基于cpu使用率对现有的deployment今天扩容和缩容的过程
这里有个问题,只是把你的pod数量变多了,但不一定把性能提上来,因为有时候性能的瓶颈在后端数据库上,后端数据库读写分离,数据库分库分表,代码本身读写数据库的sql语言,慢查询这些的优化.这些不属于运维的范畴了