Kubernetes 1.30:只读卷挂载终于可以真正实现只读了

2024年 5月 4日 72.6k 0

作者: Akihiro Suda (NTT)

译者: Xin Li (DaoCloud)

只读卷挂载从一开始就是 Kubernetes 的一个特性。
令人惊讶的是,在 Linux 上的某些条件下,只读挂载并不是完全只读的。
从 v1.30 版本开始,这类卷挂载可以被处理为完全只读;v1.30 为递归只读挂载提供 Alpha 支持。

默认情况下,只读卷装载并不是真正的只读

卷挂载可能看似复杂。

你可能期望以下清单使容器中 /mnt 下的所有内容变为只读:

---
apiVersion: v1
kind: Pod
spec:
  volumes:
    - name: mnt
      hostPath:
        path: /mnt
  containers:
    - volumeMounts:
        - name: mnt
          mountPath: /mnt
          readOnly: true

但是,/mnt 下的任何子挂载可能仍然是可写的!
例如,假设 /mnt/my-nfs-server 在主机上是可写的。
在容器内部,写入 /mnt/* 将被拒绝,但 /mnt/my-nfs-server/* 仍然可写。

新的挂载选项:递归只读

Kubernetes 1.30 添加了一个新的挂载选项 recursiveReadOnly,以使子挂载递归只读。

可以按如下方式启用该选项:

---
apiVersion: v1
kind: Pod
spec:
  volumes:
    - name: mnt
      hostPath:
        path: /mnt
  containers:
    - volumeMounts:
        - name: mnt
          mountPath: /mnt
          readOnly: true
          # NEW
          # 可能的值为 `Enabled`、`IfPossible` 和 `Disabled`。
          # 需要与 `readOnly: true` 一起指定。
          recursiveReadOnly: Enabled

这是通过使用 Linux 内核 v5.12 中添加的
mount_setattr(2)
应用带有 AT_RECURSIVE 标志的 MOUNT_ATTR_RDONLY 属性来实现的。

为了向后兼容,recursiveReadOnly 字段不是 readOnly 的替代品,而是与其结合使用。
要获得正确的递归只读挂载,你必须设置这两个字段。

特性可用性

要启用 recursiveReadOnly 挂载,必须使用以下组件:

  • Kubernetes:v1.30 或更新版本,并启用 RecursiveReadOnlyMounts 特性门控。
    从 v1.30 开始,此特性被标记为 Alpha。

  • CRI 运行时:

    • containerd:v2.0 或更新版本
  • OCI 运行时:

    • runc:v1.1 或更新版本
    • crun: v1.8.6 或更新版本

接下来

Kubernetes SIG Node 希望并期望该特性将在 Kubernetes
的未来版本中升级为 Beta 版本并最终稳定可用(GA),以便用户不再需要手动启用此特性门控。

为了向后兼容,recursive ReadOnly 的默认值仍将保持 Disabled

怎样才能了解更多?

请查看文档以获取
recursiveReadOnly 挂载的更多详细信息。

如何参与?

此特性由 SIG Node 社区推动。
请加入我们,与社区建立联系,并分享你对上述特性及其他特性的想法和反馈。
我们期待你的回音!

相关文章

KubeSphere 部署向量数据库 Milvus 实战指南
探索 Kubernetes 持久化存储之 Longhorn 初窥门径
征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
那些年在 Terraform 上吃到的糖和踩过的坑
无需 Kubernetes 测试 Kubernetes 网络实现
Kubernetes v1.31 中的移除和主要变更

发布评论