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ğeristsve 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-bTemel 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.volumeBindingModedeğeriWaitForFirstConsumerolarak 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.
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
Disk birimlerinizin veri güvenliğini artırmak için bkz. Disk birimleri için veri güvenliği en iyi uygulamaları.
Disk kullanımını gerçek zamanlı olarak izlemek için bkz. Konteyner depolama izlemesine genel bakış.
Bir disk doluysa veya boyutunu artırmanız gerekiyorsa bkz. Disk birimlerini genişletme.
Diğer disk bağlama sorunları için bkz. Disk birimleri hakkındaki SSS.