首页 > 解决方案 > 将谷歌云 Kubernetes 集群的大小调整为零不起作用

问题描述

我尝试使用将 kubernetes 集群的大小调整为零节点

gcloud container clusters resize $CLUSTER_NAME --size=0 --zone $ZONE

我收到一条成功消息,但节点池的大小保持不变(我只使用一个节点池)

是否可以将集群大小调整为零?

标签: kubernetesgoogle-cloud-platform

解决方案


有时您只需要等待 10-20 分钟即可自动缩放操作生效。
在其他情况下,您可能需要检查是否满足某些条件来缩小节点。

根据自动缩放器文档

集群自动缩放器还根据节点池对容量的总需求来衡量每个节点的使用情况。如果某个节点在一段时间内没有安排新的 Pod,并且该节点上运行的所有 Pod 都可以调度到池中的其他节点上,则自动缩放器会移动 Pod 并删除该节点。

请注意,集群自动缩放器根据 Pod 资源请求工作,即您的 Pod 请求了多少资源。集群自动扩缩器不会考虑您的 Pod 正在积极使用的资源。本质上,集群自动扩缩器相信您提供的 Pod 资源请求是准确的,并根据该假设在节点上调度 Pod。

注意:从 Kubernetes 版本 1.7 开始,您可以为节点池指定最小大小为零。如果其中的实例不需要运行您的工作负载,这允许您的节点池完全缩减。但是,虽然节点池可以缩放到零大小,但整体集群大小不会缩小到零节点(因为运行系统 Pod 始终需要至少一个节点)

集群自动扩缩器有以下限制: - 缩减时,集群自动扩缩器支持 Pod 最长 10 分钟的正常终止期。Pod 总是在最多 10 分钟后被杀死,即使 Pod 配置了更高的宽限期。

注意:您对集群自动扩缩器所做的每项更改都会导致 Kubernetes 主节点重新启动,这需要几分钟才能完成。

但是,FAQ中提到的某些情况会阻止 CA 删除节点:

哪些类型的 pod 可以阻止 CA 删除节点?

  • 具有限制性 PodDisruptionBudget 的 Pod。
  • Kube 系统 pod:
    • 默认不在节点上运行,*
    • 没有 PDB 或他们的 PDB 过于严格(自 CA 0.6 起)。
  • 不受控制器对象支持的 Pod(因此不是由部署、副本集、作业、有状态集等创建的)。*
  • 具有本地存储的 Pod。*
  • 由于各种限制(缺乏资源、不匹配的节点选择器或亲和性、匹配的反亲和性等)而无法移动到其他地方的 Pod *除非 pod 具有以下注释(在 CA 1.0.3 或更高版本中支持):

"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"

如何将我的集群扩展到只有 1 个节点?

在 0.6 版之前,Cluster Autoscaler 不会触及运行重要 kube-system pod(如 DNS、Heapster、> Dashboard 等)的节点。如果这些 pod 位于不同的节点上,CA 无法缩减集群,用户最终可能会遇到一个完全空的 3 节点集群。在 0.6 中,我们添加了一个选项来告诉 CA 一些系统 pod 可以移动。如果用户为 kube-system pod 配置了PodDisruptionBudget,则不接触运行此 pod 的节点的默认策略将被 PDB 设置覆盖。因此,要启用 kube-system pod 迁移,应该将minAvailable设置为 0(如果有 N+1 个 pod 副本,则设置为 <= N。另请参阅我有几个利用率低的节点,但它们没有按比例缩小。为什么?

如何将节点组缩放到 0?

从 GCE/GKE 的 CA 0.6 和 AWS 的 CA 0.6.1 开始,假设满足所有缩减条件,可以将节点组扩展到 0(显然是从 0)。

对于 AWS,如果您使用 nodeSelector,则需要使用节点模板键“k8s.io/cluster-autoscaler/node-template/label/”标记 ASG。

例如,对于 foo=bar 的节点标签,您可以将 ASG 标记为:

{ "ResourceType": "auto-scaling-group", "ResourceId": "foo.example.com", "PropagateAtLaunch": true, "Value": "bar", "Key": "k8s.io/cluster-autoscaler/node-template/label/foo" }


推荐阅读