天天看點

Kubernetes中Horizontal Pod Autoscaler(HPA)控制器詳解

作者:全棧行動派

1、概述

在kubernetes中,有很多類型的pod控制器,每種都有自己的适合的場景,常見的有下面這些:

  • ReplicationController:比較原始的pod控制器,已經被廢棄,由ReplicaSet替代
  • ReplicaSet:保證副本數量一直維持在期望值,并支援pod數量擴縮容,鏡像版本更新
  • Deployment:通過控制ReplicaSet來控制Pod,并支援滾動更新、回退版本
  • Horizontal Pod Autoscaler:可以根據叢集負載自動水準調整Pod的數量,實作削峰填谷
  • DaemonSet:在叢集中的指定Node上運作且僅運作一個副本,一般用于守護程序類的任務
  • Job:它建立出來的pod隻要完成任務就立即退出,不需要重新開機或重建,用于執行一次性任務
  • Cronjob:它建立的Pod負責周期性任務控制,不需要持續背景運作
  • StatefulSet:管理有狀态應用

在前面文章中我們詳解了ReplicaSet、Deployment控制器,這篇我們詳解Horizontal Pod Autoscaler控制器

2、Horizontal Pod Autoscaler(HPA)控制器詳解

在前面的文章中,我們已經可以實作通過手工執行kubectl scale指令實作Pod擴容或縮容,但是這顯然不符合Kubernetes的定位目标--自動化、智能化。 Kubernetes期望可以實作通過監測Pod的使用情況,實作pod數量的自動調整,于是就産生了Horizontal Pod Autoscaler(HPA)這種控制器。

HPA可以擷取每個Pod使用率,然後和HPA中定義的名額進行對比,同時計算出需要伸縮的具體值,最後實作Pod的數量的調整。其實HPA與之前的Deployment一樣,也屬于一種Kubernetes資源對象,它通過追蹤分析RC控制的所有目标Pod的負載變化情況,來确定是否需要針對性地調整目标Pod的副本數,這是HPA的實作原理。

Kubernetes中Horizontal Pod Autoscaler(HPA)控制器詳解

3、 Horizontal Pod Autoscaler(HPA)執行個體操作

為了達到自動擴縮容的目的,我們需要清楚的知道每個pod、node使用資源情況,這個時候就需要安裝metrics-server,如果不會安裝,請看這篇文章:https://blog.csdn.net/u011837804/article/details/128487211

metrics-server安裝後效果

# 檢視k8s叢集 所有節點資源使用情況
[root@k8s-master ~]# kubectl top nodes
NAME         CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
k8s-master   425m         5%     2787Mi          17%
k8s-node1    100m         2%     4488Mi          59%
k8s-node2    799m         9%     21492Mi         33%
[root@k8s-master ~]#
[root@k8s-master ~]#
# 檢視pod 資源使用情況
[root@k8s-master ~]# kubectl top pod -n kube-system
NAME                                       CPU(cores)   MEMORY(bytes)
calico-kube-controllers-59697b644f-bqhsg   5m           33Mi
calico-node-6x9rq                          20m          107Mi
calico-node-9npwl                          16m          180Mi
calico-node-s9g7k                          47m          159Mi
coredns-c676cc86f-n4nj8                    3m           21Mi
coredns-c676cc86f-rhvwg                    3m           18Mi
etcd-k8s-master                            43m          321Mi
kube-apiserver-k8s-master                  77m          350Mi
kube-controller-manager-k8s-master         30m          57Mi
kube-proxy-62sbc                           1m           26Mi
kube-proxy-qq58v                           1m           34Mi
kube-proxy-w6p29                           1m           20Mi
kube-scheduler-k8s-master                  6m           24Mi
metrics-server-f68c598fc-vt4pz             2m           19Mi
[root@k8s-master ~]#           
Kubernetes中Horizontal Pod Autoscaler(HPA)控制器詳解

3.1、建立deploy并限制pod資源使用上限

建立pc-hpa-pod.yaml檔案,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: dev
spec:
  strategy: # 政策
    type: RollingUpdate # 滾動更新政策
  replicas: 1
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        resources: # 資源配額
          limits:  # 限制資源(上限)
            cpu: "1" # CPU限制,機關是core數
          requests: # 請求資源(下限)
            cpu: "100m"  # CPU限制,機關是core數           
Kubernetes中Horizontal Pod Autoscaler(HPA)控制器詳解
# 建立deployment
[root@k8s-master01 1.8+]# kubectl run nginx --image=nginx:1.17.1 --requests=cpu=100m -n dev
# 建立service
[root@k8s-master01 1.8+]# kubectl expose deployment nginx --type=NodePort --port=80 -n dev


# 檢視
[root@k8s-master01 1.8+]# kubectl get deployment,pod,svc -n dev
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           47s

NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-7df9756ccc-bh8dr   1/1     Running   0          47s

NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/nginx   NodePort   10.101.18.29   <none>        80:31830/TCP   35s           
Kubernetes中Horizontal Pod Autoscaler(HPA)控制器詳解

3.2、部署HPA

建立pc-hpa.yaml檔案,内容如下:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: pc-hpa
  namespace: dev
spec:
  minReplicas: 1  #最小pod數量
  maxReplicas: 10 #最大pod數量
  targetCPUUtilizationPercentage: 3 # CPU使用率名額
  scaleTargetRef:   # 指定要控制的nginx資訊
    apiVersion:  /v1
    kind: Deployment
    name: nginx           
Kubernetes中Horizontal Pod Autoscaler(HPA)控制器詳解
# 建立hpa
[root@k8s-master01 1.8+]# kubectl create -f pc-hpa.yaml
horizontalpodautoscaler.autoscaling/pc-hpa created

# 檢視hpa
    [root@k8s-master01 1.8+]# kubectl get hpa -n dev
NAME     REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
pc-hpa   Deployment/nginx   0%/3%     1         10        1          62s           
Kubernetes中Horizontal Pod Autoscaler(HPA)控制器詳解

3.3、測試

使用壓測工具對service位址192.168.5.4:31830進行壓測,然後通過控制台檢視hpa和pod的變化

hpa變化

[root@k8s-master01 ~]# kubectl get hpa -n dev -w
NAME   REFERENCE      TARGETS  MINPODS  MAXPODS  REPLICAS  AGE
pc-hpa  Deployment/nginx  0%/3%   1     10     1      4m11s
pc-hpa  Deployment/nginx  0%/3%   1     10     1      5m19s
pc-hpa  Deployment/nginx  22%/3%   1     10     1      6m50s
pc-hpa  Deployment/nginx  22%/3%   1     10     4      7m5s
pc-hpa  Deployment/nginx  22%/3%   1     10     8      7m21s
pc-hpa  Deployment/nginx  6%/3%   1     10     8      7m51s
pc-hpa  Deployment/nginx  0%/3%   1     10     8      9m6s
pc-hpa  Deployment/nginx  0%/3%   1     10     8      13m
pc-hpa  Deployment/nginx  0%/3%   1     10     1      14m           
Kubernetes中Horizontal Pod Autoscaler(HPA)控制器詳解

deployment變化

[root@k8s-master01 ~]# kubectl get deployment -n dev -w
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           11m
nginx   1/4     1            1           13m
nginx   1/4     1            1           13m
nginx   1/4     1            1           13m
nginx   1/4     4            1           13m
nginx   1/8     4            1           14m
nginx   1/8     4            1           14m
nginx   1/8     4            1           14m
nginx   1/8     8            1           14m
nginx   2/8     8            2           14m
nginx   3/8     8            3           14m
nginx   4/8     8            4           14m
nginx   5/8     8            5           14m
nginx   6/8     8            6           14m
nginx   7/8     8            7           14m
nginx   8/8     8            8           15m
nginx   8/1     8            8           20m
nginx   8/1     8            8           20m
nginx   1/1     1            1           20m           
Kubernetes中Horizontal Pod Autoscaler(HPA)控制器詳解

pod變化

[root@k8s-master01 ~]# kubectl get pods -n dev -w
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7df9756ccc-bh8dr   1/1     Running   0          11m
nginx-7df9756ccc-cpgrv   0/1     Pending   0          0s
nginx-7df9756ccc-8zhwk   0/1     Pending   0          0s
nginx-7df9756ccc-rr9bn   0/1     Pending   0          0s
nginx-7df9756ccc-cpgrv   0/1     ContainerCreating   0          0s
nginx-7df9756ccc-8zhwk   0/1     ContainerCreating   0          0s
nginx-7df9756ccc-rr9bn   0/1     ContainerCreating   0          0s
nginx-7df9756ccc-m9gsj   0/1     Pending             0          0s
nginx-7df9756ccc-g56qb   0/1     Pending             0          0s
nginx-7df9756ccc-sl9c6   0/1     Pending             0          0s
nginx-7df9756ccc-fgst7   0/1     Pending             0          0s
nginx-7df9756ccc-g56qb   0/1     ContainerCreating   0          0s
nginx-7df9756ccc-m9gsj   0/1     ContainerCreating   0          0s
nginx-7df9756ccc-sl9c6   0/1     ContainerCreating   0          0s
nginx-7df9756ccc-fgst7   0/1     ContainerCreating   0          0s
nginx-7df9756ccc-8zhwk   1/1     Running             0          19s
nginx-7df9756ccc-rr9bn   1/1     Running             0          30s
nginx-7df9756ccc-m9gsj   1/1     Running             0          21s
nginx-7df9756ccc-cpgrv   1/1     Running             0          47s
nginx-7df9756ccc-sl9c6   1/1     Running             0          33s
nginx-7df9756ccc-g56qb   1/1     Running             0          48s
nginx-7df9756ccc-fgst7   1/1     Running             0          66s
nginx-7df9756ccc-fgst7   1/1     Terminating         0          6m50s
nginx-7df9756ccc-8zhwk   1/1     Terminating         0          7m5s
nginx-7df9756ccc-cpgrv   1/1     Terminating         0          7m5s
nginx-7df9756ccc-g56qb   1/1     Terminating         0          6m50s
nginx-7df9756ccc-rr9bn   1/1     Terminating         0          7m5s
nginx-7df9756ccc-m9gsj   1/1     Terminating         0          6m50s
nginx-7df9756ccc-sl9c6   1/1     Terminating         0          6m50s           
Kubernetes中Horizontal Pod Autoscaler(HPA)控制器詳解

繼續閱讀