Horizontal Pod Autoscaler(HPA)控制器-pod伸缩

手动修改pod数量方法

命令kubectl scale (临时生效,通过yaml重建后依然为yaml文件的scale的数量)

dashboard修改  

kubectl edit deployment (修改后立即生效,下次重建依然为旧的数量)

yaml文件修改

通过命令手动配置扩缩容

扩容
]# kubectl  scale  deployment/nginx-deployment --replicas=2    -n linux40
deployment.apps/nginx-deployment scaled

]# kubectl  get pods -A
linux40                nginx-deployment-55fb8c9d77-9qlkp            1/1     Running   6          4d22h
linux40                nginx-deployment-55fb8c9d77-sj8bs            1/1     Running   0          46s

缩容
]# kubectl  scale  deployment/nginx-deployment --replicas=1    -n linux40

k8s从1.1版本开始增加了名称为HPA(Horizontal Pod Autoscaler)的控制器,用于实现基于pod中资源
(CPU/Memory)利用率进行对pod的自动扩缩容功能的实现,早期的版本只能基于Heapster组件实现对CPU利用率
做为触发条件,但是在k8s 1.11版本开始使用Metrices Server完成数据采集,然后将采集到的数据通过
API(Aggregated API,汇总API),例如metrics.k8s.io、custom.metrics.k8s.io、external.metrics.k8s.io,然后
再把数据提供给HPA控制器进行查询,以实现基于某个资源利用率对pod进行扩缩容的目的。

autoscale 设置伸缩条件

# --cpu-percent限制容器使用最大的cpu资源,min最小pod数量,max最大pod数量
]# kubectl autoscale deployment/nginx-deployment --min=1 --max=5 --cpu-percent=80 -n linux40
horizontalpodautoscaler.autoscaling/nginx-deployment autoscaled

验证信息:
]# kubectl describe deployment/nginx-deployment -nginx-deployment -n linux40
desired 最终期望处于READY状态的副本数
updated 当前完成更新的副本数
total 总计副本数
available 当前可用的副本数
unavailable 不可用副本数

 查看是否可以获取到监控数据

]# kubectl  top pod -A
NAMESPACE              NAME                                         CPU(cores)   MEMORY(bytes)
kube-system            coredns-6bcbd68c66-9j6sx                     7m           13Mi
kube-system            coredns-6bcbd68c66-9mjck                     6m           8Mi
kube-system            etcd-master                                  27m          191Mi
kube-system            kube-apiserver-master                        75m          312Mi
kube-system            kube-controller-manager-master               32m          43Mi
kube-system            kube-flannel-ds-64qdh                        4m           43Mi
kube-system            kube-flannel-ds-d2g8j                        3m           47Mi
kube-system            kube-flannel-ds-qmssw                        5m           45Mi
kube-system            kube-proxy-4vkl5                             1m           20Mi
kube-system            kube-proxy-mls6g                             1m           18Mi
kube-system            kube-proxy-t4xmg                             1m           20Mi
kube-system            kube-scheduler-master                        5m           20Mi
kube-system            metrics-server-6476d67f96-ghfg5              3m           13Mi
kubernetes-dashboard   dashboard-metrics-scraper-7b8b58dc8b-757sw   1m           17Mi
kubernetes-dashboard   kubernetes-dashboard-75fdb885bf-f29ng        3m           37Mi
linux40                magedu-nginx-deployment-ff6dcf6f6-kj4bt      0m           3Mi
linux40                magedu-nginx-deployment-ff6dcf6f6-wkv8f      0m           4Mi
[root@master
~]# kubectl top node NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% master 229m 5% 1647Mi 44% node1 80m 2% 574Mi 15% node2 85m 2% 509Mi 13%

 查看hpa状态,没有获取到当前CPU使用值

]# kubectl   get hpa -A
NAMESPACE   NAME                REFERENCE                      TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
linux40     nginx-deployment    Deployment/nginx-deployment    <unknown>/80%    1         5         1          2d4h

 查看文档后找到一句话:

Please note that if some of the Pod’s containers do not have the relevant resource request set, CPU utilization for the Pod will not be defined and the autoscaler will not take any action for that metric. See the algorithm details section below for more information about how the autoscaling algorithm works.

大意就是如果不设置container的request request值,那么hpa是无法生效的。
所以看了一眼容器的deployment的yaml,果然没有,于是立马加上:

[root@master knativetest]# kubectl patch deployment  nginx-deployment -p='{"spec":{"template":{"spec":{"containers":[{"name":"nginx-deploy","resources":{"requests":{"cpu":"200m"}}}]}}}}' -n knative-serving 
deployment.apps
/activator patched

默认每15s获取一次数据

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).

 可以看到可以正常获取到数据了

[root@master ~]# kubectl   get hpa -A
NAMESPACE   NAME                               REFERENCE                            TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
linux40     linux40-nginx-web1-podautoscaler   Deployment/magedu-nginx-deployment   0%/60%    2         5         2          22h
linux40     nginx-deployment                   Deployment/nginx-deployment          0%/80%    1         5         1          2d4h

yaml文件中定义扩缩容配置

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  labels:
    app: linux40-tomcat-app1-deployment-label
  name: linux40-tomcat-app1-deployment
  namespace: linux40
spec:
  replicas: 1
  selector:
    matchLabels:
      app: linux40-tomcat-app1-selector
  template:
    metadata:
      labels:
        app: linux40-tomcat-app1-selector
    spec:
      containers:
      - name: linux40-tomcat-app1-container
      image: tomcat-app1:v1
      imagePullPolicy: IfNotPresent
      ports:
      - containerPort: 8080
        protocol: TCP
        name: http
          env:
      - name: "password"
        value: "123456"
      - name: "age"
        value: "18"
      resources:
        limits:
          cpu: 4
          memory: 4Gi
        requests:
          cpu: 2
          memory: 4Gi
      volumeMounts:
      - name: linux40-images
        mountPath: /data/tomcat/webapps/myapp/images
        readOnly: false
      - name: linux40-static
        mountPath: /data/tomcat/webapps/myapp/static
        readOnly: false
    volumes:
    - name: linux40-images
      nfs:
        server: 192.168.64.110
        path: /root/data/nfs1
    - name: linux40-static
      nfs:
        server: 192.168.64.110
        path: /root/data/nfs2

---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: linux40-tomcat-app1-service-label
  name: linux40-tomcat-app1-service
  namespace: linux40
spec:
  type: NodePort
  ports:
  - name: http
    port: 80    //service 端口
    protocol: TCP
    targetPort: 8080  //service转发endpoint端口
    nodePort: 30003  //映射宿主机端口
  selector:
    app: linux40-tomcat-app1-selector

---
apiVersion: autoscaling/v1     //控制器版本
kind: HorizontalPodAutoscaler  //类型
metadata:
  namespace: linux40
  name: linux40-tomcat-app1-hpa-podautoscaler
  labels:
    app: linux40-tomcat-app1  //标签
    version: v1
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: linux40-tomcat-app1-deployment   //自动扩容的deployment的名称
  minReplicas: 2  //最小pod数
  maxReplicas: 5  //最大pod数
  targetCPUUtilizationPercentage: 60  //cpu超过60%就会自动扩容

 好的,现在来测试一下,可以看到虽然deployment的replicas值为1,但是HorizontalPodAutoscaler.spec.minReplicas值为2,所以pod启动副本数为2

]# kubectl   get pod -A
NAMESPACE              NAME                                         READY   STATUS    RESTARTS   AGE
kube-system            coredns-6bcbd68c66-9j6sx                     1/1     Running   0          2d
kube-system            coredns-6bcbd68c66-9mjck                     1/1     Running   0          2d
kube-system            etcd-master                                  1/1     Running   74         325d
kube-system            kube-apiserver-master                        1/1     Running   10         104d
kube-system            kube-controller-manager-master               1/1     Running   37         325d
kube-system            kube-flannel-ds-64qdh                        1/1     Running   16         325d
kube-system            kube-flannel-ds-d2g8j                        1/1     Running   28         325d
kube-system            kube-flannel-ds-qmssw                        1/1     Running   29         325d
kube-system            kube-proxy-4vkl5                             1/1     Running   28         325d
kube-system            kube-proxy-mls6g                             1/1     Running   29         325d
kube-system            kube-proxy-t4xmg                             1/1     Running   16         325d
kube-system            kube-scheduler-master                        1/1     Running   38         325d
kube-system            metrics-server-6476d67f96-ghfg5              1/1     Running   0          23h
kubernetes-dashboard   dashboard-metrics-scraper-7b8b58dc8b-757sw   1/1     Running   11         104d
kubernetes-dashboard   kubernetes-dashboard-75fdb885bf-f29ng        1/1     Running   0          2d3h
linux40                magedu-nginx-deployment-ff6dcf6f6-kj4bt      1/1     Running   0          23h
linux40                magedu-nginx-deployment-ff6dcf6f6-wkv8f      1/1     Running   0          23h

 

posted @ 2021-11-21 16:06  不会跳舞的胖子  阅读(258)  评论(0编辑  收藏  举报