问题描述
我已经创建了一个Google Kubernetes引擎,并启用了最小和最大节点的自动缩放功能。几天前,我在生产环境中部署了几台服务器,如期增加了节点数量。但是,当我删除这些部署时,我希望它会调整要缩减规模的节点的大小。我等了一个多小时,但它仍然没有缩小。
- 因为我使用Kind:Deployment进行部署,所以所有其他Pod都由副本控制器控制。
- 我的所有stateSet Pod都使用PVC作为卷。
我不确定是什么阻止了节点缩减规模,所以我现在手动调整了节点规模。由于我手动进行了更改,现在无法获取自动定标器日志。
有人知道这里可能有什么问题吗?
GKE版本为1.16.15-gke.4300
如此链接中所述https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#what-types-of-pods-can-prevent-ca-from-removing-a-node- 我没有使用任何本地存储。
- 没有PodDisruptionBudget的Pod(不知道是什么)
- Pod由部署创建(舵图) 唯一的问题是我没有";cluster-autoscaler.kubernetes.io/safe-to-evict";:;True&这个批注。这是必须的吗?
推荐答案
我已经在我的GKE集群上测试了Cluster Autoscaler
。它的工作方式与您预期的略有不同。
Backgorund
您可以使用命令启用自动缩放,也可以在创建过程中启用它,如in this documentation所述。
在Cluster Autoscaler文档中,您可以找到各种信息,如Operation criteria
、Limitations
等。
正如我在评论区提到的,如果遇到以下情况之一,Cluster Autoscaler - Frequently Asked Questions将不起作用:
对于我的测试,我使用了6个节点,其中autoscaling range 1-6
和nginx
应用程序具有请求cpu: 200m
和memory: 128Mi
。
Logs Explorer
粘贴我的日志。有关如何实现这些目标的说明,请参阅Viewing cluster autoscaler events文档。您应该在这些日志中搜索noScaleDown
事件。您会发现有一些信息,但最重要的是:reason: {
parameters: [
0: "kube-dns-66d6b7c877-hddgs"
]
messageId: "no.scale.down.node.pod.kube.system.unmovable"
如NoScaleDown node-level reasonsfor"no.scale.down.node.pod.kube.system.unmovable"
中所述:
解决方案
如果要使Cluster Autoscaler
在GKE
上工作,则必须使用正确信息创建Disruptions,如何创建它可以在How to set PDBs to enable CA to move kube-system pods?
kubectl create poddisruptionbudget <pdb name> --namespace=kube-system --selector app=<app name> --max-unavailable 1
您必须根据需要指定正确的selector
和--max-unavailable
或--min-available
的位置。有关更多详细信息,请阅读Specifying a PodDisruptionBudget文档。测试
$ kubectl get deploy,nodes
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 16/16 16 16 66m
NAME STATUS ROLES AGE VERSION
node/gke-cluster-1-default-pool-6d42fa0a-1ckn Ready <none> 11m v1.16.15-gke.6000
node/gke-cluster-1-default-pool-6d42fa0a-2j4j Ready <none> 11m v1.16.15-gke.6000
node/gke-cluster-1-default-pool-6d42fa0a-388n Ready <none> 3h33m v1.16.15-gke.6000
node/gke-cluster-1-default-pool-6d42fa0a-5x35 Ready <none> 3h33m v1.16.15-gke.6000
node/gke-cluster-1-default-pool-6d42fa0a-pdfk Ready <none> 3h33m v1.16.15-gke.6000
node/gke-cluster-1-default-pool-6d42fa0a-wqtm Ready <none> 11m v1.16.15-gke.6000
$ kubectl get pdb -A
NAMESPACE NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
kube-system kubedns 1 N/A 1 43m
缩减部署
$ kubectl scale deploy nginx-deployment --replicas=2
deployment.apps/nginx-deployment scaled
一段时间(约10-15分钟)后,您将在事件查看器中找到Decision
事件,并在内部找到该节点已删除的信息。
...
scaleDown: {
nodesToBeRemoved: [
0: {
node: {
mig: {
zone: "europe-west2-c"
nodepool: "default-pool"
name: "gke-cluster-1-default-pool-6d42fa0a-grp"
}
name: "gke-cluster-1-default-pool-6d42fa0a-wqtm"
节点数减少:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-cluster-1-default-pool-6d42fa0a-2j4j Ready <none> 30m v1.16.15-gke.6000
gke-cluster-1-default-pool-6d42fa0a-388n Ready <none> 3h51m v1.16.15-gke.6000
gke-cluster-1-default-pool-6d42fa0a-5x35 Ready <none> 3h51m v1.16.15-gke.6000
gke-cluster-1-default-pool-6d42fa0a-pdfk Ready <none> 3h51m v1.16.15-gke.6000
您可以确认其缩容的另一个地方是kubectl get events --sort-by='.metadata.creationTimestamp'
输出:
5m16s Normal NodeNotReady node/gke-cluster-1-default-pool-6d42fa0a-wqtm Node gke-cluster-1-default-pool-6d42fa0a-wqtm status is now: NodeNotReady
4m56s Normal NodeNotReady node/gke-cluster-1-default-pool-6d42fa0a-1ckn Node gke-cluster-1-default-pool-6d42fa0a-1ckn status is now: NodeNotReady
4m Normal Deleting node gke-cluster-1-default-pool-6d42fa0a-wqtm because it does not exist in the cloud provider node/gke-cluster-1-default-pool-6d42fa0a-wqtm Node gke-cluster-1-default-pool-6d42fa0a-wqtm event: DeletingNode
3m55s Normal RemovingNode node/gke-cluster-1-default-pool-6d42fa0a-wqtm Node gke-cluster-1-default-pool-6d42fa0a-wqtm event: Removing Node gke-cluster-1-default-pool-6d42fa0a-wqtm from Controller
3m50s Normal Deleting node gke-cluster-1-default-pool-6d42fa0a-1ckn because it does not exist in the cloud provider node/gke-cluster-1-default-pool-6d42fa0a-1ckn Node gke-cluster-1-default-pool-6d42fa0a-1ckn event: DeletingNode
3m45s Normal RemovingNode node/gke-cluster-1-default-pool-6d42fa0a-1ckn Node gke-cluster-1-default-pool-6d42fa0a-1ckn event: Removing Node gke-cluster-1-default-pool-6d42fa0a-1ckn from Controller
结论
默认情况下,kube-system
Pod阻止CA删除它们正在运行的节点。用户可以手动添加kube-system
个Pod的PDBs
,这些Pod可以安全地重新安排到其他地方。可以使用以下方式实现:kubectl create poddisruptionbudget <pdb name> --namespace=kube-system --selector app=<app name> --max-unavailable 1
CA
无法自动缩放的可能原因列表可在Cluster Autoscaler - Frequently Asked Questions中找到。
若要验证哪些实例仍可使用挡路CA
缩容,您可以使用Autoscaler Events。
这篇关于GKE自动缩放器不缩减节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!