您应该设置一个按标签引用特定pod 的pod 中断预算。例如,如果您想确保至少有一个 Jenkins 工作容器始终在运行,您可以创建一个 PDB,例如
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: jenkins-worker-pdb
spec:
minAvailable: 1
selector:
matchLabels:
app: jenkins
component: worker
(改编自Kubernetes 文档中指定中断预算中的基本示例)。
这样做不会阻止节点被破坏;集群自动缩放器仍然可以自由地缩小规模。它会做的是暂时延迟销毁节点,直到可以再次满足中断预算。
例如,假设您已经配置了 Jenkins 设置,以便有三个工作人员。两个被安排在同一个节点上,自动缩放器使该节点脱机。普通的 Kubernetes Deployment 系统会在仍然存在的节点上创建两个新的副本。如果 autoscaler 还决定要销毁拥有最后一个 worker 的节点,则上面的 pod 中断预算将阻止它这样做,直到至少有一个其他 worker 正在运行。
当您在问题中说“Jenkins pod”时,这还有另外两个重要含义。一是您应该几乎总是使用更高级别的对象(例如 Deployment 或 StatefulSets)而不是裸 Pod 来配置您的应用程序。另一个是,如果没有别的,运行多个副本以实现冗余通常很有用。即使没有集群自动扩缩器,磁盘也会出现故障,Amazon 偶尔会随意停用 EC2 实例,否则节点可能会在您无法控制的情况下脱机;您通常不希望集群中只运行一个副本,尤其是当您将其视为一项关键服务时。