kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例

文章目录

  • 1.根据CPU进行HPA伸缩过程
    • 1.1 运行 php-apache 服务器并暴露服务
    • 1.2 创建 Horizontal Pod Autoscaler
    • 1.3 增加负载
  • 2.根据HPAv2HPA伸缩

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

Horizontal Pod Autoscaler根据观察到的CPU使用率(或使用自定义指标支持,基于某些其他应用程序提供的指标)自动缩放复制控制器,部署,副本集或状态集中的pod数量。 请注意,水平窗格自动缩放不适用于无法缩放的对象,例如DaemonSets。
Horizontal Pod Autoscaler被实现为Kubernetes API资源和控制器。 该资源确定控制器的行为。 控制器会定期调整复制控制器或部署中副本的数量,以使观察到的平均CPU利用率与用户指定的目标相匹配。

kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第1张图片

前提:示例需要一个1.2或者更高版本的可运行的 Kubernetes 集群以及 kubectl。metrics-server 也需要部署到集群中,它可以通过 resource metrics API 对外提供度量数据,Horizontal Pod Autoscaler 正是根据此 API 来获取度量数据

1.根据CPU进行HPA伸缩过程

1.1 运行 php-apache 服务器并暴露服务

kubeadm@server1 ~]$ mkdir hpa
[kubeadm@server1 ~]$ cd hpa/
[kubeadm@server1 hpa]$ ls
[kubeadm@server1 hpa]$ vim php-apache.yml 
[kubeadm@server1 hpa]$ kubectl apply -f php-apache.yml 
deployment.apps/php-apache configured
service/php-apache unchanged
[kubeadm@server1 hpa]$ kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
php-apache-59b89c65c6-9579l   1/1     Running   0          2m12s

[kubeadm@server1 hpa]$ cat php-apache.yml 
[kubeadm@server1 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
        imagePullPolicy: IfNotPresent
        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

kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第2张图片
kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第3张图片


1.2 创建 Horizontal Pod Autoscaler

现在,php-apache服务器已经运行,我们将通过 kubectl autoscale 命令创建 Horizontal Pod Autoscaler。
以下命令将创建一个 Horizontal Pod Autoscaler 用于控制我们上一步骤中创建的 deployment,使 Pod 的副本数量在维持在1到10之间。
大致来说,HPA 将通过增加或者减少 Pod 副本的数量(通过 Deployment )以保持所有 Pod 的平均CPU利用率在50%以内
(由于每个 Pod 通过 kubectl run
申请了200 milli-cores CPU,所以50%的 CPU 利用率意味着平均 CPU 利用率为100 milli-cores)。
相关算法的详情请参阅https://github.com/kubernetes/community/blob/master/contributors/design-proposals/autoscaling/horizontal-pod-autoscaler.md#autoscaling-algorithm

[kubeadm@server1 hpa]$ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/php-apache autoscaled
[kubeadm@server1 hpa]$ kubectl get hpa
NAME         REFERENCE               TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   <unknown>/50%   1         10        0          2s
[kubeadm@server1 hpa]$ kubectl get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         10        1          9m20s

kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第4张图片
在这里插入图片描述


1.3 增加负载

在这里插入图片描述

[kubeadm@server1 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 ##增加负载

在这里插入图片描述
kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第5张图片
kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第6张图片
kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第7张图片
kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第8张图片
kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第9张图片
kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第10张图片
kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第11张图片
kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第12张图片


kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第13张图片
kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第14张图片
kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第15张图片

HPA伸缩过程:
• 收集HPA控制下所有Pod最近的cpu使用情况(CPU utilization)
• 对比在扩容条件里记录的cpu限额(CPUUtilization) • 调整实例数(必须要满足不超过最大/最小实例数)
• 每隔30s做一次自动扩容的判断 CPU utilization的计算方法是用cpu usage(最近一分钟的平均值,通过metrics可以直接获取到)除以 cpu request(这里cpu request就是我们在创建容器时制定的cpu使用核心数)得到一个平均值,这个 平均值可以理解为:平均每个Pod CPU核心的使用占比。

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


2.根据HPAv2HPA伸缩

kind: HorizontalPodAutoscaler
metadata:
  name: php-apache 
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache 
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        averageUtilization: 60
        type: Utilization
  - type: Resource
    resource:
      name: memory
      target:
        averageValue: 50Mi
        type: AverageValue
[kubeadm@server1 hpa]$ kubectl top pod
NAME                          CPU(cores)   MEMORY(bytes)   
demo                          0m           0Mi             
php-apache-59b89c65c6-h4bwp   1m           8Mi             
[kubeadm@server1 hpa]$ kubectl get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         10        1          172m
[kubeadm@server1 hpa]$ vim hpa.yml
[kubeadm@server1 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
[kubeadm@server1 hpa]$ kubectl get hpa
NAME         REFERENCE               TARGETS                MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   8687616/50Mi, 0%/60%   1         10        1          172m

kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第16张图片
kubernetes——HPA(Horizontal Pod Autoscaler水平自动缩放控制器)实例_第17张图片

你可能感兴趣的:(kubernetes,hpa,自动伸缩,k8s,运维)