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 所定義的最大或者最小副本數量的限制了。