学习K8S之路.14---K8S HPA自动进行扩容,缩容


上章,讲述了在K8S中部署metrics server,为本章的HPA做了一定的铺垫。下面简单说说HPA

HPA全称是Horizontal Pod Autoscaler,翻译成中文是POD水平自动伸缩,以下都会用HPA代替Horizontal Pod Autoscaler,HPA可以基于CPU利用率对replication controller、deployment和replicaset中的pod数量进行自动扩缩容(除了CPU利用率也可以基于其他应程序提供的度量指标custom metrics进行自动扩缩容)。pod自动缩放不适用于无法缩放的对象,比如DaemonSets。HPA由Kubernetes API资源和控制器实现。

一:HPA工作原理

      HPA的实现是一个控制循环,由controller manager的–horizontal-pod-autoscaler-sync-period参数指定周期(默认值为15秒)。每个周期内,controller manager根据每个HorizontalPodAutoscaler定义中指定的指标查询资源利用率。controller manager可以从resource metrics API(pod 资源指标)和custom metrics API(自定义指标)获取指标。
      官网参考文档:

https://v1-17.docs.kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

二:HPA API对象

HPA的API有三个版本,通过kubectl api-versions | grep autoscal可看到:
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2

注释:
autoscaling/v1只支持基于CPU指标的缩放;
autoscaling/v2beta1支持Resource Metrics(资源指标,如pod的CPU)和Custom Metrics(自定义指标)的缩放;
autoscaling/v2beta2支持Resource Metrics(资源指标,如pod的CPU)和Custom Metrics(自定义指标)和ExternalMetrics(额外指标)的缩放

三:基于CPU自动扩容,进行讲述:

1:以tomcat为例,创建资源配置清单

-6-96 tomcat-hpa]# vi dp.yaml 
kind: Deployment
metadata:
  name: tomcat-hpa
  namespace: app
spec:
  selector:
    matchLabels:
      app: tomcat-hpa
  template:
    metadata:
      labels:
        app: tomcat-hpa
    spec:
      containers:
      - name: tomcat-hpa
        image: harbor.auth.com/base/tomcat:v1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        resources:
          limits:
            cpu: 200m
          requests:
            cpu: 80m


-6-96 tomcat-hpa]# cat svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: tomcat-hpa-svc
  namespace: app
spec:
  ports:
  - port: 8080
    protocol: TCP
  selector:
    app: tomcat-hpa
  type: ClusterIP

 2:应用资源配置清单

k8s-6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/tomcat-hpa/dp.yaml
k8s-6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/tomcat-hpa/svc.yaml

3:创建HPA

tomcat-hpa服务正在运行,使用kubectl autoscale创建自动缩放器,实现对tomcat-hpa这个deployment创建的pod自动扩缩容,下面的命令将会创建一个HPA,HPA将会根据CPU,内存等资源指标增加或减少副本数,创建一个可以实现如下目的的hpa:

1)让副本数维持在1-10个之间(这里副本数指的是通过deployment部署的pod的副本数)
2)将所有Pod的平均CPU使用率维持在50%(通过kubectlrun运行的每个pod如果是80毫核,这意味着平均CPU利用率为40毫核

给上面tomcat-hpa这个deployment创建HPA

k8s-6-94 ~]# kubectl autoscale deployment tomcat-hpa -n app --cpu-percent=50 --min=1 --max=10

注释:

kubectl autoscale deployment tomcat-hpa (tomcat-hpa表示deployment的名字) --cpu-percent=50(表示cpu使用率不超过50%) --min=1(最少一个pod) --max=10(最多10个pod)

4:验证HPA

-6-95 ~]# kubectl get hpa -n app
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
tomcat-hpa   Deployment/tomcat-hpa   2%/50%    1         10        1          4m3s

5:进行压测查看pod的数量变化

1:查看svc地址为:10.100.114.140
2:进行压力测试:
while true; do wget -q -O- http://10.100.114.140:8080/test/index.html; done

3:查看hpa负载
-6-95 ~]# kubectl get hpa -n app
NAME         REFERENCE               TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
tomcat-hpa   Deployment/tomcat-hpa   210%/50%   1         10        1          4m8s

4:查看pod数量变化
-6-95 ~]# kubectl get pods -n app -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP           NODE                NOMINATED NODE   READINESS GATES
tomcat-hpa-664cc9d9f9-24r8s   1/1     Running   0          6s      172.6.95.8   k8s-6-95.host.com   <none>           <none>
tomcat-hpa-664cc9d9f9-4xpsb   1/1     Running   0          6s      172.6.95.7   k8s-6-95.host.com   <none>           <none>
tomcat-hpa-664cc9d9f9-8w7tk   1/1     Running   0          7m52s   172.6.94.5   k8s-6-94.host.com   <none>           <none>
tomcat-hpa-664cc9d9f9-gk9k6   1/1     Running   0          6s      172.6.94.6   k8s-6-94.host.com   <none>           <none>

5:测试停止后,pod数量减少为1
-6-95 ~]# kubectl get pods -n app -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP           NODE                NOMINATED NODE   READINESS GATES
tomcat-hpa-664cc9d9f9-4xpsb   1/1     Running   0          8m36s   172.6.95.7   k8s-6-95.host.com   <none>           <none>

注释:如果要删除存在的HPA:kubectl delete hpa tomcat-hpa -n app

四:基于内存自动扩容

1:修改资源配置清单

-6-96 tomcat-hpa]# cat dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-hpa
  namespace: app
spec:
  selector:
    matchLabels:
      app: tomcat-hpa
  template:
    metadata:
      labels:
        app: tomcat-hpa
    spec:
      containers:
      - name: tomcat-hpa
        image: harbor.auth.com/base/tomcat:v1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        resources:
          limits:
            memory: 500Mi
          requests:
            memory: 300Mi

-6-96 tomcat-hpa]# cat tomcat-memory-hpa.yaml 
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: tomcat-hpa
  namespace: app
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: tomcat-hpa
  metrics:
  - type: Resource
    resource:
      name: memory
      targetAverageUtilization: 20

注释:添加hpa资源配置清单。targetAverageUtilization: 20 表示使用内存的20%(也就是300Mi的20%)

2:应用资源配置清单

-6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/tomcat-hpa/dp.yaml
-6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/tomcat-hpa/tomcat-memory-hpa.yaml

3:验证HPA,进行测试,观察pod数量变化

-6-94 ~]# kubectl get hpa -n app
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
tomcat-hpa   Deployment/tomcat-hpa   27%/20%   1         10        1          18s

-6-94 ~]# kubectl get pods -n app -o wide
NAME                          READY   STATUS    RESTARTS   AGE   IP           NODE                NOMINATED NODE   READINESS GATES
tomcat-hpa-59764c648b-2mqq4   1/1     Running   0          17s   172.6.95.7   k8s-6-95.host.com   <none>           <none>
tomcat-hpa-59764c648b-d4rxt   1/1     Running   0          17m   172.6.94.5   k8s-6-94.host.com   <none>           <none>

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM