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