如何确保Kubernetes自动缩放器不会删除运行特定Pod的节点 哪些类型的Pod可以阻止CA删除节点?

问题描述

我正在运行带有Autoscaler pod的Kubernetes集群(AWS EKS一个),以便集群将根据集群中的资源请求自动扩展。

此外,减少负载后,群集将不收缩任何节点。正如我观察到的那样,Autosclaer可以在此过程中删除任何节点。

我想控制这种行为,例如要求Autoscaler停止删除运行特定Pod的节点。 例如,如果某个节点运行Jenkins pod,则Autoscaler应该跳过该节点并从群集中删除其他匹配的节点。

将有一种方法可以实现此要求。请发表您的想法。

解决方法

您可以使用"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"

...

template:
     metadata:
       labels:
         app: jenkins
       annotations:
         "cluster-autoscaler.kubernetes.io/safe-to-evict": "false"

     spec:
       nodeSelector:
         failure-domain.beta.kubernetes.io/zone: us-west-2b
...
,

您应设置一个pod disruption budget,以按标签引用特定的容器。例如,如果您想确保至少有一个Jenkins worker pod运行,则可以创建一个PDB,例如

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: jenkins-worker-pdb
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app: jenkins
      component: worker

(改编自Kubernetes文档中Specifying a Disruption Budget中的基本示例)。

这样做不会阻止节点被破坏;集群自动缩放器仍然可以自由扩展。它的作用是暂时延迟销毁节点,直到可以再次满足中断预算为止。

例如,假设您已经配置了Jenkins设置,以便有三名工人。两个调度在同一节点上,自动缩放器使该节点脱机。普通的Kubernetes部署系统将在仍然存在的节点上创建两个新副本。如果自动缩放器还决定破坏具有最后一个工作线程的节点,则上面的容器中断预算将阻止它继续运行,直到至少有另一个工作线程正在运行。

当您在问题中说“詹金斯豆荚”时,这还有另外两个重要含义。一种是几乎应该始终使用更高级别的对象(例如Deployments或StatefulSets)而不是裸Pod配置应用程序。另一个是通常运行多个事物副本以实现冗余(如果没有其他方法)很有用。即使没有集群自动缩放器,磁盘也会出现故障,Amazon有时会任意停用EC2实例,否则节点可能会在您的控制范围之外脱机。您通常不希望集群中运行的某个内容有一个副本,特别是如果您认为它是一项关键服务。

,

autoscaler FAQ on github中,您可以阅读以下内容:

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

  • 具有受限制的PodDisruptionBudget的豆荚。
  • Kube系统吊舱:
    • 默认情况下不在节点上运行*
  • 未由控制器对象支持的Pod(因此未通过部署,副本集,作业,有状态集等创建)。 *
  • 具有本地存储的窗格。 *
  • 由于各种限制(资源不足,节点选择器不匹配或相似性,匹配而无法移动)的Pod 反亲和力等)
  • 已设置以下注释的窗格:"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"

* 除非该广告连播具有以下注释(在 CA 1.0.3或更高版本):"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...