Pod 水平自動擴縮(Horizontal Pod Autoscaler)(以下都簡稱HPA) 可以基於CPU利用率(by metrics)自動擴縮Pod數量。 除了CPU利用率,也可以透過自定義的metrics進行擴縮。
還記得前面的Deployment replicas的設定值嗎,這個設定值決定了要產生多少個pod,但是如果今天request很少或是很高時,這樣子的pod數量是否有符合需求呢?
除了人工scaling pods外,是否有自動性的機會咧~~科技始終來自於惰性,有HPA後就可以省去這些動作啦,一切交給k8s進行自動擴縮Pod。
k8s中的controller manager會定時去查詢HPA中定義的metrics設定資料(ex cpu使用率),metrics資料來源是controller manager使用resource metric API或是custom metrics API取得,前一篇有提到,如果Deployment沒有設定resources的話是無法使用HPA喔。
HPA需要判斷目前metrics跟設定值的百分比。
使用上篇文章中的test-myapp deployment,執行kubectl autoscale 可以簡單的把原本的test-myapp套上HPA設定
kubectl autoscale deployment test-myapp --cpu-percent=60 --min=1 --max=3
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: test-myapp
spec:
minReplicas: 1
maxReplicas: 3
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: test-myapp
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 60
kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
test-myapp Deployment/test-myapp 10%/60% 1 3 1 1d
test-myapp2 Deployment/test-myapp2 5%/80% 1 2 1 1d
test-myapp3 Deployment/test-myapp3 4%/80% 1 1 1 1d
kubectl describe hpa test-myapp
Name: test-myapp
Namespace: default
CreationTimestamp:
Reference: Deployment/test-myapp
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): 9% (36m) / 60%
Min replicas: 1
Max replicas: 3
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 cpu resource utilization (percentage of request)
ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
Events: <none>
HPA建議使用在無狀態
的服務上面,因為k8s會隨時根據資源使用率進行擴縮pod,如果pod是有狀態的情形時,這樣子自動縮pod會導致原本的資料或是狀態遺失掉,後續需要更多的精力進行hpa後資料遺失的補救。