K8S Cluster Autoscaler 集群自動伸縮
什么是 cluster-autoscaler
Cluster Autoscaler (CA)是一個獨立程序,是用來彈性伸縮kubernetes集群的。在使用kubernetes集群經常問到的一個問題是,應該保持多大的節點規模來滿足應用需求呢?cluster-autoscaler 出現解決了這個問題,它可以自動根據部署應用所請求資源量來動態的伸縮集群。
- 項目地址:https://github.com/kubernetes/autoscaler
Cluster Autoscaler 什么時候伸縮集群?
在以下情況下,集群自動擴容或者縮放:
- 擴容:由于資源不足,某些Pod無法在任何當前節點上進行調度
- 縮容: Node節點資源利用率較低時,且此node節點上存在的pod都能被重新調度到其他node節點上運行
什么時候集群節點不會被 CA 刪除?
- 節點上有pod被 PodDisruptionBudget 控制器限制。
- 節點上有命名空間是 kube-system 的pods。
- 節點上的pod不是被控制器創建,例如不是被deployment, replica set, job, stateful set創建。
- 節點上有pod使用了本地存儲
- 節點上pod驅逐后無處可去,即沒有其他node能調度這個pod
- 節點有注解:"cluster-autoscaler.kubernetes.io/scale-down-disabled": "true"(在CA 1.0.3或更高版本中受支持)
Horizontal Pod Autoscaler 如何與 Cluster Autoscaler 一起使用?
Horizontal Pod Autoscaler 會根據當前CPU負載更改部署或副本集的副本數。如果負載增加,則HPA將創建新的副本,集群中可能有足夠的空間,也可能沒有足夠的空間。如果沒有足夠的資源,CA將嘗試啟動一些節點,以便HPA創建的Pod可以運行。如果負載減少,則HPA將停止某些副本。結果,某些節點可能變得利用率過低或完全為空,然后CA將終止這些不需要的節點。
如何防止節點被CA刪除?
從CA 1.0開始,節點可以打上以下標簽:
"cluster-autoscaler.kubernetes.io/scale-down-disabled": "true"
可以使用 kubectl 將其添加到節點(或從節點刪除):
$ kubectl annotate node
運行Cluster Autoscaler 最佳實踐?
- 不要直接修改屬于自動伸縮節點組的節點。同一節點組中的所有節點應該具有相同的容量、標簽和在其上運行的系統pod
- Pod 聲明 requests 資源限制
- 使用 PodDisruptionBudgets 可以防止突然刪除Pod(如果需要)
- 再為節點池指定最小/最大設置之前,請檢查您的云提供商的配額是否足夠大
- 不要運行任何其他節點組自動縮放器(尤其是來自您的云提供商的自動縮放器)
Cluster Autoscaler 支持那些云廠商?
- GCE https://kubernetes.io/docs/concepts/cluster-administration/cluster-management/
- GKE https://cloud.google.com/container-engine/docs/cluster-autoscaler
- AWS https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md
- Azure https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/azure/README.md
- Alibaba Cloud https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/alicloud/README.md
- OpenStack Magnum https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/magnum/README.md
- DigitalOcean https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/digitalocean/README.md
- CloudStack https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/cloudstack/README.md
- Exoscale https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/exoscale/README.md
- Packet https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/packet/README.md
- OVHcloud https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/ovhcloud/README.md
- Linode https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/linode/README.md
- Hetzner https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/hetzner/README.md
- Cluster API https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/clusterapi/README.md
Cluster Autoscaler 部署 和 更多實踐
請參考鏈接:https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md
參考鏈接
https://github.com/kubernetes/autoscaler
https://blog.csdn.net/hello2mao/article/details/80418625