kubernetes GKE自动缩放器未缩减节点

dgenwo3n  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(2)|浏览(101)

我创建了一个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”这个注解。一定要这个吗?
v2g6jxz6

v2g6jxz61#

我已经在我的GKE集群上测试了Cluster Autoscaler。它的工作原理和你预期的有点不同。

背景

您可以使用命令启用自动缩放,或者在创建过程中启用它,如in this documentation所述。
Cluster Autoscaler文档中,您可以找到各种信息,如Operation criteriaLimitations等。
正如我在评论部分提到的,如果遇到以下情况之一,群集自动缩放器-常见问题解答将不起作用:
PodDisruptionBudget受限的Pod。
Kube-system 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粘贴日志。查看群集自动缩放器事件文档中描述了如何实现这些功能。
在这些日志中,您应该搜索noScaleDown事件。你会发现有一些信息,但最重要的是:

reason: {
parameters: [
0: "kube-dns-66d6b7c877-hddgs"
]
messageId: "no.scale.down.node.pod.kube.system.unmovable"

字符串
如NoScaleDown中所述,"no.scale.down.node.pod.kube.system.unmovable"的节点级原因:
Pod正在阻止缩减,因为它是非守护进程、非镜像、非pdb分配的kube-system pod。请参阅Kubernetes Cluster Autoscaler FAQ了解更多细节。

解决方案

如果你想让Cluster AutoscalerGKE上工作,你必须创建具有适当信息的中断,如何创建可以在如何设置PDB以使CA能够移动kube-system pod中找到?

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。
要验证哪些pod仍然可以阻止CA缩减,您可以使用Autoscaler Events。

oymdgrw7

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。

相关问题