我创建了一个Google Kubernetes引擎,它启用了最小和最大节点的自动缩放功能。几天前,我在生产环境中部署了几台服务器,从而增加了节点数量。但当我删除这些部署时,我希望它能调整要缩小的节点的大小。我等了一个多小时,但它仍然没有缩小。
- 所有其他Pod都由副本控制器控制,因为我使用kind部署:部署。
- 我所有的statefulset Pod都使用PVC作为音量。
我不确定是什么阻止了节点缩小,所以我现在手动缩放节点。由于我手动进行了更改,我现在无法获得autoscaler日志。
有谁知道这里的问题是什么吗?
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
- 我没有使用任何本地存储器。
- Pod没有PodDisruptionBudget(不知道那是什么)
- Pod由部署创建(helm charts)
*唯一的问题是我没有“cluster-autoscaler.kubernetes.io/safe-to-evict“:“true”这个注解。一定要这个吗?
2条答案
按热度按时间v2g6jxz61#
我已经在我的GKE集群上测试了
Cluster Autoscaler
。它的工作原理和你预期的有点不同。背景
您可以使用命令启用自动缩放,或者在创建过程中启用它,如in this documentation所述。
在Cluster Autoscaler文档中,您可以找到各种信息,如
Operation criteria
,Limitations
等。正如我在评论部分提到的,如果遇到以下情况之一,群集自动缩放器-常见问题解答将不起作用:
PodDisruptionBudget受限的Pod。
Kube-system pod:
不受控制器对象支持的Pod(因此不是由部署、副本集、作业、状态集等创建的)。*
带本地存储的Pod。*
由于各种限制(缺少资源、非匹配节点选择器或亲和度、匹配反亲和度等)而无法移动到其他地方的Pod
具有以下注解集的Pod:
"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"
个在我的测试中,我使用了6个节点,其中
autoscaling range 1-6
和nginx
应用程序请求cpu: 200m
和memory: 128Mi
。正如OP提到的,无法提供自动缩放器日志,我将从
Logs Explorer
粘贴日志。查看群集自动缩放器事件文档中描述了如何实现这些功能。在这些日志中,您应该搜索
noScaleDown
事件。你会发现有一些信息,但最重要的是:字符串
如NoScaleDown中所述,
"no.scale.down.node.pod.kube.system.unmovable"
的节点级原因:Pod正在阻止缩减,因为它是非守护进程、非镜像、非pdb分配的kube-system pod。请参阅Kubernetes Cluster Autoscaler FAQ了解更多细节。
解决方案
如果你想让
Cluster Autoscaler
在GKE
上工作,你必须创建具有适当信息的中断,如何创建可以在如何设置PDB以使CA能够移动kube-system pod中找到?型
您必须根据需要指定正确的
selector
和--max-unavailable
或--min-available
。有关详细信息,请阅读Specifying a PodDisruptionBudget文档。测试
型
向下扩展部署
型
一段时间后(约10-15分钟),在事件查看器中,您将找到
Decision
事件,并在其中找到节点被删除的信息。型
减少的节点数:
型
另一个可以确认其缩减的地方是
kubectl get events --sort-by='.metadata.creationTimestamp'
输出:
型
总结
默认情况下,
kube-system
pod会阻止CA删除运行它们的节点。用户可以手动为kube-system
pod添加PDBs
,这些pod可以安全地重新安排在其他地方。它可以通过以下方式实现:型
有关
CA
无法自动缩放的可能原因的列表,请参见Cluster Autoscaler - Frequently Asked Questions。要验证哪些pod仍然可以阻止
CA
缩减,您可以使用Autoscaler Events。oymdgrw72#
我在Kubernetes Autoscaler中遇到了同样的错误。在我的例子中,是Kube-dnspod阻止了Autoscaler关闭节点。我尝试为Kube-dns pod创建PodDistributionBudget,但没有修复错误。
解决方案:只需通过更新受影响的pod Yaml文件将注解**”cluster-autoscaler.kubernetes.io/safe-to-evict“:“true”**添加到受影响的pod(在我的情况下为'kube-dns' pod)。
要将此注解默认情况下添加到受影响的pod,只需更新该pod的模板,它会将此注解添加到所有现有的受影响的pod,并使用该注解创建新的受影响的pod。