All Products
Search
Document Center

Container Service for Kubernetes:Migrasi aplikasi stateful dengan cloud disk lintas zona

Last Updated:Jun 19, 2026

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:

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:

  1. Pemeriksaan Awal (Precheck): Memverifikasi bahwa aplikasi sedang berjalan dan mengidentifikasi disk yang akan dimigrasikan. Berhenti jika precheck gagal.

  2. Skalakan ke nol: Menskalakan StatefulSet ke 0 replika, sehingga menjeda aplikasi.

  3. Buat snapshot: Membuat snapshot akses instan untuk semua disk yang dipasang. Snapshot bersifat agnostik terhadap zona.

  4. Provisi disk baru: Setelah memastikan snapshot tersedia, membuat disk baru di zona target dengan data yang sama.

  5. Bangun ulang PVC dan PV: Membangun ulang PVC dengan nama yang sama dan PV-nya yang sesuai, terikat ke disk baru.

  6. Pulihkan replika: Memulihkan jumlah replika semula. Replika terikat ke PVC yang telah dibangun ulang dan memasang disk baru.

  7. (Opsional) Hapus sumber daya asli: Setelah memastikan kesehatan aplikasi, hapus PV dan disk asli. Lihat penagihan block storage.

Penting

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 ModifyDiskSpec pada 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 1: Aktifkan kontroler penyimpanan

Patch ConfigMap untuk mengaktifkan kontroler penyimpanan:

kubectl patch configmap/storage-operator \
  -n kube-system \
  --type merge \
  -p '{"data":{"storage-controller":"{\"imageRep\":\"acs/storage-controller\",\"imageTag\":\"\",\"install\":\"true\",\"template\":\"/acs/templates/storage-controller/install.yaml\",\"type\":\"deployment\"}"}}'

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

Node zones

Langkah 1: Buat StatefulSet dengan disk ESSD

Buat StatefulSet uji dengan disk ESSD. Lewati langkah ini jika Anda sudah memiliki StatefulSet yang akan dimigrasikan.

  1. 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>

  2. Verifikasi bahwa kedua Pod sedang berjalan:

    kubectl get pod -o wide -l app=nginx

    Output 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).

Penting

Pastikan zona target memiliki sumber daya node yang cukup dan mendukung disk ESSD.

  1. 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
  2. Periksa status migrasi:

    Jika statusnya FAILED, lihat FAQ untuk troubleshooting.
    kubectl describe cso migrate-to-b | grep Status

    Status SUCCESS mengonfirmasi migrasi selesai:

      Status:
        Status:   SUCCESS
  3. Verifikasi penempatan Pod setelah migrasi:

    kubectl get pod -o wide -l app=nginx

    Kedua Pod kini berada di node cn-shanghai.192.168.5.245 di 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>
  4. 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 retainSourcePV bernilai "true").

Contoh 2: Penyebaran multi-zona

Sebarkan Pod ke dua zona (zona B dan G) untuk meningkatkan ketersediaan.

  1. 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
  2. Periksa status migrasi:

    Jika statusnya FAILED, lihat FAQ untuk troubleshooting.
    kubectl describe cso migrate | grep Status

    Status SUCCESS mengonfirmasi migrasi selesai:

      Status:
        Status:   SUCCESS
  3. Verifikasi penempatan Pod setelah migrasi:

    kubectl get pod -o wide -l app=nginx

    Pod 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>
  4. 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.