kubernetets进阶 -- HPA实例

  • 官网:https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

基于cpu进行扩容缩容

Horizontal Pod Autoscaler 可以根据CPU利用率自动伸缩 replication controller、deployment 或者 replica set 中的Pod数量 (也可以基于其他应用程序提供的度量指标,目前这一功能处于 beta 版本)。

为了演示 Horizontal Pod Autoscaler,我们将使用一个基于 php-apache 镜像的定制 Docker 镜像hpa-example。

然后用deployment控制器运行。

[root@server2 hpa]# cat php-apache.yml 
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: hpa-example				/镜像名
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m			/请求200m的cpu
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80
  selector:
    run: php-apache

然后再对应这个应用创建一个HPA,来实现自动伸缩。

既然服务器已经在运行,我们将使用kubectl autoscale创建autoscaler。下面的命令将创建一个水平Pod Autoscaler,它维护由我们创建的php-apache部署控制的Pods的1到10个副本。粗略地说,HPA将增加或减少副本的数量(通过部署),以保持所有Pods的平均CPU利用率为50% (因为kubectl运行时每个pod请求200毫核),这意味着平均CPU使用量为100毫核)。

这些数据的来源就是我们通过 Metrics-Server 对资源的监控.

[root@server2 hpa]# kubectl apply -f php-apache.yml 
deployment.apps/php-apache created
service/php-apache created

[root@server2 hpa]# kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
php-apache-dfb6d784b-vkjw9   1/1     Running   0          2m45s

[root@server2 hpa]# kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10  	/创建hpa
horizontalpodautoscaler.autoscaling/php-apache autoscaled

[root@server2 hpa]# kubectl get hpa
NAME         REFERENCE               TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   /50%   1         10        0          8s
								/当前不显示,因为还没有资源的流入
[root@server2 ~]# kubectl top pod
NAME                         CPU(cores)   MEMORY(bytes)   
php-apache-dfb6d784b-vq99l   1m           5Mi             	/当前我们的cpu使用率值有1m 

[root@server2 ~]# watch -n 1 kubectl top pod		/进行监控
Every 1.0s: kubectl top pod      

NAME                         CPU(cores)   MEMORY(bytes)
php-apache-dfb6d784b-vq99l   1m           5Mi

我们可以通过访问,使cpu使用增大:

[root@server2 hpa]# kubectl run demo --image=busybox -it
If you don't see a command prompt, try pressing enter.
/ # while true; do wget -q -O- http://php-apache; done			/这是一个循环,不ctrl+c 不会结束
OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!...

这里的http://php-apache 是我们刚才创建了svc,我们就可以通过dns的解析值解访问svc名就可以了。

Every 1.0s: kubectl top pod

NAME                         CPU(cores)   MEMORY(bytes)
demo                         7m           0Mi
php-apache-dfb6d784b-vq99l   501m         8Mi

这时的cpu已经使用了501m了,我们就可以计算得出500/200*0.5=5个,所以会调整到5个pod来维持cpu的平均利用率。

Every 1.0s: kubectl top pod

NAME                         CPU(cores)   MEMORY(bytes)
demo                         0m           0Mi
php-apache-dfb6d784b-jfmjv   151m         8Mi
php-apache-dfb6d784b-jt6rw   149m         8Mi
php-apache-dfb6d784b-k8kp6   158m         8Mi
php-apache-dfb6d784b-nfqcx   154m         8Mi
php-apache-dfb6d784b-vq99l   152m         8Mi

它的cpu还一致在增加,而且它还会继续的往下拉伸。

  • HPA伸缩过程:

    • 收集HPA控制下所有Pod最近的cpu使用情况(CPU utilization)
    • 对比在扩容条件里记录的cpu限额(CPUUtilization)
    • 调整实例数(必须要满足不超过最大/最小实例数)
    • 每隔30s做一次自动扩容的判断

CPU utilization的计算方法是用cpu usage(最近一分钟的平均值,通过metrics可以直接获取到)除以cpu request(这里cpu request就是我们在创建容器时制定的cpu使用核心数)得到一个平均值,这个平均值可以理解为:平均每个Pod CPU核心的使用占比。

  • HPA进行伸缩算法:
    • pod数量计算公式:TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)
    • ceil()表示取大于或等于某数的最近一个整数 /Target是平均CPU使用量100毫核(200*0.5)
    • 每次扩容后冷却3分钟才能再次进行扩容,而缩容则要等5分钟后。
    • 当前Pod Cpu使用率与目标使用率接近时,不会触发扩容或缩容:
      • 触发条件:avg(CurrentPodsConsumption) / Target >1.1 或 <0.9

就拿上面的5个pod来说
152+154+158+151+149=764
(764/5)/(200*0.5)=1.52 > 1.1 ,所以还会继续扩容,但是要等待3分钟的冷却,因为在创建pod的时候cpu会升蒿,数据就不准确了,所以要等稳定后再去采集。

同样的我们结束刚才的那条命令,等待cpu使用量降下来了hpa的值<0.9,我们的pod就会自动进行缩容。

Every 1.0s: kubectl top pod

NAME                         CPU(cores)   MEMORY(bytes)
demo                         0m           0Mi
php-apache-dfb6d784b-nfqcx   1m           8Mi

现在已经缩到一个了

基于多项指标和自定义指标进行伸缩

只通过cpu来决定扩容格会缩容是不够的.我们还可以通过集群中其他能够获取到的指标进行伸缩。比如流量,每秒请求数。

[root@server2 hpa]# kubectl get hpa php-apache -oyaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler

我们当前使用的版本是 v1 版本,我们可以适用 v2 (beta1,beta2)版本进行多的角度的自动伸缩。

这次我们用文件的方式进行修改:

[root@server2 hpa]# kubectl get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         10        1          59m

[root@server2 hpa]# vim hpa.yml 
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache		/名字和当前的hpa名字相同
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        averageUtilization: 60		/ 50%调到60%
        type: Utilization
  - type: Resource
    resource:
      name: memory		/加入了内存的限制
      target:
        averageValue: 50Mi
        type: AverageValue

[root@server2 hpa]# kubectl apply -f hpa.yml 
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
horizontalpodautoscaler.autoscaling/php-apache configured
[root@server2 hpa]# kubectl get hpa
NAME         REFERENCE               TARGETS                  MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   1m/50Mi, /60%   1         10        1          60m

生效了。剩下的操作就类似于基于cpu的操作

你可能感兴趣的:(k8s)