ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Kubernetes自动横向扩展(HPA)详解

2021-09-15 18:36:16  阅读:296  来源: 互联网

标签:k8s OK Kubernetes 详解 apache HPA php pod


1.HPA介绍

HPA 的全称为(Horizontal Pod Autoscaling)它可以根据当前 pod 资源的使用率(如 CPU、磁盘、内存等),进行副本数的动态的扩容与缩容,以便减轻各个 pod 的压力。当 pod 负载达到一定的阈值后,会根据扩缩容的策略生成更多新的 pod 来分担压力,当 pod 的使用比较空闲时,在稳定空闲一段时间后,还会自动减少 pod 的副本数量。

官方文档
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
https://github.com/kubernetes-sigs/metrics-server

 

2.HPA原理

Kubernetes HPA和阿里云的弹性伸缩Auto Scalling 很类似

使用弹性伸缩(Auto Scaling),您可以根据业务需求和策略设置伸缩规则,在业务需求增长时自动为您增加ECS实例以保证计算能力,在业务需求下降时自动减少ECS实例以节约成本。弹性伸缩不仅适合业务量不断波动的应用程序,
同时也适合业务量稳定的应用程序。

伸缩对象:

HPA可以对replication controller, deployment, replica set和stateful set进行自动伸缩,但是不能对daemon set进行自动伸缩。因为daemon set只能每个节点运行一个副本,不可伸缩。

 

3.HPA示例

3.1安装Metrics Server

HPA需要从Metrics Server中获取Pod的CPU和内存Metrics,用来判断是否达到自动伸缩阈值。

如果还没有安装Metrics Server,可以参考:https://www.cnblogs.com/wuxinchun/p/15273213.html

 

3.2创建Deployment

1)yaml文件

为了测试 HPA,这里将使用 php-apache , php-apache 主要是一个 之后将通过请求访问该 Pod ,用来模拟请求的负载增加和减少,查看 Pod 的数量变化

[root@k8s-master metrics-server]# pwd
/root/k8s_practice/metrics-server
[root@k8s-master metrics-server]# cat php-apache.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  replicas: 1
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
        - name: php-apache
          image: "registry.cn-shenzhen.aliyuncs.com/cookcodeblog/hpa-example:latest"
          ports:
            - containerPort: 80
          resources:
            limits:
              cpu: 500m
            requests:
              cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
    - port: 80
  selector:
    run: php-apache

2)创建php-apache并验证

[root@k8s-master metrics-server]# kubectl apply -f php-apache.yaml
[root@k8s-master metrics-server]# kubectl get deploy,svc php-apache 
NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/php-apache   1/1     1            1           2m26s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/php-apache   ClusterIP   10.100.133.191   <none>        80/TCP    2m26s
[root@k8s-master metrics-server]# kubectl get pod -l run=php-apache -o wide
NAME                          READY   STATUS    RESTARTS   AGE    IP            NODE        NOMINATED NODE   READINESS GATES
php-apache-5b58575b9d-bc56q   1/1     Running   0          3m6s   10.244.1.38   k8s-node1   <none>           <none>

 

 

3.3创建HPA

1)创建默认创建的HPA名称和需要自动伸缩的对象名一致

# 可以通过--name来指定HPA名称
[root@k8s-master metrics-server]# kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/php-apache autoscaled

注:为deployment php-apache 创建HPA,其中最小副本数为1,最大副本数为10,保持该deployment的所有Pod的平均CPU使用率不超过50%

在本例中,deployment的pod的resources.request.cpu为200m (200 milli-cores vCPU),所以HPA将保持所有Pod的平均CPU使用率不超过100m。

2)通过kubectl top pods查看pod的CPU使用情况。

[root@k8s-master metrics-server]# kubectl get hpa php-apache
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         10        1          17s

注:如果TARGETS列值格式为<acutal>/<expected>, 如果actual值总是为unkown,则表示无法从Metrics Server中获取指标值。请参见上面的“安装Metrics Server”章节

HPA默认每15秒从Metrics Server取一下指标来判断是否要自动伸缩:
The Horizontal Pod Autoscaler is implemented as a control loop, with a period controlled by the controller manager’s 
--horizontal-pod-autoscaler-sync-period flag (with a default value of 15 seconds).
Metrics Server采集指标的默认间隔为60秒:
Default 60 seconds, can be changed using metrics-resolution flag. We are not recommending setting values below 15s, 
as this is the resolution of metrics calculated within Kubelet.

 

3.3模拟增加负载

1)模拟增加负载

打开一个新的Terminal,创建一个临时的pod load-generator,并在该pod中向php-apache服务发起不间断循环请求,模拟增加php-apache的负载(CPU使用率)。

[root@k8s-master metrics-server]# kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
If you don't see a command prompt, try pressing enter.
OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!O

注:如果无法通过http://php-apache访问服务,需要检查kube-dns和网络是否配置正确,可以参考:https://cookcode.blog.csdn.net/article/details/109424100

2)模拟压力测试几分钟后,观察HPA:

[root@k8s-master metrics-server]# kubectl get hpa php-apache
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   75%/50%   1         10        5          10m

可以看到TARGETS(CPU使用率)的acutal值已升高到75% (超过了期望值50%),副本数REPLICAS也从1自动扩容到了5。

注:如果Kubernetes集群worker节点的CPU资源已经不足,HPA自动扩容会失败,新扩容的pod会一直处在Pending状态。通过kubectl describe命令查看pod详细信息时,会看到“Insufficient cpu"的错误信息。

3)观察deployment和pod:

[root@k8s-master metrics-server]# kubectl get deployment php-apache
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
php-apache   8/8     8            8           16m
[root@k8s-master metrics-server]# kubectl get pods -l run=php-apache -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
php-apache-5b58575b9d-5kxzq   1/1     Running   0          2m45s   10.244.2.40   k8s-node2   <none>           <none>
php-apache-5b58575b9d-6r4hn   1/1     Running   0          4m46s   10.244.2.39   k8s-node2   <none>           <none>
php-apache-5b58575b9d-bc56q   1/1     Running   0          17m     10.244.1.38   k8s-node1   <none>           <none>
php-apache-5b58575b9d-bf2lk   1/1     Running   0          4m31s   10.244.1.40   k8s-node1   <none>           <none>
php-apache-5b58575b9d-gs4gl   1/1     Running   0          2m45s   10.244.1.41   k8s-node1   <none>           <none>
php-apache-5b58575b9d-jrd72   1/1     Running   0          4m46s   10.244.2.38   k8s-node2   <none>           <none>
php-apache-5b58575b9d-nhb8q   1/1     Running   0          4m46s   10.244.1.39   k8s-node1   <none>           <none>
php-apache-5b58575b9d-rm8dm   1/1     Running   0          2m45s   10.244.2.41   k8s-node2   <none>           <none>

4)发现HPA观测到的CPU实际使用率已降低到46%(小于目标值50%):

[root@k8s-master metrics-server]# kubectl get hpa php-apache
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   46%/50%   1         10        8          13m

注:也就是HPA通过自动扩容到8个副本,来分摊了负载,使得所有Pod的平均CPU使用率保持在目标值内

可以通过kubectl describe hpa php-apache查看HPA自动伸缩的事件

 

3.4模拟减少负载

在运行load-generator的Terminal,按下Ctrl + C来终止进程。

等待几分钟后,观察HPA:

[root@k8s-master metrics-server]# kubectl get hpa php-apache
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         10        1          22m

注:Kuberntes为了保证缩容时业务不中断,和防止频繁伸缩导致系统抖动,scaledown一次后需要等待一段时间才能再次scaledown,也叫伸缩冷却(cooldown)。默认伸缩冷却时间为5分钟。

通过kubectl describe hpa php-apache查看HPA自动伸缩的事件,可以看到“horizontal-pod-autoscaler New size: 1; reason: All metrics below target”的事件。

如果观察HPA没有scale down,需要再等待一段时间。

Kuberntes为了保证缩容时业务不中断,和防止频繁伸缩导致系统抖动,scaledown一次后需要等待一段时间才能再次scaledown,也叫伸缩冷却(cooldown)。

默认伸缩冷却时间为5分钟。

--horizontal-pod-autoscaler-downscale-stabilization: The value for this option is a duration that specifies how long the autoscaler has to wait before another downscale operation can be performed after the current one has completed. The default value is 5 minutes (5m0s).

参见:https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/#support-for-cooldown-delay

类似的,可以参考阿里云自动伸缩的伸缩冷却时间

 

标签:k8s,OK,Kubernetes,详解,apache,HPA,php,pod
来源: https://www.cnblogs.com/wuxinchun/p/15274601.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有