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
v1làm storage version là chưa đủ; object cũ vẫn ởv1alpha1. Chưa thể gỡv1alpha1khỏi.status.storedVersionshay 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.
- Bỏ version cũ của CRD: chỉ định
- Trước đây phải tự viết script
kubectl get/kubectl replace, hoặc cài thêmkube-storage-version-migratorngoà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
StorageVersionMigrationchỉ tới resource; controller tự ghi lại mọi object sang storage version hiện tại, cập nhậtstatus(Running,Succeeded). - Sau khi thành công,
.status.storedVersionscủ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
#Kubernetes#etcd#Storage version#CRD#API versioning#Encryption at rest#Key rotation#Declarative migration#Controller
Được nhắc tới trong
Chủ đề (1)
Công ty (1)