减少 Kubernetes 上的镜像拉取延迟#
本指南概述了减少 Kubernetes 上 Ray 集群镜像拉取延迟的策略。其中一些策略与云提供商无关,可以在任何 Kubernetes 集群上使用,而另一些则利用了特定云提供商的功能。
镜像拉取延迟#
Ray 容器镜像通常有几 GB 大小,这主要是因为包含了 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 镜像包含在这些自定义机器镜像中可以确保 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 会向节点池中的每个节点附加一个 Persistent Disk。一旦 Ray 在这些节点上调度工作负载,Persistent Disk 中的镜像就可以立即供容器访问。将 Ray 镜像包含在辅助启动盘中可以显著减少镜像拉取延迟。