本页面介绍如何在 Google Kubernetes Engine (GKE) 将 Pod 逐出之前请求延长运行时间。
GKE 发起的 Pod 逐出简介
Pod 逐出是在 Kubernetes 上运行工作负载的正常部分。GKE 会在计划事件期间(例如自动节点升级和自动扩缩缩容)逐出工作负载,以确保您的节点保持最新状态,并针对高效使用资源进行了优化。默认情况下,GKE 会在事件发生时立即向容器发送终止信号,此后容器的宽限期会在 Kubernetes 逐出 Pod 之前终止。对于自动节点升级,宽限期最长为一小时。对于缩容事件,宽限期最长为 10 分钟。
Kubernetes 具有一些内置功能,容器可以使用这些功能来妥善处理逐出,例如 PodDisruptionBudget 和宽限终止时间段。 但是,某些工作负载(如批处理队列或多人游戏服务器)需要运行更长时间,才能被逐出。在 GKE 启动的逐出期间,GKE 授予的默认宽限期可能不足以满足这些工作负载的需求。在这些情况下,您可以告知 Autopilot,在长达 7 天内避免逐出特定工作负载。
使用场景
您可能想要告知 GKE 避免逐出工作负载的一些情况包括:
- 您运行多人游戏服务器,如果服务器过早终止,则会强制让玩家从会话中退出。
- 您运行的音频或视频会议软件会在服务器终止时中断正在进行的会议。
- 您运行需要时间才能完成的任务,提前终止会导致正在进行的工作丢失。
- 您运行的有状态服务对中断的容忍度较低,并且希望最大限度地降低中断发生的频率。
价格
您可以为 Pod 请求延长运行时间,而无需额外付费。 但是,请考虑以下可能会影响价格的行为变更:
- Autopilot 集群对时长较长的 Pod 的资源请求强制执行较高的最小值。Autopilot 集群会针对正在运行的 Pod 的资源请求收费。您无需为系统开销或未使用的节点容量付费。
- 使用时长延长的 Pod 可能会增加集群中的节点数量,从而影响 IP 地址用量和可伸缩性。如果您有在每个节点上运行的 DaemonSet,则这会在集群中产生更多 DaemonSet,
如需详细了解价格信息,请参阅 Autopilot 价格。
须知事项
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
以获取最新版本。
- 确保您拥有运行 1.27 版或更高版本的 Autopilot 集群。
限制
- 您不能为 Spot Pod 请求延长运行时间。
- 计算延长的运行时间时,系统会计算映像拉取时间。
- 每个集群中最多可以有 50 个时长延长的工作负载(具有不同的 CPU 请求)。也就是说,通过 Autopilot 资源最小值、比率和增量大小检查后,多达 50 个不同的 CPU 请求值集可以在每个集群中延长时长。
- 您不能在时长延长的 Pod 中使用 Kubernetes 的 Pod 间亲和性。
- GKE 会尽可能将每个长时间运行的 Pod 放置在它自己的节点上。此行为可确保节点在未得到充分利用时可以缩容。
请求延长运行时间
如需请求延长 Pod 的运行时间,请在 Pod 规范中将 Kubernetes cluster-autoscaler.kubernetes.io/safe-to-evict
注释设置为 false
。
将以下清单保存为
extended-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: extended-pods labels: duration: extended spec: selector: matchLabels: duration: extended template: metadata: annotations: cluster-autoscaler.kubernetes.io/safe-to-evict: "false" labels: duration: extended spec: containers: - name: example-container image: registry.k8s.io/pause resources: requests: cpu: 200m
创建 Deployment:
kubectl create -f extended-deployment.yaml
Pod 会持续运行至少 7 天,然后才能进行缩容或节点自动升级。
注意事项和建议
使用此功能时,请考虑以下事项:
- 时长延长的 Pod 不会受到基于优先级的逐出的保护。如果您使用 Kubernetes PriorityClass,请考虑以下方法,以最大限度地降低基于优先级的逐出的概率:
- 请确保您的时长延长的 Pod 使用最高优先级的 PriorityClass,这样其他用户 Pod 就不会逐出您的时长延长的 Pod。
- 使用工作负载分离与其他 Pod 分开运行时长延长的 Pod。
- 系统 Pod 以最高优先级运行,并且始终可以逐出时长延长的 Pod。为了最大限度地降低这种情况的可能性,GKE 会在调度时长延长的 Pod 之前在节点上调度系统 Pod。
- 在以下情况下,时长延长的 Pod 仍然可以被提前逐出:
- 为更高优先级的用户 Pod 腾出空间(使用更高的 PriorityClass)而进行的逐出
- 为 Kubernetes 系统组件腾出空间而进行的逐出
- kubelet 内存不足逐出(如果 Pod 使用的内存超过其请求 (OOMKill))
- Compute Engine 虚拟机维护事件。 加速器优化机器类型更有可能受到这些事件的影响,因为这些机器不支持实时迁移。
- 节点自动修复
- 用户发起的事件,例如排空节点
- 您可以在标准集群中使用
cluster-autoscaler.kubernetes.io/safe-to-evict
注释,但结果并不相同。即使发生缩容事件,Pod 也会无限期运行,防止删除未充分利用的节点,从而导致您继续为这些节点付费。对于节点自动升级导致的逐出,Pod 也不受保护。