Komponen storage-operator mengotomatiskan migrasi lintas zona dan penyebaran multi-zona untuk StatefulSet yang menggunakan volume disk. Jika terjadi pengecualian, komponen ini memulihkan aplikasi di zona asal melalui mekanisme pemeriksaan awal (precheck) dan rollback. Topik ini menjelaskan cara melakukan migrasi aplikasi stateful yang menggunakan volume disk antar zona.
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 | Zona saat ini tidak memiliki kapasitas yang cukup untuk mendukung operasi berkelanjutan atau scale-out. |
NAS dan OSS mendukung penggunaan lintas zona dan multi-mount. Disk bersifat terikat zona—tidak dapat dipindahkan antar zona atau menggunakan ulang Persistent Volume Claim (PVC) dan Persistent Volume (PV) yang sudah ada. Jika StatefulSet Anda menggunakan volume disk, Anda harus membuat disk baru di zona tujuan dari snapshot.
Batasan utama
Sebelum memulai, perhatikan batasan berikut:
Diperlukan gangguan bisnis: Migrasi lintas zona menskalakan StatefulSet menjadi 0 replika sebelum migrasi, lalu memulihkan semua replika sekaligus setelah migrasi disk selesai—bukan sebagai pembaruan bergulir (rolling update). Rencanakan downtime. Durasi tergantung pada jumlah replika, waktu startup kontainer, dan kapasitas disk yang digunakan.
Disk ESSD wajib digunakan: Semua penyimpanan yang digunakan oleh StatefulSet harus berupa disk ESSD. Fitur migrasi menggunakan snapshot akses instan (instant access snapshots) untuk meminimalkan waktu pembuatan snapshot, yang hanya didukung oleh disk ESSD. Untuk informasi lebih lanjut, lihat Snapshot instant access.
Persyaratan zona tujuan: Zona tujuan 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 tersebut lintas zona.
Cara kerja
Migrasi lintas zona mengandalkan snapshot disk dan menggunakan snapshot akses instan untuk meminimalkan waktu pembuatan snapshot. Untuk informasi lebih lanjut, lihat Pengenalan snapshot dan Penagihan snapshot.
Komponen storage-operator menjalankan langkah-langkah berikut:
Pemeriksaan awal (Precheck): Memverifikasi bahwa aplikasi berjalan dengan baik dan mengidentifikasi disk yang akan dimigrasikan. Migrasi dihentikan jika pemeriksaan awal gagal.
Skala ke nol: Menskalakan StatefulSet menjadi 0 replika, sehingga menjeda aplikasi.
Buat snapshot: Membuat snapshot akses instan untuk semua disk yang dipasang. Snapshot bersifat agnostik terhadap zona dan dapat digunakan di zona mana pun.
Provisi disk baru: Setelah memastikan snapshot tersedia, membuat disk baru di zona tujuan dengan data yang sama.
Bangun ulang PVC dan PV: Membangun ulang PVC dengan nama yang sama dan PV-nya yang sesuai, yang terikat ke disk baru.
Pulihkan replika: Memulihkan StatefulSet ke jumlah replika semula. Replika secara otomatis terikat ke PVC yang telah dibangun ulang dan memasang disk baru.
(Opsional) Hapus sumber daya asli: Setelah memastikan aplikasi dalam kondisi sehat, hapus PV dan disk asli. Untuk detail penagihan disk, lihat Penagihan Block Storage.
Setiap langkah setelah pemeriksaan awal memiliki strategi rollback tertentu. Pastikan StatefulSet berjalan dengan benar setelah migrasi sebelum menghapus disk asli—hal ini memastikan aplikasi dapat memasang ulang disk asli jika diperlukan rollback.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Memiliki 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 di kluster. Untuk instruksi instalasi, lihat Kelola komponen storage-operator.
Komponen csi-plugin dan csi-provisioner terinstal, dengan csi-provisioner menggunakan versi non-managed.
Jika versi managed csi-provisioner saat ini terinstal, uninstal dan instal versi non-managed. Setelah beralih, restart kontroler penyimpanan:
kubectl delete pod -n kube-system <storage-controller-pod-name>(Hanya untuk kluster khusus ACK) Peran RAM worker dan peran RAM master kluster Anda harus memiliki izin untuk memanggil operasi
ModifyDiskSpecdari API Elastic Compute Service (ECS). Untuk instruksi, lihat Buat kebijakan kustom. <details> <summary>Lihat kebijakan RAM yang diperlukan</summary>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 antar zona
Langkah 2: Buat tugas migrasi
Buat sumber daya ContainerStorageOperator untuk menentukan tugas migrasi:
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"
EOFParameter:
| Parameter | Wajib | Bawaan | Deskripsi |
|---|---|---|---|
operationType | Wajib | — | Atur ke APPMIGRATE untuk migrasi aplikasi stateful. |
stsName | Wajib | — | Nama StatefulSet yang akan dimigrasikan. Hanya satu StatefulSet yang dapat ditentukan. Jika beberapa tugas migrasi diterapkan, komponen akan memigrasikannya secara berurutan sesuai urutan penerapan. |
stsNamespace | Wajib | — | Namespace StatefulSet. |
targetZone | Wajib | — | Daftar zona tujuan yang dipisahkan koma, contohnya cn-beijing-h,cn-beijing-j. Jika disk sudah berada di salah satu zona yang tercantum, disk tersebut tidak dimigrasikan. Jika beberapa zona tercantum, disk yang tersisa akan didistribusikan ke zona-zona tersebut sesuai urutan daftar. |
stsType | Opsional | kube | Tipe StatefulSet. Nilai yang valid: kube (StatefulSet native) dan kruise (Advanced StatefulSet yang disediakan oleh OpenKruise). |
checkWaitingMinutes | Opsional | "1" | Interval polling (menit) untuk memeriksa ketersediaan replika setelah migrasi. Tingkatkan nilai ini untuk StatefulSet dengan banyak replika, pull image lambat, atau waktu startup lama agar tidak terjadi rollback prematur. |
healthDurationMinutes | Opsional | "0" | Setelah jumlah replika yang tersedia sesuai dengan jumlah yang diharapkan, sistem menunggu selama beberapa menit sebelum menjalankan pemeriksaan kesehatan sekunder. Atur ke "0" untuk melewatkan pemeriksaan sekunder. |
snapshotRetentionDays | Opsional | "1" | Periode retensi untuk snapshot akses instan yang dibuat selama migrasi. Nilai yang valid: "1" (satu hari) dan "-1" (permanen). |
retainSourcePV | Opsional | "false" | Apakah disk dan PV asli dipertahankan setelah migrasi. "false" menghapus keduanya. "true" mempertahankannya — disk tetap terlihat di Konsol ECS dan 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 coba dengan disk ESSD. Lewati langkah ini jika Anda sudah memiliki StatefulSet yang akan dimigrasikan.
Terapkan StatefulSet: <details> <summary>Lihat YAML untuk StatefulSet Nginx</summary>
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 tujuan (zona B dalam contoh ini).
Sebelum migrasi, pastikan zona tujuan memiliki sumber daya node yang cukup dan spesifikasi node 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 tujuan untuk migrasi. healthDurationMinutes: "1" # Tunggu 1 menit setelah migrasi untuk memastikan aplikasi berjalan dengan baik. snapshotRetentionDays: "-1" # Pertahankan snapshot secara permanen hingga dihapus secara manual. retainSourcePV: "true" # Pertahankan disk dan PV asli. EOFPeriksa status migrasi:
Jika statusnya
FAILED, lihat FAQ untuk troubleshooting.kubectl describe cso migrate-to-b | grep StatusStatus
SUCCESSmenegaskan migrasi telah selesai:Status: Status: SUCCESSVerifikasi 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:
Halaman Snapshots: 2 snapshot baru dibuat dengan retensi permanen.
Halaman Block Storage: 2 disk baru di zona B; 2 disk asli di zona M dipertahankan (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 tujuan. Beberapa zona memicu penyebaran otomatis. healthDurationMinutes: "1" # Tunggu 1 menit setelah migrasi untuk memastikan aplikasi berjalan dengan baik. snapshotRetentionDays: "-1" # Pertahankan snapshot secara permanen hingga dihapus secara manual. retainSourcePV: "true" # Pertahankan disk dan PV asli. EOFPeriksa status migrasi:
Jika statusnya
FAILED, lihat FAQ untuk troubleshooting.kubectl describe cso migrate | grep StatusStatus
SUCCESSmenegaskan migrasi telah selesai:Status: Status: SUCCESSVerifikasi 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:
Halaman Snapshots: 2 snapshot baru dibuat dengan retensi permanen.
Halaman Block Storage: 2 disk baru tersebar di zona B dan G; 2 disk asli di zona M dipertahankan.
FAQ
Jika tugas migrasi mengembalikan status FAILED, jalankan perintah berikut untuk mendapatkan pesan error:
kubectl describe cso <ContainerStorageOperator-name> | grep Message -A 1Contoh output:
Message:
Consume: failed to get target pvc, err: no pvc mounted in statefulset or no pvc need to migrated webError ini berarti komponen tidak dapat menemukan PVC yang akan dimigrasikan. Penyebab umum:
StatefulSet tidak memiliki penyimpanan yang dipasang.
Semua disk sudah berada di zona tujuan—migrasi tidak diperlukan.
Komponen tidak dapat mengambil informasi PVC.
Atasi masalah berdasarkan pesan error, lalu terapkan ulang tugas migrasi.