概述

在前面的種類介紹中我們知道了HPA 的精隨就在於如何在適時的自動擴縮避免資源空轉或負載過高,常常見到的情境差不多就像是搶票系統、訂餐系統…等,可以想像這些服務都屬於在某個特定時段都會迎接一段大量服務需求的尖峰,像是午餐時間可以大膽斷定熊貓外送服務用的人一定多到爆炸 XD,雖然大部分的尖峰時刻是可以預期的,但我們就一定需要我們的 DevOps 每天都在特定時間提高服務負載能力嗎?那如果今天的負載是突如其來不可預期的呢?難道這時候就只能準備主機板出來跪了(?,還好我們有 Kubernetes 的 autoscaler 自動化管理服務擴縮,使我們在面對服務尖峰時能夠在短短十來秒中馬上做出反應,接下來利用 HPA 實際練習來加深我們的概念吧。

確認 Metrics Server 是否就緒

在進行之前,我們需要擁有一個已配置 Metrics Server 的 Kubernetes 集群用來收集各種資源指標當作 autoscaling 的依據。

kubectl top node
-------
NAME             CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
docker-desktop   258m         6%     5717Mi          72%

如果還沒有安裝的朋友可以參考前面 Metrics Server 篇來安裝。

HPA 設定檔範例

在上一篇中我們對了 HPA 概念已經有了不少的著墨,但實際上在網路上關於 HPA 的 API 設定檔對於其他資源來說可以說相對少很多,所以這裡整理了大致上會使用到的一些實用參數。

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
	- type: Resource
	  resource:
	    name: memory
	    target:
	      type: Utilization
	      averageUtilization: 80
  - type: Pods
    pods:
      metric:
        name: packets-per-second
      target:
        type: AverageValue
        averageValue: 1k
  - type: Object
    object:
      metric:
        name: requests-per-second
      describedObject:
        apiVersion: networking.k8s.io/v1beta1
        kind: Ingress
        name: main-route
      target:
        type: Value
        value: 10k
	- type: External
  external:
    metric:
      name: queue_messages_ready
      selector:
        matchLabels:
          queue: "worker_tasks"
    target:
      type: AverageValue
      averageValue: 30
	behavior:
	  scaleDown:
	    stabilizationWindowSeconds: 300
	    policies:
	    - type: Percent
	      value: 100
	      periodSeconds: 15
	  scaleUp:
	    stabilizationWindowSeconds: 0
	    policies:
	    - type: Percent
	      value: 100
	      periodSeconds: 15
	    - type: Pods
	      value: 4
	      periodSeconds: 15
	    selectPolicy: Max

一些重要的設定參數:

apiVersion :autoscaling/v2beta2 後開始可以使用 metrics server 中的 memory 當作擴縮指標。

spec.minReplicas/maxReplicas :定義最小或最大的 replica,不能設定 0。

spec.metrics :定義需要監控的資源,及其搭配的使用量調整。

behavior :以上為官方預設值,建議不太需要去改動

實際演練

接下來我們就用官方範例來探討一下細節。