Tüm Ürünler
Search
Belge Merkezi

Container Service for Kubernetes:High-availability configuration for disk volumes

Son Güncelleme:Oct 06, 2026

Bir StatefulSet dağıttığınızda ve disk birimlerini bağladığınızda, yanlış yapılandırılmış kullanılabilirlik alanları veya uyumsuz disk türleri gibi sorunlar nedeniyle uygulamanız başlatılamayabilir. Bu konu, bu altyapı sorunlarını önlemek ve sürüm kesintilerini en aza indirmek için çoklu kullanılabilirlik alanı dağıtımlarına yönelik yapılandırma önerileri sunar.

Arka Plan

Kubernetes'in güçlü konteyner düzenleme yetenekleri, büyük ölçekli durum bilgisi içeren uygulamaların (StatefulSets) oluşturulmasını kolaylaştırır. Ancak Kubernetes dağıtımı basitleştirirken temel donanımı da soyutlar. Bu soyutlama, altta yatan altyapının topolojisi ve sınırlamaları hakkında bilginiz yoksa beklenmedik davranışlara yol açabilir.

  • Birden çok kullanılabilirlik alanını kapsayan bir kümede, A kullanılabilirlik alanı için planlanan bir pod B kullanılabilirlik alanındaki bir düğüme zamanlanır.

  • Bir disk birimi oluştururken hata oluşur; örneğin, dinamik PV, InvalidDataDiskCatagory.NotSupported hatasıyla sağlanamaz.

  • Bir pod birimi bağlayamaz ve şu hatayı döndürür: The instanceType of the specified instance does not support this disk category.

  • Bir pod zamanlanamaz ve şu hatayı döndürür: 0/x node are available, x nodes had volume node affinity conflict.

Bu sorunlar uygulama sürümlerini kesintiye uğratabilir veya engelleyebilir. Bu konu, bu hataların riskini azaltmak için yüksek kullanılabilirliğe yönelik yapılandırma önerileri sunar.

Yapılandırmalar

Yapılandırma hedefleri

  • StatefulSet'ler için kalıcı depolama amacıyla disk kullanmanızı öneririz. Diskler, NAS'a kıyasla daha yüksek kararlılık ve daha iyi veri aktarım bant genişliği sunar.

  • Kümenin talebi karşılamak için yeterli hesaplama ve depolama kaynağına sahip birden çok kullanılabilirlik alanını kapsadığından emin olun.

  • Tüm bir kullanılabilirlik alanı kullanılamaz hale geldiğinde küme, zamanlama talebini karşılamak için düğümleri otomatik olarak dışa doğru ölçeklendirebilir.

  • Disk bağlama hatalarını önlemek için yüksek kullanılabilirliğe sahip bir StorageClass kullanın.

  • Pod'ların düğümler ve kullanılabilirlik alanları arasında eşit şekilde dağıtıldığından emin olun.

Düğüm havuzu yapılandırmaları

  • Her düğüm havuzu için tek bir kullanılabilirlik alanı kullanın.

    • Bir kullanılabilirlik alanı eklerken bunun için yeni bir düğüm havuzu oluşturun. Daha fazla bilgi için bkz. Düğüm havuzu oluşturma ve yönetme.

    • Düğüm havuzları oluştururken her düğüm havuzunun farklı bir kullanılabilirlik alanıyla eşleştiğinden emin olun. Kullanılabilirlik alanlarını ayırt etmek için düğüm havuzu adlarını kullanın.

  • Düğüm havuzları için otomatik ölçeklendirmeyi etkinleştirin. Daha fazla bilgi için bkz. Düğüm otomatik ölçeklendirmesini etkinleştirme.

    Bir kullanılabilirlik alanında düğüm yoksa sistem, aşağıdaki günlükte gösterildiği gibi pod'u zamanlamak için o alanda otomatik olarak yeni bir düğüm oluşturur.

    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"
  • Tüm kullanılabilirlik alanlarında aynı ECS örnek türünü kullanın. Bu mümkün değilse tümü aynı blok depolama kategorilerini destekleyen örnek türleri kullanın.

    Bazı disk türleri belirli ECS örnek türlerine bağlanamaz. Bir pod doğru kullanılabilirlik alanı içinde zamanlansa bile düğüm istenen disk türünü desteklemiyorsa disk bağlama hataları nedeniyle başlatılamayabilir.

  • İstenmeyen iş yüklerinin bu düğümlere zamanlanmasını ve uygulamanızı etkilemesini önlemek için tüm düğüm havuzları için lekeler (taints) yapılandırın. Bir düğüm havuzu oluştururken Taints bölümünde düğümleri için lekeler yapılandırabilirsiniz. Örneğin anahtarı app, değeri sts ve etkiyi NoSchedule olarak ayarlayın. Bu, eşleşen toleransı olmayan pod'ların bu düğüm havuzundaki düğümlere zamanlanmasını engeller.

Küme yapılandırmaları

  • Küme sürümünüzün 1,20 veya üzeri olduğundan emin olun.

  • CSI eklenti sürümünüzün 1,22 veya üzeri olduğundan emin olun. Daha fazla bilgi için bkz. CSI eklentisini yönetme.

  • Yüksek kullanılabilirliğe sahip bir StorageClass kullanın.

    Aşağıdaki örnek YAML yapılandırmasını göstermektedir:

    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

    Temel parametreler:

    • type: cloud_essd,cloud_ssd,cloud_efficiency: Geri dönüş mekanizması için önceliklendirilmiş bir disk türü listesi belirtir. CSI eklentisi, belirtilen türleri sırayla (ESSD, standart SSD ve ardından ultra disk) deneyerek disk oluşturmayı dener. Bu yaklaşım, belirli bir tür için yetersiz disk envanterinden kaynaklanan pod başlatma hatalarını önler.

    • volumeBindingMode: WaitForFirstConsumer: Disk oluşturmayı bir pod belirli bir düğüme zamanlanana kadar erteler. Bu, diskin düğümle aynı kullanılabilirlik alanında oluşturulmasını sağlayarak alan uyuşmazlıklarından kaynaklanan pod başlatma hatalarını önler.

    • allowedTopologies: Birim sağlamayı belirli kullanılabilirlik alanlarıyla sınırlar. volumeBindingMode değeri WaitForFirstConsumer olarak ayarlandığında zamanlayıcı pod'ları belirtilen kullanılabilirlik alanlarından birine yerleştirerek diskin başarıyla sağlanmasını sağlar.

Uygulama yapılandırmaları

Aşağıdaki şablon standart bir StatefulSet yapılandırmasını gösterir. İhtiyaçlarınıza göre özelleştirebilirsiniz.

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

Temel parametreler:

  • topologySpreadConstraints: Pod'ları farklı kullanılabilirlik alanlarına mümkün olduğunca eşit şekilde dağıtır. Daha fazla bilgi için bkz. Topoloji Yayılım Kısıtlamaları.

  • volumeClaimTemplates: Çoğaltma sayısına göre gerekli disk sayısını otomatik olarak oluşturarak ölçeklendirmeyi basitleştirir.

Önemli

Bir PV dinamik olarak sağlandığında YAML tanımı düğümün kullanılabilirlik alanını içerir. Sonuç olarak PV ve buna bağlı PVC yalnızca aynı kullanılabilirlik alanında zamanlanan pod'lar tarafından kullanılabilir; bu da başarılı bir bağlamayı garanti eder.

Referanslar