k8s-hpa自動橫向擴容

Jeff的技術棧發表於2021-12-09

hpa自動擴容

官方文件

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

HPA是什麼

Kubernetes有一個HPA(Horizontal Pod Autoscaler)的資源,可以實現基於CPU使用率的Pod自動伸縮的功能。

(1)HPA基於Master Node上的kube-controller-manager服務啟動引數horizontal-pod-autoscaler-sync-period定義的時長(預設為30秒),週期性的檢測Pod的CPU使用率。

如果需要設定horizontal-pod-autoscaler-sync-period可以在Master Node上的/etc/default/kube-controller-manager中修改。

(2)HPA 與之前的 RC、Deployment 一樣,也屬於一種 Kubernetes 資源物件。通過追蹤分析 RC 控制的所有目標 Pod 的負載變化情況,來確定是否需要針對性地調整目標Pod的副本數,這是HPA的實現原理。

(3)metrics-server 也需要部署到叢集中, 它可以通過 resource metrics API 對外提供度量資料。

Horizontal Pod Autoscaler 演練

Horizontal Pod Autoscaler 可以根據 CPU 利用率自動擴縮 ReplicationController、 Deployment、ReplicaSet 或 StatefulSet 中的 Pod 數量 (也可以基於其他應用程式提供的度量指標,目前這一功能處於 beta 版本)。

本文將引領你瞭解如何為 php-apache 伺服器配置和使用 Horizontal Pod Autoscaler。 與 Horizontal Pod Autoscaler 相關的更多資訊請參閱 Horizontal Pod Autoscaler 使用者指南

引數

minReplicas: 最小pod例項數

maxReplicas: 最大pod例項數

metrics: 用於計算所需的Pod副本數量的指標列表

resource: 核心指標,包含cpu和記憶體兩種(被彈性伸縮的pod物件中容器的requests和limits中定義的指標。)

object: k8s內建物件的特定指標(需自己實現介面卡)

pods: 應用被彈性伸縮的pod物件的特定指標(例如,每個pod每秒處理的事務數)(需自己實現介面卡)

external: 非k8s內建物件的自定義指標(需自己實現介面卡)

案例:監控cpu,記憶體,每秒資料包自動擴容

apiVersion: autoscaling/v2beta1 #(支援cpu,memory,及自定義)
kind: HorizontalPodAutoscaler
metadata:
  name: bikesvc
  namespace: sg-bs
spec:
  minReplicas: 1
  maxReplicas: 10
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: bikesvc
  metrics:
    - type: Resource
      resource:
        name: memory  # 記憶體佔用率(百分比)
        targetAverageUtilization: 80
    - type: Resource
      resource:
        name: cpu   # cpu佔用率(百分比)
        targetAverageUtilization: 80
#    - type: Pods
#      pods:
#        metricName: packets-per-second # (每秒資料包)
#        targetAverageValue: 1
    - type: Object
      object:
        metricName: packets-per-second # (每秒資料包)
        target:
          kind: Deployment
          name: bikesvc
        targetValue: 1000

度量指標

pod清單案例-pod定義cup記憶體指標

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeName: sg-15
      containers:
        - name: nginx
          image: nginx
          resources:
            requests:
              cpu: 125m  # 向叢集申請cpu
              memory: 1024Mi # 向叢集申請記憶體

cpu度量指標

    - type: Resource
      resource:
        name: cpu   # cpu佔用率(百分比)
        targetAverageUtilization: 80

memory記憶體度量指標

		- type: Resource
      resource:
        name: memory  # 記憶體佔用率(百分比)
        targetAverageUtilization: 80

pod度量指標

	第一種可選的度量指標型別是 Pod 度量指標。這些指標從某一方面描述了 Pod, 在不同 Pod 之間進行平均,並通過與一個目標值比對來確定副本的數量。 它們的工作方式與資源度量指標非常相像,只是它們僅支援 target 型別為 AverageValue。
		
		- type: Pods
      pods:
        metricName: packets-per-second # (每秒資料包)
        targetAverageValue: 1000

Object度量指標

		第二種可選的度量指標型別是物件(Object)度量指標。這些度量指標用於描述 在相同名字空間中的別的物件,而非 Pods。 請注意這些度量指標不一定來自某物件,它們僅用於描述這些物件。 物件度量指標支援的 target 型別包括 Value 和 AverageValue。 如果是 Value 型別,target 值將直接與 API 返回的度量指標比較, 而對於 AverageValue 型別,API 返回的度量值將按照 Pod 數量拆分, 然後再與 target 值比較。 下面的 YAML 檔案展示了一個表示 requests-per-second 的度量指標。
		
		- type: Object
      object:
        metricName: packets-per-second # (每秒資料包)
        target:
          kind: Deployment
          name: bikesvc
        targetValue: 1000

基於更特別的度量值來擴縮

​ 許多度量流水線允許你通過名稱或附加的 標籤 來描述度量指標。 對於所有非資源型別度量指標(Pod、Object 和後面將介紹的 External), 可以額外指定一個標籤選擇算符。例如,如果你希望收集包含 verb 標籤的 http_requests 度量指標,可以按如下所示設定度量指標塊,使得擴縮操作僅針對 GET 請求執行:

type: Object
object:
  metric:
    name: `http_requests` # http請求
    selector: `verb=GET`  # 標籤篩選

檢視hpa狀態詳情

> kubectl describe hpa -n sg-bs
Name:                                                         bikesvc
Namespace:                                                    sg-bs
Labels:                                                       <none>
Annotations:                                                  CreationTimestamp:  Fri, 03 Dec 2021 03:35:20 +0000
Reference:                                                    Deployment/bikesvc
Metrics:                                                      ( current / target )
  resource memory on pods  (as a percentage of request):      31% (42299392) / 80%
  "packets-per-second" on Deployment/bikesvc (target value):  <unknown> / 1
  resource cpu on pods  (as a percentage of request):         34% (87m) / 80%
Min replicas:                                                 1
Max replicas:                                                 10
Deployment pods:                                              1 current / 1 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource utilization (percentage of request)
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:
  Type     Reason                 Age                  From                       Message
  ----     ------                 ----                 ----                       -------
  Warning  FailedGetObjectMetric  106s (x80 over 21m)  horizontal-pod-autoscaler  unable to get metric packets-per-second: Deployment on sg-bs bikesvc/unable to fetch metrics from custom metrics API: no custom metrics API (custom.metrics.k8s.io) registered
對於上面展示的這個 HorizontalPodAutoscaler,我們可以看出有若干狀態條件處於健康狀態。 首先,AbleToScale 表明 HPA 是否可以獲取和更新擴縮資訊,以及是否存在阻止擴縮的各種回退條件。 其次,ScalingActive 表明 HPA 是否被啟用(即目標的副本數量不為零) 以及是否能夠完成擴縮計算。 當這一狀態為 False 時,通常表明獲取度量指標存在問題。 最後一個條件 ScalingLimitted 表明所需擴縮的值被 HorizontalPodAutoscaler 所定義的最大或者最小值所限制(即已經達到最大或者最小擴縮值)。 這通常表明你可能需要調整 HorizontalPodAutoscaler 所定義的最大或者最小副本數量的限制了。

相關文章