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 kests, 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-bParameter 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. SaatvolumeBindingModediatur keWaitForFirstConsumer, 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.
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
-
Untuk meningkatkan keamanan data volume disk Anda, lihat Praktik terbaik untuk keamanan data volume disk.
-
Untuk memantau penggunaan disk secara real-time, lihat Ikhtisar pemantauan penyimpanan kontainer.
-
Jika disk penuh atau Anda perlu menambah ukurannya, lihat Perluas volume disk.
-
Untuk masalah pemasangan disk lainnya, lihat FAQ tentang volume disk.