在 Spot Pod 中以更低的费用运行容错工作负载


本页面介绍如何在 Google Kubernetes Engine (GKE) Autopilot 集群中使用 Spot Pod 以更低的费用运行容错工作负载。

概览

在 GKE Autopilot 集群中,Spot Pod 是在 Compute Engine Spot 虚拟机支持的节点上运行的 Pod。Spot Pod 的价格低于标准 Autopilot Pod,但只要运行标准 Pod 需要计算资源,GKE 就可以逐出。

与将这些工作负载作为标准 Pod 运行相比,Spot Pod 非常适合以较低的费用运行无状态、批处理或容错工作负载。如需在 Autopilot 集群中使用 Spot Pod,请修改 Pod 规范以请求 Spot Pod。

您可以在默认的通用 Autopilot 计算类以及满足特定硬件要求的专用计算类上运行 Spot Pod。如需了解这些计算类,请参阅 Autopilot 中的计算类

如需详细了解 Autopilot 集群中的 Spot Pod 的价格,请参阅 Google Kubernetes Engine 价格

优势

在 Autopilot 集群中使用 Spot Pod 具有以下优势:

  • 价格低于在标准 Autopilot Pod 上运行相同工作负载的价格。
  • GKE 会自动管理自动扩缩和调度功能。
  • GKE 会自动运行 Spot Pod 的节点,以确保标准 Pod(例如关键工作负载)不会被调度到这些节点上。使用 Spot Pod 的部署会自动更新相应的容忍

要求和限制

  • 需要 GKE 1.21.4 或更高版本。
  • Spot Pod 已从 Autopilot 服务等级协议中排除。
  • GKE 无法在运行 1.21.4 之前的 GKE 版本的集群上安排 Spot pod。
  • Autopilot 集群使用 cloud.google.com/gke-preemptible 选择器支持在运行 GKE 1.21.4 版或更高版本的集群中抢占式 Pod 的请求。使用此选择器的 Pod 会自动迁移到 Spot Pod,并且选择器会更改为 cloud.google.com/gke-spot

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

请求 Autopilot 工作负载中的 Spot Pod

如需请求您的 Pod 作为 Spot Pod 运行,请在 Pod 规范中的 nodeSelector节点亲和性中使用 cloud.google.com/gke-spot=true 标签。GKE 会自动预配可以运行 Spot Pod 的节点。

比方说,如果 GCP 中的其他地方需要计算资源,Spot 可能会随时被逐出和终止。终止时,终止节点上的 Spot Pod 可以在终止之前请求长达 25 秒的宽限期,该时间段通过指定 terminationGracePeriodSeconds 字段。

Spot Pod 在抢占期间提供的最长宽限期为 25 秒。在 terminationGracePeriodSeconds 中请求超过 25 秒不会在抢占期间超过 25 秒。逐出时,您的 Pod 会收到 SIGTERM 信号,并且应采取措施在宽限期内关停。

对于 Autopilot,GKE 还会自动污染为运行 Spot pod 而创建的节点,并使用相应的容忍修改这些工作负载。污点可防止标准 Pod 被调度到运行 Spot Pod 的节点上。

使用 nodeSelector 需要 Spot pod

您可以使用 nodeSelector 要求 Deployment 中的 Spot Pod。将 cloud.google.com/gke-spot=true 标签添加到您的 Deployment,如以下示例所示:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      labels:
        app: pi
    spec:
      nodeSelector:
        cloud.google.com/gke-spot: "true"
      terminationGracePeriodSeconds: 25
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

使用节点亲和性请求 Spot Pod

或者,您可以使用节点亲和性来请求 Spot Pod。节点亲和性为您提供了一种可扩展的方法来选择节点来运行工作负载。例如,您可以组合多个选择条件,以便更精细地控制 Pod 的运行位置。使用节点亲和性请求 Spot Pod 时,您可以指定要使用的节点亲和性类型,如下所示:

  • requiredDuringSchedulingIgnoredDuringExecution:必须使用 Spot Pod。
  • preferredDuringSchedulingIgnoredDuringExecution:尽力使用 Spot Pod。

如需使用节点亲和性来要求在 Deployment 中使用 Spot Pod,请将以下 nodeAffinity 规则添加到 Deployment 清单中:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      labels:
        app: pi
    spec:
      terminationGracePeriodSeconds: 25
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: cloud.google.com/gke-spot
                operator: In
                values:
                - "true"
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

尽力请求 Spot Pod

如需使用节点亲和性尽力请求 Spot Pod,请使用 preferredDuringSchedulingIgnoredDuringExecution。当您首选请求 Spot Pod 时,GKE 会根据以下顺序安排 Pod:

  1. 可以运行具有可用可分配容量的 Spot pod 的现有节点。
  2. 具有可用可分配容量的现有标准节点。
  3. 可以运行 Spot pod 的新节点(如果计算资源可用)。
  4. 新的标准节点。

由于 GKE 首选具有可分配容量的现有标准节点,而不是为 Spot Pod 创建新节点,因此您可能会发现作为标准 Pod 运行的 Pod 比 Spot Pod 多,这会阻止您充分利用 Spot Pod 的价格更低。

查找和删除已终止的 Pod

在安全 Pod 终止期间,kubelet 会为终止的 Pod 分配 Failed 状态和 Shutdown 原因。当终止的 Pod 数量达到 1000 时,垃圾回收将会清理 Pod。您还可以使用以下命令手动删除关停 Pod:

kubectl get pods --all-namespaces | grep -i shutdown | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n

后续步骤