Kubernetes 1.30:只读卷挂载终于可以真正实现只读
只读卷挂载从一开始就是 Kubernetes 的一项特性。令人惊讶的是,在 Linux 的某些条件下,只读挂载并非完全只读。从 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/*
仍然是可写的。
新的挂载选项:recursiveReadOnly
Kubernetes 1.30 添加了一个新的挂载选项 recursiveReadOnly
,以便使子挂载递归地变为只读。
可以通过以下方式启用该选项
---
apiVersion: v1
kind: Pod
spec:
volumes:
- name: mnt
hostPath:
path: /mnt
containers:
- volumeMounts:
- name: mnt
mountPath: /mnt
readOnly: true
# NEW
# Possible values are `Enabled`, `IfPossible`, and `Disabled`.
# Needs to be specified in conjunction with `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 或更高版本
Linux 内核:v5.12 或更高版本
下一步是什么?
Kubernetes SIG Node 希望并期望该功能在未来的 Kubernetes 版本中被提升为 beta 版本,并最终实现全面可用性 (GA),以便用户不再需要手动启用功能门。
为了向后兼容,recursiveReadOnly
的默认值仍然保持为 Disabled
。
如何了解更多?
请查看文档,了解有关 recursiveReadOnly
挂载的更多详细信息。
如何参与?
此功能由 SIG Node 社区推动。请加入我们,与社区联系,并分享您关于上述功能及其他方面的想法和反馈。我们期待收到您的来信!