All Products
Search
Document Center

Container Service for Kubernetes:Konfigurasi ketersediaan tinggi untuk volume disk

Last Updated:Jun 22, 2026

Saat menerapkan StatefulSet dan memasang volume disk, startup aplikasi dapat gagal karena masalah seperti konfigurasi zona ketersediaan yang salah atau ketidakcocokan tipe disk. Topik ini menyediakan rekomendasi konfigurasi untuk penerapan multi-zona ketersediaan guna mencegah masalah infrastruktur tersebut dan meminimalkan gangguan rilis.

Latar Belakang

Kemampuan orkestrasi kontainer Kubernetes yang andal mempermudah pembuatan aplikasi berstatus berskala besar (StatefulSet). Namun, meskipun Kubernetes menyederhanakan penerapan, ia juga menyembunyikan detail perangkat keras yang mendasarinya. Abstraksi ini dapat menyebabkan perilaku tak terduga jika Anda tidak memahami topologi dan keterbatasan infrastruktur yang mendasarinya.

  • Dalam kluster yang mencakup beberapa zona ketersediaan, Pod yang ditujukan untuk zona ketersediaan A dijadwalkan ke node di zona ketersediaan B.

  • Terjadi error saat membuat volume disk, misalnya, PV dinamis gagal disediakan dengan error InvalidDataDiskCatagory.NotSupported.

  • Pod gagal memasang volume dan mengembalikan error: The instanceType of the specified instance does not support this disk category.

  • Pod gagal dijadwalkan dan mengembalikan error: 0/x node are available, x nodes had volume node affinity conflict.

Masalah-masalah ini dapat mengganggu atau menghentikan rilis aplikasi. Topik ini menyediakan rekomendasi konfigurasi untuk ketersediaan tinggi guna mengurangi risiko kegagalan tersebut.

Konfigurasi

Tujuan konfigurasi

  • Untuk StatefulSet, kami merekomendasikan penggunaan disk untuk penyimpanan persisten. Dibandingkan dengan NAS, disk menawarkan stabilitas lebih tinggi dan bandwidth transfer data yang lebih baik.

  • Pastikan kluster mencakup beberapa zona ketersediaan dengan sumber daya komputasi dan penyimpanan yang cukup untuk memenuhi permintaan.

  • Kluster dapat secara otomatis melakukan scale-out node untuk memenuhi permintaan penjadwalan ketika seluruh zona ketersediaan menjadi tidak tersedia.

  • Gunakan StorageClass yang sangat tersedia untuk mencegah kegagalan pemasangan disk.

  • Pastikan Pod tersebar merata di seluruh node dan zona ketersediaan.

Konfigurasi kelompok node

  • Gunakan satu zona ketersediaan untuk setiap kelompok node.

    • Saat menambahkan zona ketersediaan, buat kelompok node baru untuk zona tersebut. Untuk informasi selengkapnya, lihat Buat dan kelola kelompok node.

    • Saat membuat kelompok node, pastikan setiap kelompok node dipetakan ke zona ketersediaan yang berbeda. Gunakan nama kelompok node untuk membedakan antar zona ketersediaan.

  • Aktifkan auto scaling untuk kelompok node. Untuk informasi selengkapnya, lihat Aktifkan auto scaling node.

    Jika tidak ada node yang tersedia di suatu zona ketersediaan, sistem secara otomatis membuat node baru di zona tersebut untuk menjadwalkan Pod, seperti yang ditunjukkan dalam log berikut.

    Warning  FailedScheduling     3m26s                xxx                0/2 nodes are available: 2 node(s) had volume node affinity conflict.
    Warning  FailedScheduling     3m26s                xxx                0/2 nodes are available: 2 node(s) had volume node affinity conflict.
    Normal   Scheduled            14s                  xxx                Successfully assigned default/web-csi-available-test4-1 to cn-wulanchabu.172.xxx
    Warning  FailedScheduling     86s                  xxx                0/3 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate, 2 node(s) had volume node affinity conflict.
    Warning  FailedScheduling     76s                  xxx                0/3 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate, 2 node(s) had volume node affinity conflict.
    Warning  FailedScheduling     25s                  xxx                0/3 nodes are available: 3 node(s) had volume node affinity conflict.
    Normal   TriggeredScaleUp     3m8s                 cluster-autoscaler   pod triggered scale-up: [xxx 0->1 (max: 10)}]
    Normal   NotTriggerScaleUp    2m39s                cluster-autoscaler   pod didn't trigger scale-up (it wouldn't fit if a new node is added): 1 can't increase node group size
    Normal   TriggeredScaleUp     37s                  cluster-autoscaler   pod triggered scale-up: [{xxx 1->2 (max: 10)}]
    Normal   SuccessfulAttachVolume 15s                attachdetach-controller  AttachVolume.Attach succeeded for                         i3uqre"
    Warning  FailedMount          9s (x3 over 11s)     kubelet              MountVolume.MountDevice failed for volume "xxx" : rpc error: code = Aborted desc = NodeStageVolume: Attach volume: d-xxx
             with error: rpc error: code = Aborted desc = NodeStageVolume: Previous attach action is still in process: d xxx
    Normal   Pulling              3s                   kubelet              Pulling image "nginx"
  • Gunakan tipe instans ECS yang sama di semua zona ketersediaan. Jika hal ini tidak memungkinkan, gunakan tipe instans yang semuanya mendukung kategori penyimpanan blok yang sama.

    Beberapa tipe disk tidak dapat dipasang pada tipe instans ECS tertentu. Bahkan jika Pod dijadwalkan di zona ketersediaan yang benar, Pod tersebut dapat gagal memulai karena error pemasangan disk jika node tidak mendukung tipe disk yang diminta.

  • Konfigurasikan taint untuk semua kelompok node guna mencegah beban kerja yang tidak diinginkan dijadwalkan pada node tersebut dan berdampak pada aplikasi Anda. Saat membuat kelompok node, Anda dapat mengonfigurasi taint untuk nodenya di bagian Taints. Misalnya, atur kunci ke app, nilai ke sts, dan efek ke NoSchedule. Hal ini mencegah Pod tanpa toleransi yang sesuai dijadwalkan pada node di kelompok node ini.

Konfigurasi kluster

  • Pastikan versi kluster Anda adalah 1.20 atau lebih baru.

  • Pastikan versi plugin CSI Anda adalah 1.22 atau lebih baru. Untuk informasi selengkapnya, lihat Kelola plugin CSI.

  • Gunakan StorageClass dengan ketersediaan tinggi.

    Contoh berikut menunjukkan konfigurasi YAML:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-disk-topology-alltype
    parameters:
      type: cloud_essd,cloud_ssd,cloud_efficiency
    provisioner: diskplugin.csi.alibabacloud.com
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    allowedTopologies:
    - matchLabelExpressions:
      - key: topology.diskplugin.csi.alibabacloud.com/zone
        values:
        - cn-beijing-a
        - cn-beijing-b

    Parameter utama:

    • type: cloud_essd,cloud_ssd,cloud_efficiency: Menentukan daftar prioritas tipe disk sebagai mekanisme fallback. Plugin CSI mencoba membuat disk dengan mencoba tipe yang ditentukan secara berurutan: ESSD, SSD standar, lalu disk ultra. Pendekatan ini mencegah kegagalan startup Pod akibat stok disk tidak mencukupi untuk tipe tertentu.

    • volumeBindingMode: WaitForFirstConsumer: Menunda pembuatan disk hingga Pod dijadwalkan ke node tertentu. Hal ini memastikan disk dibuat di zona ketersediaan yang sama dengan node, sehingga mencegah kegagalan startup Pod akibat ketidaksesuaian zona.

    • allowedTopologies: Membatasi penyediaan volume hanya pada zona ketersediaan tertentu. Saat volumeBindingMode diatur ke WaitForFirstConsumer, penjadwal menempatkan Pod di salah satu zona ketersediaan yang ditentukan, sehingga memastikan disk dapat disediakan dengan sukses.

Konfigurasi aplikasi

Templat berikut menunjukkan konfigurasi StatefulSet standar. Anda dapat menyesuaikannya sesuai kebutuhan.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: "mysql"
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      topologySpreadConstraints:
      - labelSelector:
          matchLabels:
            app: mysql
        maxSkew: 1
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: ScheduleAnyway
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "mysql"
        volumeMounts:
        - name: disk-csi
          mountPath: /var/lib/mysql
      tolerations:
      - key: "app"
        operator: "Exists"
        effect: "NoSchedule"
  volumeClaimTemplates:
  - metadata:
      name: disk-csi
    spec:
      accessModes: [ "ReadWriteMany" ]
      storageClassName: alicloud-disk-topology-alltype
      resources:
        requests:
          storage: 40Gi

Parameter utama:

  • topologySpreadConstraints: Menyebarluaskan Pod ke berbagai zona ketersediaan se-merata mungkin. Untuk informasi selengkapnya, lihat Topology Spread Constraints.

  • volumeClaimTemplates: Secara otomatis membuat jumlah disk yang diperlukan berdasarkan jumlah replika, sehingga menyederhanakan skalabilitas.

Penting

Saat PV disediakan secara dinamis, definisi YAML-nya mencakup zona ketersediaan dari node tersebut. Akibatnya, PV dan PVC yang terikat hanya dapat digunakan oleh Pod yang dijadwalkan di zona ketersediaan yang sama, sehingga menjamin pemasangan yang sukses.

Referensi