Storage Mới của v1.36
Part IX dừng ở storage động với EBS CSI và snapshot. v1.36 đưa thêm vài tính năng storage lên ổn định, và cụm tự dựng (đã có EBS CSI + snapshot-controller từ Bài 43–44) là chỗ thử ngay. Bài này làm hai cái chạy được — OCI image volume và VolumeAttributesClass — và nói thẳng về cái thứ ba không chạy được ở đây, vì lý do đáng học.
OCI image volume
Đến giờ volume là disk hoặc dữ liệu (Bài 41–42). v1.36 ổn định một nguồn volume mới: nội dung của một OCI image mount thẳng vào pod read-only. Hữu ích để đóng gói file cấu hình, model ML, hay bộ asset thành một image có version, rồi mount vào container ứng dụng mà không nhồi chúng vào image ứng dụng. Khai ở volumes[].image:
spec:
containers:
- name: c
image: busybox:1.36
command: ["sleep", "100000"]
volumeMounts:
- {name: content, mountPath: /oci, readOnly: true}
volumes:
- name: content
image:
reference: registry.k8s.io/e2e-test-images/busybox:1.36.1-1
pullPolicy: IfNotPresent
containerd kéo image đó như kéo image container, rồi mount filesystem của nó vào /oci:
kubectl -n stor-demo exec oci-vol -- ls /oci
bin dev etc home lib lib64 root tmp usr var
/oci chứa rootfs của image được trỏ — pod chính chạy busybox, nhưng thấy được nội dung của một image khác tại đường dẫn mount. Đây là việc trước đây phải làm bằng initContainer kéo dữ liệu, hoặc nhồi vào image; giờ là một nguồn volume gốc, dùng chính hạ tầng registry + cache image của node.
VolumeAttributesClass: đổi tham số volume động
Bài 43 đặt IOPS/throughput của EBS qua StorageClass — lúc tạo volume, cố định sau đó. VolumeAttributesClass (GA ở 1.36) cho đổi các tham số đó trên volume đang dùng, không tạo lại. Khai hai lớp, một thấp một cao:
apiVersion: storage.k8s.io/v1
kind: VolumeAttributesClass
metadata: {name: ebs-silver}
driverName: ebs.csi.aws.com
parameters: {type: gp3, iops: "3000", throughput: "125"}
---
apiVersion: storage.k8s.io/v1
kind: VolumeAttributesClass
metadata: {name: ebs-gold}
driverName: ebs.csi.aws.com
parameters: {type: gp3, iops: "4000", throughput: "250"}
Tạo PVC trỏ volumeAttributesClassName: ebs-silver, provisioning xong, EBS volume có 3000 IOPS. Rồi chuyển PVC sang ebs-gold:
kubectl -n stor-demo patch pvc vac-pvc --type=merge \
-p '{"spec":{"volumeAttributesClassName":"ebs-gold"}}'
external-resizer (sidecar trong ebs-csi-controller, có cờ VolumeAttributesClass=true) gọi CSI ModifyVolume, và EBS volume đổi trên AWS mà pod không gián đoạn:
# poll PVC + describe EBS volume thật
try 1: currentVAC=ebs-silver | EBS iops=3000 throughput=125
try 2: currentVAC=ebs-gold | EBS iops=4000 throughput=250
status.currentVolumeAttributesClassName chuyển sang ebs-gold, và aws ec2 describe-volumes xác nhận IOPS 3000→4000, throughput 125→250 — thay đổi áp thẳng lên block device đang mount, không tái tạo, không remount. Một cái bẫy đã gặp khi thử: gp3 giới hạn tỉ lệ IOPS/dung lượng tối đa 500/GB, nên 4000 IOPS đòi volume ≥ 8GB — đặt 4000 trên volume 4GB thì ModifyVolume trả Iops to volume size ratio too high. VolumeAttributesClass là kênh chuẩn để tinh chỉnh hiệu năng storage theo tải mà không phải migrate dữ liệu.
VolumeGroupSnapshot: GA không có nghĩa chạy ở mọi nơi
Tính năng thứ ba, VolumeGroupSnapshot (GA ở 1.36), chụp snapshot nhất quán nhiều PVC cùng một thời điểm — quan trọng cho ứng dụng trải dữ liệu trên nhiều volume (database có data + WAL riêng ổ). CRD của nó đã có sẵn trên cụm từ Bài 44 (external-snapshotter v8.2.0 cài kèm nhóm groupsnapshot.storage.k8s.io):
kubectl get crd | grep groupsnapshot
volumegroupsnapshotclasses.groupsnapshot.storage.k8s.io
volumegroupsnapshotcontents.groupsnapshot.storage.k8s.io
volumegroupsnapshots.groupsnapshot.storage.k8s.io
Nhưng trên cụm này nó không dùng được, và lý do đáng học hơn bản thân tính năng: group snapshot đòi CSI driver hiện thực CreateVolumeGroupSnapshot, mà AWS EBS CSI driver không có — vì AWS EBS không có API snapshot nhóm nhất quán ở tầng dưới (mỗi EBS snapshot là độc lập một volume). Đây là điểm lặp lại từ Bài 43–44: một tính năng GA trong API Kubernetes vẫn cần CSI driver bên dưới cài đặt khả năng đó. CRD có mặt, snapshot-controller có thể bật cờ --enable-volume-group-snapshots, nhưng nếu driver không trả lời được RPC nhóm thì không có gì xảy ra. Trên driver có hỗ trợ (một số driver SAN/NetApp/Ceph), cơ chế giống VolumeSnapshot của Bài 44 nhưng gom nhiều PVC theo label vào một VolumeGroupSnapshot. Trên EBS thì vẫn phải chụp từng PVC một (Bài 44) và tự lo tính nhất quán (vd fsfreeze hoặc dừng ghi trước khi chụp).
🧹 Dọn dẹp
kubectl delete namespace stor-demo
kubectl delete volumeattributesclass ebs-silver ebs-gold
PVC dùng StorageClass ebs-sc (reclaim Delete), nên xóa namespace là EBS volume cũng bị xóa trên AWS — kiểm aws ec2 describe-volumes trả InvalidVolume.NotFound. Giữ EBS CSI + snapshot-controller (hạ tầng Part IX). Manifest ở github.com/nghiadaulau/kubernetes-from-scratch, thư mục 70-storage-v136.
Tổng kết
v1.36 thêm ba mảnh storage. OCI image volume (stable) mount nội dung một OCI image làm volume read-only (volumes[].image.reference) — ta thấy rootfs của image kia ở /oci, hữu ích đóng gói config/model/asset có version. VolumeAttributesClass (GA) đổi tham số volume đang dùng không tái tạo: chuyển PVC từ ebs-silver sang ebs-gold, external-resizer gọi CSI ModifyVolume, và EBS volume đổi IOPS 3000→4000 + throughput 125→250 trên AWS mà pod không gián đoạn (nhớ tỉ lệ IOPS/GB tối đa 500). VolumeGroupSnapshot (GA) chụp nhất quán nhiều PVC — CRD đã có từ Bài 44 nhưng không chạy trên cụm này vì EBS CSI không hiện thực CreateVolumeGroupSnapshot; bài học lặp lại từ Part IX: tính năng GA trong API Kubernetes vẫn phụ thuộc khả năng CSI driver bên dưới.
Bài 71 đóng Part XIV với hai tính năng vận hành/bảo mật của v1.36: query log node thẳng qua kubelet (không cần đăng nhập SSH từng máy), và siết quyền API kubelet ở mức chi tiết — cả hai chạm tới những thành phần ta tự dựng ở Part I.