为自动扩缩工作负载缓存 Docker 镜像#

Dask 自动扩缩器 利用 Dask 的自适应模式,并允许调度器根据任务图向上或向下扩缩工作节点的数量。

当 Dask 集群向上或向下扩缩时,无法保证新创建的工作节点 pod 会调度到与之前移除的工作节点相同的节点上。因此,当为工作节点 pod 分配新节点时,集群会因需要下载 Docker 镜像而产生拉取开销。

使用 Daemonset 缓存镜像#

为了保证每个节点运行一致的工作负载,我们将部署一个利用 RAPIDS 镜像的 Kubernetes DaemonSet。此 DaemonSet 将阻止由此镜像创建的 Dask 工作节点 pod 在调度任务时进入 Pending 状态。

这是一个使用 RAPIDS 容器部署 Daemonset 的 manifest 示例。

#caching-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: prepuller
  namespace: image-cache
spec:
  selector:
    matchLabels:
      name: prepuller
  template:
    metadata:
      labels:
        name: prepuller
    spec:
      initContainers:
        - name: prepuller-1
          image: "nvcr.io/nvidia/rapidsai/base:25.04-cuda12.8-py3.12"
          command: ["sh", "-c", "'true'"]

      containers:
        - name: pause
          image: gcr.io/google_containers/pause:3.2
          resources:
            limits:
              cpu: 1m
              memory: 8Mi
            requests:
              cpu: 1m
              memory: 8Mi

你可以使用 kubectl 创建此 Daemonset。

$ kubectl apply -f caching-daemonset.yaml

此 DaemonSet 部署在 image-cache 命名空间中。在 initContainers 部分,我们指定要在集群内拉取和缓存的镜像,利用任何可以成功终止的可执行命令。此外,使用 pause 容器是为了确保 pod 转换为 Running 状态而不消耗资源或运行任何进程。

部署 DaemonSet 后,在所有预拉取 pod 成功运行后,你可以确认镜像已在集群中的所有节点上缓存。随着 Kubernetes 集群向上或向下扩缩,DaemonSet 将自动在任何新添加的节点上拉取并缓存必要的镜像,从而确保始终如一的镜像可用性。