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 社群驅動。請加入我們以與社群聯繫,並分享你對於上述功能及其他方面的想法和回饋。我們期待收到你的來信!