Kubernetes v1.33:Image Volume 进阶至 Beta!

镜像卷(Image Volumes)作为 KEP-4639 的一部分,在 Kubernetes v1.31 版本中作为 Alpha 功能被引入。在 Kubernetes v1.33 中,该功能晋级为 Beta

请注意,该功能默认仍为**禁用**状态,因为并非所有容器运行时都完全支持它。CRI-O 从 v1.31 版本开始支持此功能的初始版本,并将在 v1.33 中添加对镜像卷 Beta 版本的支持。containerd 已合并对该 Alpha 功能的支持,这将成为 v2.1.0 版本的一部分,并正在通过 PR #11578 来实现 Beta 版本的支持。

新增内容

镜像卷晋级为 Beta 版的主要变化是支持通过 `spec.containers[*].volumeMounts.[subPath,subPathExpr]` 对容器进行 `subPath``subPathExpr` 挂载。这允许最终用户挂载镜像卷的某个子目录,该子目录仍以只读(`noexec`)方式挂载。这意味着默认情况下无法挂载不存在的子目录。与其他 `subPath` 和 `subPathExpr` 值一样,Kubernetes 将确保指定的子路径中不包含绝对路径或相对路径组件。为安全起见,容器运行时也需要再次检查这些要求。如果卷中不存在指定的子目录,则运行时应在容器创建时失败,并通过现有的 kubelet 事件向用户提供反馈。

除此之外,还为镜像卷提供了三个新的 kubelet 指标

  • kubelet_image_volume_requested_total:概述了请求的镜像卷数量。
  • kubelet_image_volume_mounted_succeed_total:统计成功挂载的镜像卷数量。
  • kubelet_image_volume_mounted_errors_total:统计失败的镜像卷挂载数量。

要为特定镜像卷使用现有子目录,只需将其用作容器 `volumeMounts` 的 `subPath`(或 `subPathExpr`)值即可。

apiVersion: v1
kind: Pod
metadata:
  name: image-volume
spec:
  containers:
  - name: shell
    command: ["sleep", "infinity"]
    image: debian
    volumeMounts:
    - name: volume
      mountPath: /volume
      subPath: dir
  volumes:
  - name: volume
    image:
      reference: quay.io/crio/artifact:v2
      pullPolicy: IfNotPresent

然后,在你的集群上创建该 Pod

kubectl apply -f image-volumes-subpath.yaml

现在你可以附加到该容器

kubectl attach -it image-volume bash

并检查卷中 `dir` 子路径下的文件内容

cat /volume/file

输出将类似于

1

感谢您阅读完这篇博客文章!SIG Node 很自豪也很高兴能在 Kubernetes v1.33 中交付此功能的晋级。

作为这篇博客文章的作者,我想特别感谢**所有**参与其中的人员!

如果您有任何反馈或建议,欢迎通过 Kubernetes Slack (#sig-node) 频道或 SIG Node 邮件列表联系 SIG Node。

进一步阅读