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]
配置容器的 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 团队联系。