Bir Kubernetes Kümesini Kesinti Süresi Olmadan Yükseltme

Bir Kubernetes Kümesini Kesinti Süresi Olmadan Yükseltme

Kubernetes kümeniz için yükseltme işlemi

Bir noktada Kubernetes kümesini kullanırken çalışan düğümleri güncellemeye ihtiyaç duyulur. Bu, paket güncellemelerini, çekirdek güncellemelerini veya yeni sanal makine görüntülerinin dağıtımını içerebilir. Kubernetes terminolojisinde buna denir "Gönüllü Bozulma".

Bu yazı 4 yazılık bir serinin parçasıdır:

  1. Bu gönderi.
  2. Kubernetes kümesindeki bölmelerin doğru şekilde kapatılması
  3. Bir bölme silindiğinde gecikmeli sonlandırılması
  4. PodDisruptionBudgets Kullanılarak Kubernetes Kümesinin Kapalı Kalması Nasıl Önlenir?

(yaklaşık. Serinin geri kalan makalelerinin yakın gelecekte çevirilerini bekliyoruz)

Bu makalede, kümenizde çalışan düğümler için sıfır kesinti süresi elde etmek amacıyla Kubernetes'in sağladığı tüm araçları açıklayacağız.

Problem tanımı

İlk başta naif bir yaklaşım sergileyeceğiz, sorunları belirleyip bu yaklaşımın potansiyel risklerini değerlendireceğiz ve döngü boyunca karşılaştığımız sorunların her birini çözmek için bilgi birikimi oluşturacağız. Sonuç, sıfır kesinti süresi hedefimize ulaşmak için yaşam döngüsü kancalarını, hazırlık araştırmalarını ve Kapsül kesinti bütçelerini kullanan bir yapılandırmadır.

Yolculuğumuza başlamak için somut bir örnek alalım. Diyelim ki, arkasında iki bölme bulunan bir uygulamanın çalıştığı iki düğümden oluşan bir Kubernetes kümemiz var. Service:

Bir Kubernetes Kümesini Kesinti Süresi Olmadan Yükseltme

İki Kubernetes küme düğümümüzde Nginx ve Service'in çalıştığı iki bölmeyle başlayalım.

Kümemizdeki iki çalışan düğümün çekirdek sürümünü güncellemek istiyoruz. Bunu nasıl yapabiliriz? Basit bir çözüm, yeni düğümleri güncellenmiş yapılandırmayla başlatmak ve ardından yenilerini başlatırken eski düğümleri kapatmak olabilir. Bu işe yarayacak olsa da, bu yaklaşımla ilgili birkaç sorun olacaktır:

  • Eski düğümleri kapattığınızda, bunlar üzerinde çalışan bölmeler de kapatılacaktır. Sorunsuz bir kapatma için bölmelerin temizlenmesi gerekiyorsa ne olur? Kullandığınız sanallaştırma sistemi temizleme işleminin tamamlanmasını beklemeyebilir.
  • Tüm düğümleri aynı anda kapatırsanız ne olur? Bölmeler yeni düğümlere taşınırken makul bir kesinti süresi elde edeceksiniz.

Düğümde değişiklik yaparken çalışan süreçlerimizden hiçbirinin çalışmadığından emin olurken, eski düğümlerden bölmeleri zarif bir şekilde taşımanın bir yoluna ihtiyacımız var. Veya örnekte olduğu gibi kümenin tamamını değiştirdiğimizde (yani VM görüntülerini değiştirdiğimizde), çalışan uygulamaları eski düğümlerden yenilerine aktarmak istiyoruz. Her iki durumda da, yeni bölmelerin eski düğümlerde zamanlanmasını önlemek ve ardından çalışan tüm bölmeleri bunlardan çıkarmak istiyoruz. Bu hedeflere ulaşmak için şu komutu kullanabiliriz: kubectl drain.

Bir düğümdeki tüm bölmeleri yeniden dağıtma

Boşaltma işlemi, bir düğümdeki tüm bölmeleri yeniden dağıtmanıza olanak tanır. Drenaj yürütme sırasında düğüm programlanamaz olarak işaretlenir (bayrak NoSchedule). Bu, üzerinde yeni bölmelerin görünmesini engeller. Daha sonra drenaj, bölmeleri düğümden çıkarmaya başlar, düğümde çalışmakta olan kapsayıcıları kapatır ve bir sinyal gönderir. TERM bir bölmedeki kaplar.

Rağmen kubectl drain Bölmeleri çıkarma konusunda harika bir iş çıkaracak olsa da boşaltma işleminin başarısız olmasına neden olabilecek iki faktör daha vardır:

  • Başvurunuz gönderildikten sonra sorunsuz bir şekilde sonlandırılabilmelidir TERM sinyal. Pod'lar çıkarıldığında Kubernetes bir sinyal gönderir TERM belirli bir süre boyunca konteynerlerin durmasını bekler, daha sonra durmamışsa zorla sonlandırır. Her durumda, konteyneriniz sinyali doğru algılamasa bile, pod'lar halihazırda çalışıyorsa (örneğin, bir veritabanı işlemi devam ediyorsa) yine de hatalı şekilde söndürebilirsiniz.
  • Uygulamanızı içeren tüm bölmeleri kaybedersiniz. Yeni düğümlerde yeni kapsayıcılar başlatıldığında kullanılamayabilir veya bölmeleriniz denetleyiciler olmadan dağıtılırsa hiç yeniden başlamayabilirler.

Kesinti süresini önlemek

Bir düğümdeki boşaltma işlemi gibi gönüllü kesintilerden kaynaklanan kesinti süresini en aza indirmek için Kubernetes aşağıdaki arıza giderme seçeneklerini sunar:

Serinin geri kalanında kapsül geçişinin etkisini azaltmak için bu Kubernetes özelliklerini kullanacağız. Ana fikri takip etmeyi kolaylaştırmak için yukarıdaki örneğimizi aşağıdaki kaynak yapılandırmasıyla kullanacağız:

---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deployment
 labels:
   app: nginx
spec:
 replicas: 2
 selector:
   matchLabels:
     app: nginx
 template:
   metadata:
     labels:
       app: nginx
   spec:
     containers:
     - name: nginx
       image: nginx:1.15
       ports:
       - containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
 name: nginx-service
spec:
 selector:
   app: nginx
 ports:
 - protocol: TCP
   targetPort: 80
   port: 80

Bu konfigürasyon minimal bir örnektir Deployment, kümedeki nginx bölmelerini yöneten. Ek olarak, yapılandırma kaynağı açıklar Servicebir kümedeki nginx bölmelerine erişmek için kullanılabilir.

Döngü boyunca, bu yapılandırmayı tekrar tekrar genişleterek Kubernetes'in kesinti süresini azaltmak için sağladığı tüm yetenekleri içerecek şekilde genişleteceğiz.

AWS ve ötesinde sıfır kesinti süresi için Kubernetes küme güncellemelerinin tamamen uygulanmış ve test edilmiş bir sürümü için şu adresi ziyaret edin: Gruntwork.io.

Ayrıca blogumuzdaki diğer makaleleri de okuyun:

Kaynak: habr.com

Yorum ekle