Kubernetes v1.37: Storage Version Migration Enabled by Default

Bài tóm tắt Kubernetes 2026 4. Điều chỉnh Độ khó: Trung bình

Kubernetes · 2026 · 4. Điều chỉnh · Độ khó: Trung bình — bài gốc

Bài thông báo tính năng (SIG API Machinery), ngắn. Giá trị chung nằm ở bài toán: dữ liệu cũ nằm im trong storage theo định dạng cũ cho tới khi có ai ghi lại nó.

Bối cảnh

  • Mỗi object của Kubernetes được ghi vào storage (etcd) theo một storage version (một dạng schema). Đổi storage version chỉ áp dụng cho lần ghi mới; object cũ vẫn nằm ở dạng cũ cho tới khi bị ghi lại.
  • Hai tình huống gặp vấn đề:
    • Bỏ version cũ của CRD: chỉ định v1 làm storage version là chưa đủ; object cũ vẫn ở v1alpha1. Chưa thể gỡ v1alpha1 khỏi .status.storedVersions hay ngừng phục vụ nó cho tới khi mọi object đã được ghi lại.
    • Mã hoá lúc lưu và xoay khoá: bật mã hoá hay đổi khoá thì object cũ vẫn chưa mã hoá (hoặc mã bằng khoá cũ) cho tới khi được ghi lại qua API server.
  • Trước đây phải tự viết script kubectl get / kubectl replace, hoặc cài thêm kube-storage-version-migrator ngoài lõi: tẻ nhạt, dễ sai, khó theo dõi.

Thay đổi chính

  • API StorageVersionMigration (storagemigration.k8s.io/v1) và controller trong control plane lên GA, bật mặc định ở v1.37.
  • Khai báo một object StorageVersionMigration chỉ tới resource; controller tự ghi lại mọi object sang storage version hiện tại, cập nhật status (Running, Succeeded).
  • Sau khi thành công, .status.storedVersions của CRD chỉ còn version ưu tiên. Nếu không được cập nhật nghĩa là CRD bị đổi trong lúc migrate: chạy lại trước khi gỡ version cũ.
  • Tác giả CRD có thể đóng gói migration cùng manifest nâng cấp CRD.

Vì sao

  • Biến một việc thủ công, dễ quên thành một API khai báo có trạng thái quan sát được, nằm trong lõi.

Bài học cho SWE

  • Đổi schema/định dạng lưu trữ có hai pha: đọc được cả hai dạng và ghi dạng mới (dễ), rồi ghi lại toàn bộ dữ liệu cũ (hay bị quên). Chỉ sau pha hai mới gỡ được code đọc dạng cũ (Migration không downtime).
  • Cùng cơ chế áp dụng cho mã hoá: bật mã hoá không bảo vệ dữ liệu đã có cho tới khi nó được ghi lại.
  • Cần một tín hiệu "đã xong" đáng tin (ở đây là storedVersions) trước khi bỏ đường cũ; nếu dữ liệu bị đổi trong lúc migrate thì phải chạy lại.
  • Migration nên là thứ khai báo, có trạng thái, đi cùng thay đổi gây ra nó, thay vì script chạy tay.

Liên quan