Add-on storage-operator mengotomatisasi migrasi disk lintas zona dan penyebaran multi-zona untuk StatefulSet. Jika terjadi error selama migrasi, add-on memulihkan aplikasi di zona asal melalui Pemeriksaan Awal (precheck) dan rollback untuk memastikan ketersediaan layanan.
Kasus penggunaan
| Skenario | Deskripsi |
|---|---|
| Perubahan perencanaan zona | Pindahkan beban kerja ke zona berbeda karena pembaruan infrastruktur atau kapasitas. |
| Penyebaran multi-zona | Sebarkan replika dan disk-nya ke beberapa zona untuk meningkatkan ketersediaan. |
| Batasan sumber daya | Kapasitas tidak mencukupi di zona saat ini untuk operasi berkelanjutan atau skala keluar. |
NAS dan OSS mendukung lintas zona dan multi-mount. Disk bersifat terikat zona—tidak dapat berpindah lintas zona atau menggunakan kembali Persistent Volume Claim (PVC) dan Persistent Volume (PV) yang ada. Buat disk baru di zona target dari Snapshot.
Batasan utama
Tinjau batasan berikut sebelum migrasi:
-
Diperlukan gangguan bisnis: Untuk memastikan konsistensi data, migrasi menskalakan StatefulSet ke 0 replika, lalu memulihkan semuanya sekaligus setelah migrasi disk—bukan pembaruan bergulir (rolling update). Rencanakan downtime. Durasi tergantung pada jumlah replika, waktu startup kontainer, dan kapasitas disk.
-
Disk ESSD wajib digunakan: Semua penyimpanan yang digunakan oleh StatefulSet harus berupa disk ESSD. Migrasi menggunakan snapshot akses instan, yang hanya mendukung disk ESSD.
-
Persyaratan zona target: Zona target harus mendukung disk ESSD, dan kluster harus memiliki node di zona tersebut yang tersedia untuk penjadwalan.
Jika aplikasi Anda menggunakan disk non-ESSD, lakukan salah satu hal berikut sebelum migrasi:
-
Secara manual buat snapshot untuk satu volume disk dan bangun ulang disk lintas zona.
Cara kerja
Migrasi lintas zona membuat Snapshot dari disk sumber dan menggunakan akses instan untuk meminimalkan waktu pembuatan. Lihat penagihan Snapshot.
storage-operator menjalankan langkah-langkah berikut:
-
Pemeriksaan Awal (Precheck): Memverifikasi bahwa aplikasi sedang berjalan dan mengidentifikasi disk yang akan dimigrasikan. Berhenti jika precheck gagal.
-
Skalakan ke nol: Menskalakan StatefulSet ke 0 replika, sehingga menjeda aplikasi.
-
Buat snapshot: Membuat snapshot akses instan untuk semua disk yang dipasang. Snapshot bersifat agnostik terhadap zona.
-
Provisi disk baru: Setelah memastikan snapshot tersedia, membuat disk baru di zona target dengan data yang sama.
-
Bangun ulang PVC dan PV: Membangun ulang PVC dengan nama yang sama dan PV-nya yang sesuai, terikat ke disk baru.
-
Pulihkan replika: Memulihkan jumlah replika semula. Replika terikat ke PVC yang telah dibangun ulang dan memasang disk baru.
-
(Opsional) Hapus sumber daya asli: Setelah memastikan kesehatan aplikasi, hapus PV dan disk asli. Lihat penagihan block storage.
Setiap langkah setelah precheck memiliki strategi rollback. Pastikan StatefulSet berjalan dengan benar setelah migrasi sebelum menghapus disk asli—hal ini memastikan aplikasi dapat memasang kembali disk asli jika diperlukan rollback.
Prasyarat
Pastikan hal-hal berikut:
-
Kluster yang menjalankan Kubernetes 1.20 atau lebih baru dengan driver Container Storage Interface (CSI) terinstal
-
storage-operator v1.26.2-1de13b6-aliyun atau lebih baru terinstal
-
csi-plugin dan csi-provisioner terinstal, dengan csi-provisioner menggunakan versi non-managed
Jika versi managed terinstal, beralihlah ke versi non-managed. Lalu restart kontroler penyimpanan:
kubectl delete pod -n kube-system <storage-controller-pod-name> -
(Hanya untuk cluster khusus ACK) Peran RAM worker dan master memiliki izin
ModifyDiskSpecpada API ECS. Lihat Buat kebijakan kustom. Lihat kebijakan RAM yang diperlukan:Kluster ACK yang dikelola tidak memerlukan izin
ModifyDiskSpec.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:CreateSnapshot", "ecs:DescribeSnapshot", "ecs:DeleteSnapshot", "ecs:ModifyDiskSpec", "ecs:DescribeTaskAttribute" ], "Resource": "*" } ] }</details>
Migrasi StatefulSet lintas zona
Langkah 2: Buat tugas migrasi
Buat sumber daya ContainerStorageOperator:
cat <<EOF | kubectl apply -f -
apiVersion: storage.alibabacloud.com/v1beta1
kind: ContainerStorageOperator
metadata:
name: default
spec:
operationType: APPMIGRATE
operationParams:
stsName: web
stsNamespace: default
stsType: kube
targetZone: cn-beijing-h,cn-beijing-j
checkWaitingMinutes: "1"
healthDurationMinutes: "1"
snapshotRetentionDays: "2"
retainSourcePV: "true"
EOF
Parameter:
| Parameter | Wajib | Bawaan | Deskripsi |
|---|---|---|---|
operationType |
Wajib | — | Atur ke APPMIGRATE untuk migrasi aplikasi stateful. |
stsName |
Wajib | — | Nama StatefulSet yang akan dimigrasikan. Hanya satu StatefulSet per tugas. Beberapa tugas dijalankan secara berurutan sesuai urutan penerapan. |
stsNamespace |
Wajib | — | Namespace dari StatefulSet. |
targetZone |
Wajib | — | Zona target yang dipisahkan koma, misalnya cn-beijing-h,cn-beijing-j. Disk yang sudah berada di zona yang tercantum akan dilewati. Beberapa zona menyebarkan disk yang tersisa sesuai urutan daftar. |
stsType |
Opsional | kube |
Tipe StatefulSet. Nilai yang valid: kube (native) dan kruise (Advanced StatefulSet OpenKruise). |
checkWaitingMinutes |
Opsional | "1" |
Interval polling (menit) untuk pemeriksaan ketersediaan replika setelah migrasi. Tingkatkan untuk StatefulSet besar atau startup lambat agar tidak terjadi rollback prematur. |
healthDurationMinutes |
Opsional | "0" |
Waktu tunggu (menit) setelah replika mencapai jumlah yang diharapkan sebelum pemeriksaan kesehatan sekunder. Atur ke "0" untuk melewati. |
snapshotRetentionDays |
Opsional | "1" |
Periode retensi untuk snapshot akses instan. Nilai yang valid: "1" (satu hari) dan "-1" (permanen). |
retainSourcePV |
Opsional | "false" |
Apakah akan menyimpan disk dan PV asli setelah migrasi. "false" menghapus keduanya. "true" menyimpannya — disk tetap berada di Konsol ECS, PV masuk ke status Released. |
Contoh
Contoh berikut menggunakan kluster ACK Pro dengan node di tiga zona:
-
Zona B: cn-shanghai.192.168.5.245
-
Zona G: cn-shanghai.192.168.2.214
-
Zona M: cn-shanghai.192.168.3.236, cn-shanghai.192.168.3.237
Langkah 1: Buat StatefulSet dengan disk ESSD
Buat StatefulSet uji dengan disk ESSD. Lewati langkah ini jika Anda sudah memiliki StatefulSet yang akan dimigrasikan.
-
Terapkan StatefulSet. Lihat YAML untuk StatefulSet Nginx:
cat << EOF | kubectl apply -f - apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www labels: app: nginx spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "alicloud-disk-essd" resources: requests: storage: 20Gi EOF</details>
-
Verifikasi bahwa kedua Pod sedang berjalan:
kubectl get pod -o wide -l app=nginxOutput menunjukkan kedua Pod dijadwalkan ke zona M (penempatan aktual tergantung pada penjadwal):
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-0 1/1 Running 0 2m 192.168.3.243 cn-shanghai.192.168.3.237 <none> <none> web-1 1/1 Running 0 2m 192.168.3.246 cn-shanghai.192.168.3.236 <none> <none>
Langkah 2: Buat tugas migrasi
Contoh 1: Migrasi lintas zona
Migrasikan semua Pod ke satu zona target (zona B dalam contoh ini).
Pastikan zona target memiliki sumber daya node yang cukup dan mendukung disk ESSD.
-
Buat tugas migrasi:
cat <<EOF | kubectl apply -f - apiVersion: storage.alibabacloud.com/v1beta1 kind: ContainerStorageOperator metadata: name: migrate-to-b spec: operationType: APPMIGRATE operationParams: stsName: web stsNamespace: default stsType: kube targetZone: cn-shanghai-b # Zona target untuk migrasi. healthDurationMinutes: "1" # Tunggu 1 menit setelah migrasi untuk memastikan aplikasi berjalan dengan baik. snapshotRetentionDays: "-1" # Simpan snapshot secara permanen hingga dihapus secara manual. retainSourcePV: "true" # Simpan disk dan PV asli. EOF -
Periksa status migrasi:
Jika statusnya
FAILED, lihat FAQ untuk troubleshooting.kubectl describe cso migrate-to-b | grep StatusStatus
SUCCESSmengonfirmasi migrasi selesai:Status: Status: SUCCESS -
Verifikasi penempatan Pod setelah migrasi:
kubectl get pod -o wide -l app=nginxKedua Pod kini berada di node
cn-shanghai.192.168.5.245di zona B:NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-0 1/1 Running 0 2m36s 192.168.5.250 cn-shanghai.192.168.5.245 <none> <none> web-1 1/1 Running 0 2m14s 192.168.5.2 cn-shanghai.192.168.5.245 <none> <none> -
Konfirmasi hasilnya di Konsol ECS:
-
Laman Snapshots: 2 snapshot baru dibuat dengan retensi permanen.
-
Laman Block Storage: 2 disk baru di zona B; 2 disk asli di zona M disimpan (karena
retainSourcePVbernilai"true").
-
Contoh 2: Penyebaran multi-zona
Sebarkan Pod ke dua zona (zona B dan G) untuk meningkatkan ketersediaan.
-
Buat tugas migrasi:
cat <<EOF | kubectl apply -f - apiVersion: storage.alibabacloud.com/v1beta1 kind: ContainerStorageOperator metadata: name: migrate spec: operationType: APPMIGRATE operationParams: stsName: web stsNamespace: default stsType: kube targetZone: cn-shanghai-b,cn-shanghai-g # Zona target. Beberapa zona memicu penyebaran otomatis. healthDurationMinutes: "1" # Tunggu 1 menit setelah migrasi untuk memastikan aplikasi berjalan dengan baik. snapshotRetentionDays: "-1" # Simpan snapshot secara permanen hingga dihapus secara manual. retainSourcePV: "true" # Simpan disk dan PV asli. EOF -
Periksa status migrasi:
Jika statusnya
FAILED, lihat FAQ untuk troubleshooting.kubectl describe cso migrate | grep StatusStatus
SUCCESSmengonfirmasi migrasi selesai:Status: Status: SUCCESS -
Verifikasi penempatan Pod setelah migrasi:
kubectl get pod -o wide -l app=nginxPod tersebar di zona B (
cn-shanghai.192.168.5.245) dan zona G (cn-shanghai.192.168.2.214):NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-0 1/1 Running 0 4m59s 192.168.2.215 cn-shanghai.192.168.2.214 <none> <none> web-1 1/1 Running 0 4m38s 192.168.5.250 cn-shanghai.192.168.5.245 <none> <none> -
Konfirmasi hasilnya di Konsol ECS:
-
Laman Snapshots: 2 snapshot baru dibuat dengan retensi permanen.
-
Laman Block Storage: 2 disk baru tersebar di zona B dan G; 2 disk asli di zona M disimpan.
-
FAQ
Jika tugas migrasi mengembalikan status FAILED, ambil pesan error-nya:
kubectl describe cso <ContainerStorageOperator-name> | grep Message -A 1
Contoh output:
Message:
Consume: failed to get target pvc, err: no pvc mounted in statefulset or no pvc need to migrated web
Komponen tidak dapat menemukan PVC untuk dimigrasikan. Penyebab umum:
-
StatefulSet tidak memiliki penyimpanan yang dipasang.
-
Semua disk sudah berada di zona target—migrasi tidak diperlukan.
-
Komponen tidak dapat mengambil informasi PVC.
Atasi masalah berdasarkan pesan error, lalu terapkan ulang tugas migrasi.