在 Kubernetes 上减少镜像拉取延迟#

本指南概述了在 Kubernetes 上为 Ray 集群减少镜像拉取延迟的策略。其中一些策略是与云服务提供商无关的,因此您可以在任何 Kubernetes 集群上使用它们,而另一些策略则利用了特定云服务提供商的功能。

镜像拉取延迟#

Ray 容器镜像通常可以达到几个 G,这主要是由于其中包含的 Python 依赖项。其他因素也可能导致镜像大小增加。从远程仓库拉取大型镜像会减慢 Ray 集群的启动时间。下载镜像所需的时间取决于几个因素,包括:

  • 镜像层是否已在节点上缓存。

  • 镜像的总体大小。

  • 远程仓库的可靠性和吞吐量。

减少镜像拉取延迟的策略#

以下各节讨论了减少镜像拉取延迟的策略。

使用 DaemonSet 在每个节点上预加载镜像#

您可以通过运行一个预拉取镜像的 DaemonSet,来确保您的 Ray 镜像始终缓存在每个节点上。这种方法可以确保 Ray 将镜像下载到每个节点,从而减少当 Ray 需要调度 pod 时拉取镜像的时间。

以下是一个使用镜像 rayproject/ray:2.40.0 的示例 DaemonSet 配置:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ray-image-preloader
  labels:
    k8s-app: ray-image-preloader
spec:
  selector:
    matchLabels:
      k8s-app: ray-image-preloader
  template:
    metadata:
      labels:
        name: ray-image-preloader
        k8s-app: ray-image-preloader
    spec:
      containers:
      - image: rayproject/ray:2.40.0
        name: ray-image-preloader
        command: [ "sleep", "inf" ]

注意:请确保在 Daemonset 中使用的镜像标签与您的 Ray 集群使用的 Ray 镜像一致。

将镜像预加载到机器镜像中#

一些云服务提供商允许您为 Kubernetes 节点构建自定义机器镜像。在这些自定义机器镜像中包含您的 Ray 镜像,可以确保节点在启动时将镜像缓存到本地,从而避免从远程仓库拉取。虽然这种方法可能有效,但通常不推荐,因为更改机器镜像通常需要多个步骤,并且与节点的生命周期紧密耦合。

使用私有镜像仓库#

对于生产环境,通常建议避免从公共互联网拉取镜像。相反,应将您的镜像托管在离集群更近的地方,以减少拉取时间。Google Cloud 和 AWS 等云服务提供商分别提供了 Artifact Registry (AR) 和 Elastic Container Registry (ECR) 等服务。使用这些服务可以确保镜像拉取的流量保持在提供商的内部网络中,避免了公共互联网上的网络跳数,从而加快了拉取速度。

启用镜像流(仅限 GKE)#

如果您正在使用 Google Kubernetes Engine (GKE),则可以利用 镜像流

通过镜像流,GKE 将远程文件系统用作任何使用符合条件的容器镜像的容器的根文件系统。GKE 会根据工作负载的需要,从远程文件系统流式传输镜像数据。在流式传输镜像数据的同时,GKE 会在后台将整个容器镜像下载到本地磁盘并进行缓存。然后,GKE 会从缓存的镜像中为将来的数据读取请求提供服务。当您部署需要读取容器镜像中特定文件的工作负载时,镜像流后端只提供这些请求的文件。

只有托管在 Artifact Registry 上的容器镜像才符合镜像流的条件。

注意:您可能不会在符合条件的镜像首次拉取时注意到镜像流的好处。但是,在镜像流缓存了镜像之后,任何集群上的未来镜像拉取都会受益于镜像流。

您可以在创建 GKE 集群时,通过设置 --enable-image-streaming 标志来启用镜像流。

gcloud container clusters create CLUSTER_NAME \
    --zone=COMPUTE_ZONE \
    --image-type="COS_CONTAINERD" \
    --enable-image-streaming

有关更多详细信息,请参阅 在集群上启用镜像流

启用辅助引导磁盘(仅限 GKE)#

如果您正在使用 Google Kubernetes Engine (GKE),则可以启用 辅助引导磁盘来预加载数据或容器镜像

GKE 为每个节点池启用辅助引导磁盘。启用后,GKE 会将一个持久磁盘附加到节点池中的每个节点。一旦 Ray 在这些节点上调度工作负载,容器就可以立即访问持久磁盘中的镜像。在辅助引导磁盘中包含 Ray 镜像可以显著减少镜像拉取延迟。

有关准备辅助引导磁盘的详细步骤,请参阅 准备辅助引导磁盘镜像。有关如何为节点池启用辅助引导磁盘的说明,请参阅 配置辅助引导磁盘