Kubernetes v1.33:镜像卷进阶至 Beta!

镜像卷作为 Alpha 特性首次引入 Kubernetes v1.31 版本,并作为 KEP-4639 的一部分发布。在 Kubernetes v1.33 中,此特性进阶至 Beta

请注意,此特性目前仍默认禁用, 因为并非所有的容器运行时都完全支持此特性。 CRI-O 自 v1.31 起就支持此初始特性,并将在 v1.33 中添加对镜像卷的 Beta 支持。 containerd 已合并对 Alpha 特性的支持, 此特性将包含在 containerd v2.1.0 版本中,并正通过 PR #11578 实现对 Beta 的支持。

新增内容

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

除此之外,还为镜像卷新增三个 kubelet 指标:

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

若要为特定镜像卷使用已有的子目录,只需将其用作容器 volumeMountssubPathsubPathExpr 取值:

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 团队联系。

进一步阅读