All Products
Search
Document Center

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

Last Updated:Mar 26, 2026

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

SkenarioDeskripsi
Perubahan perencanaan zonaPindahkan beban kerja ke zona berbeda karena pembaruan infrastruktur atau kapasitas.
Penyebaran multi-zonaSebarkan replika dan disk-nya ke beberapa zona untuk meningkatkan ketersediaan.
Batasan sumber dayaZona 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:

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:

  1. Pemeriksaan awal (Precheck): Memverifikasi bahwa aplikasi berjalan dengan baik dan mengidentifikasi disk yang akan dimigrasikan. Migrasi dihentikan jika pemeriksaan awal gagal.

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

  3. Buat snapshot: Membuat snapshot akses instan untuk semua disk yang dipasang. Snapshot bersifat agnostik terhadap zona dan dapat digunakan di zona mana pun.

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

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

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

  7. (Opsional) Hapus sumber daya asli: Setelah memastikan aplikasi dalam kondisi sehat, hapus PV dan disk asli. Untuk detail penagihan disk, lihat Penagihan Block Storage.

Penting

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

Terapkan patch pada 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 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"
EOF

Parameter:

ParameterWajibBawaanDeskripsi
operationTypeWajibAtur ke APPMIGRATE untuk migrasi aplikasi stateful.
stsNameWajibNama StatefulSet yang akan dimigrasikan. Hanya satu StatefulSet yang dapat ditentukan. Jika beberapa tugas migrasi diterapkan, komponen akan memigrasikannya secara berurutan sesuai urutan penerapan.
stsNamespaceWajibNamespace StatefulSet.
targetZoneWajibDaftar 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.
stsTypeOpsionalkubeTipe StatefulSet. Nilai yang valid: kube (StatefulSet native) dan kruise (Advanced StatefulSet yang disediakan oleh OpenKruise).
checkWaitingMinutesOpsional"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.
healthDurationMinutesOpsional"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.
snapshotRetentionDaysOpsional"1"Periode retensi untuk snapshot akses instan yang dibuat selama migrasi. Nilai yang valid: "1" (satu hari) dan "-1" (permanen).
retainSourcePVOpsional"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.

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

  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 tujuan (zona B dalam contoh ini).

Penting

Sebelum migrasi, pastikan zona tujuan memiliki sumber daya node yang cukup dan spesifikasi node 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 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.
    EOF
  2. Periksa status migrasi:

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

    Status SUCCESS menegaskan migrasi telah 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:

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

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

    Status SUCCESS menegaskan migrasi telah 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:

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

Contoh output:

  Message:
    Consume: failed to get target pvc, err: no pvc mounted in statefulset or no pvc need to migrated web

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