如何确保 Kubernetes 自动缩放器不会删除运行特定 pod 的节点

Asa*_*a V 6 kubernetes aws-auto-scaling

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

此外,当负载减少时,集群将缩小节点数。正如我所观察到的,Autosclaer 可以删除此过程中的任何节点。

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

请问有没有办法达到这个要求。请给出你的想法。

Cha*_* S. 6

您可以使用 "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
...
Run Code Online (Sandbox Code Playgroud)


Dav*_*aze 5

您应该设置按标签引用特定 Pod 的Pod 中断预算。例如,如果您想确保至少有一个 Jenkins 工作单元始终在运行,您可以创建一个 PDB,例如

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: jenkins-worker-pdb
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app: jenkins
      component: worker
Run Code Online (Sandbox Code Playgroud)

(改编自Kubernetes 文档中指定中断预算中的基本示例)。

这样做并不能防止节点被破坏;集群自动缩放器仍然可以自由地缩小规模。它将做的是暂时延迟销毁节点,直到再次满足破坏预算。

例如,假设您已配置 Jenkins 设置,以便有三个工作人员。两个节点被安排在同一节点上,并且自动缩放器使该节点脱机。普通的 Kubernetes 部署系统将在仍然存在的节点上创建两个新的副本。如果自动缩放程序还决定要销毁拥有最后一个工作线程的节点,则上面的 Pod 中断预算将阻止它这样做,直到至少有一个其他工作线程正在运行。

当您在问题中提到“Jenkins pod”时,还有另外两个重要含义。一是您几乎应该始终使用更高级别的对象(例如 Deployment 或 StatefulSet)来配置应用程序,而不是裸露的 Pod。另一个是,如果没有别的办法,运行多个副本以实现冗余通常是有用的。即使没有集群自动缩放程序,磁盘也会出现故障,Amazon 有时会任意停用 EC2 实例,否则节点可能会在您的控制之外离线;您通常不希望只在集群中运行某项内容的一个副本,尤其是当您将其视为一项关键服务时。