GKE自动缩放器不缩减节点 [英] GKE autoscaler not scaling down the nodes

查看:18
本文介绍了GKE自动缩放器不缩减节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经创建了一个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 criteriaLimitations等。

正如我在评论区提到的,如果遇到以下情况之一,Cluster Autoscaler - Frequently Asked Questions将不起作用:

具有受限PodDisruptionBudget的Pod。

Kube-满足以下条件的系统Pod:

  • 默认情况下不在节点上运行,*
  • 没有设置Pod中断预算,或者他们的PDB限制太多(从CA 0.6开始)。
不受控制器对象支持的Pod(因此不是由部署、副本集、作业、状态集等创建的)。*

带本地存储的Pod。*

由于各种限制(资源不足、节点选择器或关联性不匹配、匹配反关联性等)而无法移动到其他位置的Pod

具有以下注释集的Pod: "cluster-autoscaler.kubernetes.io/safe-to-evict": "false"

对于我的测试,我使用了6个节点,其中autoscaling range 1-6nginx应用程序具有请求cpu: 200mmemory: 128Mi

正如OP提到的不能提供自动定标器日志,我将从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"中所述:

Pod阻止缩减,因为它是一个非后台启动、非镜像、非PDB分配的Kube-System Pod。有关详细信息,请参阅KubernetesCluster Autoscaler FAQ

解决方案

如果要使Cluster AutoscalerGKE上工作,则必须使用正确信息创建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-systemPod阻止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自动缩放器不缩减节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆