Kubernetes # HPA(水平Pod自动伸缩器) k8s
  AWkq7aIjuRwO 2023年11月02日 73 0

Kubernetes # HPA(水平Pod自动伸缩器) k8s_Pod

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语言,慢查询这些的优化.这些不属于运维的范畴了

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

AWkq7aIjuRwO