摘要:(hpa簡介)
Horizontal Pod Autoscaling(Pod 水平自動伸縮),簡稱HPA,K8S通過對Pod中運行的容器各項指標(CPU占用、內存占用、網絡請求量)的檢測,實現對(ReplicationController、 Deployment、ReplicaSet 或 StatefulSet 中的)Pod實例個數的動態新增和減少。
前言:
在kubernetes中,我們使用pod對外提供服務。這時候,我們需要以下兩種情形需要關注:
- pod因為不明原因掛掉,導致服務不可用
- Pod在高負荷的情況下,不能支撐我們的服務
如果我們人工監控pods,人工進行調整副本那么這個工作量無疑是巨大的,但kubernetes已經有了相應的機制來應對了。
那么今天就來介紹一下在k8s 1.6中的彈性伸縮的實施
k8s是kubernetes的官方簡稱,HPA全稱Horizontal Pod Autoscaler
官方文檔參考:https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
HPA原理
Kubernetes有一個HPA(Horizontal Pod Autoscaler)的資源,可以實現基於CPU使用率的Pod自動伸縮的功能。HPA基於Master Node上的kube-controller-manager服務啟動參數–horizontal-pod-autoscaler-sync-period定義的時長(默認為30秒),周期性的檢測Pod的CPU使用率(需要事先安裝heapster)。如果需要設置–horizontal-pod-autoscaler-sync-period可以在Master Node上的/etc/default/kube-controller-manager中修改。
早期的kubernetes版本,只支持CPU指標的檢測,因為它是通過kubernetes自帶的監控系統heapster實現的。
到了kubernetes 1.8版本后,heapster已經棄用,資源指標主要通過metrics api獲取,這時能支持檢測的指標就變多了(CPU、內存等核心指標和qps等自定義指標)
HPA創建方式
1、文本方式創建(HPA是一種資源對象,通過yaml進行配置:)
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: smb-api-service-hpa
spec:
maxReplicas: 5
minReplicas: 2
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ template "smbApiService.fullname" . }}
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 80
- type: Resource
resource:
name: memory
targetAverageValue: 200Mi
參數介紹:
minReplicas: 最小pod實例數
maxReplicas: 最大pod實例數
metrics: 用於計算所需的Pod副本數量的指標列表
resource: 核心指標,包含cpu和內存兩種(被彈性伸縮的pod對象中容器的requests和limits中定義的指標。)
object: k8s內置對象的特定指標(需自己實現適配器)
pods: 應用被彈性伸縮的pod對象的特定指標(例如,每個pod每秒處理的事務數)(需自己實現適配器)
external: 非k8s內置對象的自定義指標(需自己實現適配器)
可以指定資源度量指標使用絕對數值,而不是百分比,你需要將 target.type 從 Utilization 替換成 AverageValue,同時設置 target.averageValue 而非 target.averageUtilization 的值。
2、命令行創建 Horizontal Pod Autoscaler
創建hpa用於控制創建的Deployment,使 Pod 的副本數量維持在 1 到 10 之間。 大致來說,HPA 將(通過 Deployment)增加或者減少 Pod 副本的數量以保持所有 Pod 的平均 CPU 利用率在 50% 左右。由於每個 Pod 請求 200 毫核的 CPU,這意味着平均 CPU 用量為 100 毫核。
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
我們可以通過以下命令查看 Autoscaler 的狀態:
kubectl get hpa
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 0% / 50% 1 10 1 18s
通過 kubectl describe hpa
命令來查看 HPA 對象的詳細信息
通過 kubectl delete hpa
命令刪除對象。
總結
1、應用場景
HPA的特性結合第三方的監控應用,使得部署在HPA伸縮對象(statefulSet、replicaController、replicaSet)上的服務有了非常靈活的自適應能力,能夠在一定限度內復制多個副本來應對某個指標的急劇飆升,也可以在某個指標較小的情況下刪除副本來讓出計算資源給其他更需要資源的應用使用,維持整個系統的穩定。非常適合於一些流量波動大,機器資源吃緊,服務數量多的業務場景,如:電商服務、搶票服務、金融服務等。
2、除了上述演示的CPU、內存兩種resource metric(資源度量指標)外,還有兩種其他類型的度量指標,他們被認為是 custom metrics(自定義度量指標)與Kubernetes 對象無關的度量指標(external metrics),這些度量指標可能具有特定於集群的名稱,並且需要更高級的集群監控設置。