Kubernetes 1.31 引入了一项新功能——ImageVolume,允许用户直接将 OCI 镜像作为只读卷挂载到 Pod 中。这一功能极大地优化了 AI 和 ML 场景中模型文件的分发效率。
背景
随着 Kubernetes 社区的发展,越来越多的 AI 和 ML 工作负载被部署在 Kubernetes 上。为了更好地支持这些场景,Kubernetes 增强了对 OCI 兼容镜像和工件的支持,使得用户可以通过标准工具管理和分发内容。
ImageVolume 功能的核心是将 OCI 镜像中的数据作为卷挂载到容器中。这不仅简化了大模型文件的分发流程,还避免了传统 PVC 存储方式下跨命名空间重复下载的问题。例如,在使用大模型时,用户可以直接将模型打包为镜像并挂载到 Pod 中,无需额外的下载或复制操作。
配置与启用
ImageVolume 是一个 Alpha 特性,需要手动启用相关功能开关,并确保容器运行时支持该功能。
启用 Feature Gates
要在 Kubernetes 集群中启用 ImageVolume,需要分别在 kube-apiserver 和 kubelet 中开启相应的功能开关。
容器运行时支持
目前,ImageVolume 功能仅支持特定版本的 CRI-O 和 containerd。
- CRI-O:需要版本 >= 1.31。
- containerd:尚未正式合并支持补丁,但可以通过手动应用 PR #10579 的更改来实现支持。
使用示例
以下是构建 OCI 镜像并将其实例化为卷的具体步骤。
构建目标镜像
假设我们需要将 Qwen2-0.5B 模型打包为镜像:
- 下载模型文件并创建 Dockerfile:
FROM scratch
COPY ./models /models
- 构建镜像:
docker build -t lixd96/qwen2-0.5b:v1 .
创建 Pod 并挂载镜像
编写如下 YAML 文件定义 Pod:
apiVersion: v1
kind: Pod
metadata:
name: oci-pod
spec:
containers:
- name: test
image: busybox:1.36
command:
- sleep
- "3600"
volumeMounts:
- name: model-volume
mountPath: /model
readOnly: true
volumes:
- name: model-volume
image:
reference: lixd96/qwen2-0.5b:v1
pullPolicy: IfNotPresent
通过 `kubectl apply -f pod.yaml` 应用配置后,即可验证模型文件是否正确挂载。
总结
ImageVolume 功能显著提升了 Kubernetes 在 AI 场景中的灵活性和效率。虽然当前仍处于 Alpha 阶段,但其潜力已在实际应用中得到验证。未来,随着更多容器运行时的支持以及功能的逐步完善,ImageVolume 将成为一种重要的工件分发手段。