四、自动扩缩容HPA
  BMwtnym6fXTR 2023年11月02日 43 0

四、自动扩缩容HPA

1. 什么是HPA

之前通过kubectl scale 命令可以来实现 Pod 的扩缩容功能,但是这个毕竟是完全手动操作的,要应对线上的各种复杂情况,需要能够做到自动化去感知业务,来自动进行扩缩容。为此,Kubernetes 提供了这样的一个资源对象:Horizontal Pod Autoscaling(Pod 水平自动伸缩),简称HPA,HPA 通过监控分析一些控制器控制的所有 Pod 的负载变化情况来确定是否需要调整 Pod 的副本数量,这是 HPA 最基本的原理:

四、自动扩缩容HPA_Kubernetes

HorizontalPodAutoscaler 会指示工作负载资(Deployment、StatefulSet 或其他类似资源)扩容或缩减。由于DaemonSet会在每个节点上都会部署,不适用于水平Pod自动扩缩。


2. HPA的流程

Kubernetes 将水平 Pod 自动扩缩实现为一个间歇运行的控制回路(它不是一个连续的过程)。间隔由 kube-controller-manager--horizontal-pod-autoscaler-sync-period 参数设置(默认间隔为15 秒)。


在每个时间段内,控制器管理器都会根据每个 HorizontalPodAutoscaler 定义中指定的指标查询资源利用率。

  • 控制器管理器找到由 scaleTargetRef 定义的目标资源
  • 根据目标资源的 .spec.selector 标签选择 Pod
  • 从资源指标 API(针对每个 Pod 的资源指标)或自定义指标获取指标 API(适用于所有其他指标)


3. Pod水平自动扩缩注意事项

Pod水平自动扩缩注意事项有以下方面:

  • 必须安装metrics-server或其他自定义metrics-server
  • 必须配置requests参数
  • 不能扩容无法缩放的对象,比如DaemonSet


4. Pod水平自动扩缩接口类型

可以通过以下命令查看所有Pod水平自动扩缩接口类型:

[root@k8s-master01 hpa]# kubectl get apiservices | grep autoscal
v1.autoscaling                         Local                        True        6d13h
v2.autoscaling                         Local                        True        6d13h
v2beta1.autoscaling                    Local                        True        6d13h
v2beta2.autoscaling                    Local                        True        6d13h
  • v1:稳定版自动水平伸缩,只支持CPU指标
  • v2beta1:支持CPU、内存和自定义指标
  • v2beta2:支持CPU、内存、自定义指标Custom和额外指标ExternalMetrics


5. 创建Deployment

写一个Deployment的yaml进行创建。

[root@k8s-master01 hpa]# cat hpa-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: hpa-nginx
  name: hpa-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hpa-nginx
  template:
    metadata:
      labels:
        app: hpa-nginx
    spec:
      containers:
      - image: nginx:1.14.2
        name: nginx
        resources:    #定义了容器的资源请求和限制
          requests:   #指定了容器对CPU和内存的请求
            cpu: 10m  #设定请求量,10毫核的CPU资源


#创建deployment资源
[root@k8s-master01 hpa]# kubectl create -f hpa-nginx.yaml
deployment.apps/hpa-nginx created

#查看deployment资源
[root@k8s-master01 hpa]# kubectl get deployment hpa-nginx
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
hpa-nginx   1/1     1            1           9s

#查看Pod
[root@k8s-master01 hpa]# kubectl get pod
NAME                        READY   STATUS    RESTARTS   AGE
hpa-nginx-55f9b7597-xr976   1/1     Running   0          4m16s

#查看Pod的资源占用情况
[root@k8s-master01 hpa]# kubectl top pod
NAME                        CPU(cores)   MEMORY(bytes)
hpa-nginx-55f9b7597-xr976   0m           2Mi


暴露出80端口

[root@k8s-master01 hpa]# kubectl expose deployment hpa-nginx --port=80
service/hpa-nginx exposed

#查看Service的IP
[root@k8s-master01 hpa]# kubectl get service
NAME         TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)   AGE
hpa-nginx    ClusterIP   192.168.149.208   <none>        80/TCP    15s
kubernetes   ClusterIP   192.168.0.1       <none>        443/TCP   6d14h


测试Web服务,是否可访问,状态码200没问题。

[root@k8s-master01 hpa]# curl -I 192.168.149.208 2>/dev/null | head -1 | awk '{print $2}'
200


6. 创建HPA水平自动扩缩

启动水平自动扩缩

kubectl autoscale deployment hpa-nginx --cpu-percent=10 --min=1 --max=10
  • --cpu-percent=10:指定 Deployment 的目标 CPU 利用率百分比。水平 Pod 自动缩放器将根据当前CPU利用率超过10%时进行自动调整副本数量,以尝试维持此目标。
  • --min=1:指定 Deployment 应具有的最小副本数。即使 CPU 利用率很低,水平 Pod 自动缩放器也不会将 Deployment 缩小到此数以下。
  • --max=10:指定 Deployment 应具有的最大副本数。如果 CPU 利用率非常高,水平 Pod 自动缩放器也不会将 Deployment 扩展到此数以上。


查看HorizontalPodAutoscaler的当前状态

#命令格式:kubectl get hpa Deployment名称
[root@k8s-master01 hpa]# kubectl get hpa hpa-nginx
NAME        REFERENCE              TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-nginx   Deployment/hpa-nginx   0%/10%    1         10        1          7m12s


7. 模拟压力测试

设置死循环进行测试Deployment中的Pod

while true; do wget -q -O- http://192.168.149.208 > /dev/null; done


另起一个ssh会话,边监控HPA的当前状态,CPU利用率已经超10%,自动进行扩容Pod。

kubectl get hpa hpa-nginx

四、自动扩缩容HPA_Kubernetes_02


此时终止压力测试,再查看HPA和Pod的情况,可能Pod还没那么快缩容,稍等一段时间即可。

四、自动扩缩容HPA_Kubernetes_03

四、自动扩缩容HPA_Kubernetes_04


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

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

暂无评论

推荐阅读
  O704k6GYsxMM   2023年11月13日   19   0   0 rkeDockerkubernetes
BMwtnym6fXTR