Kubernetes Drain ve Cordon: Düğüm Yönetimi Detayları

Kubernetes kümelerinde düğüm bakımı ve iş yükü yönetimi için temel komutlar.

Giriş: Düğüm Bakımı ve İş Yükü Yönetimi

Kubernetes kümeleri, uygulamaların yüksek erişilebilirlik ve ölçeklenebilirlik ile çalışmasını sağlayan dinamik ortamlardır. Bu dinamizm, altyapı üzerinde düzenli bakım işlemleri yapılmasını veya bir düğümün kümeden geçici olarak çıkarılmasını gerektirebilir. Bir düğüm üzerinde bakım yapmak, yazılım güncellemek veya donanım değiştirmek gibi durumlar söz konusu olduğunda, bu düğümdeki Pod'ların güvenli bir şekilde başka düğümlere taşınması veya yeni Pod'ların bu düğüme atanmasının engellenmesi önemlidir.

Kubernetes, bu tür senaryoları yönetmek için `kubectl cordon` ve `kubectl drain` komutlarını sunar. Bu komutlar, düğümlerin durumunu kontrollü bir şekilde değiştirerek iş yükü kesintilerini en aza indirmeye yardımcı olur.

Kesintileri yönetirken iki ana türü göz önünde bulundurmak önemlidir:

1. `kubectl cordon`: Düğümü Yeni İş Yüklerinden Engelleme

`kubectl cordon` komutu, bir Kubernetes düğümünü **"planlanamaz" (unschedulable)** olarak işaretler. Bu, `kube-scheduler`'ın bu düğüme yeni Pod'ları atamasını engeller. Ancak, düğümde halihazırda çalışan Pod'lar etkilenmez ve çalışmaya devam ederler. Cordon, düğümün mevcut iş yükünü bozmadan, yeni iş yüklerinin o düğüme gelmesini durdurmak istediğinizde kullanılır.

Neden ve Ne İşe Yarar?

  • **Bakım Öncesi Hazırlık:** Bir düğüm üzerinde uzun süreli bakım çalışması (örneğin işletim sistemi yükseltmesi, donanım değişimi) yapmadan önce yeni Pod'ların gelmesini durdurmak için kullanılır. Bu, düğümü "boşaltmaya" başlamadan önceki ilk adımdır.
  • **Sorun Giderme:** Bir düğümde anormallikler fark ettiğinizde, ancak mevcut Pod'ları hemen etkilemek istemediğinizde, yeni Pod'ların o düğüme atanmasını önlemek için kullanılabilir.
  • **Uygulama Boşaltma İçin İlk Adım:** Düğümdeki Pod'ların kendiliğinden başka düğümlere taşınmasını beklerken (örneğin Pod Disruption Budget ile uyumlu bir şekilde) ilk adım olarak kullanılabilir.

Çalışma Şekli:

`kubectl cordon ` komutu, düğümün durumunu `Ready` (Hazır) durumundan `Ready,SchedulingDisabled` (Hazır, Planlama Devre Dışı) durumuna değiştirir. Bu durum, Scheduler'a bu düğüme yeni Pod atamamasını söyler, ancak mevcut Pod'lar çalışmaya devam eder. Düğüm bakımı tamamlandığında veya düğüm tekrar kullanıma hazır olduğunda, `kubectl uncordon ` komutuyla düğüm tekrar `Ready` durumuna getirilir ve yeni Pod'lar için planlanabilir hale gelir.

Örnek Kullanım:


# Düğümü planlanamaz olarak işaretle
kubectl cordon my-worker-node-1

# Düğümün durumunu kontrol et
kubectl get nodes

# Örnek Çıktı (STATUS sütununa dikkat):
# NAME             STATUS                     ROLES    AGE   VERSION
# my-worker-node-1 Ready,SchedulingDisabled      2d    v1.28.3
# my-worker-node-2 Ready                         2d    v1.28.3

# Bakım sonrası düğümü tekrar aktif hale getir
kubectl uncordon my-worker-node-1
                

`kubectl cordon` Etkisi

Düğüm A

(Ready)

📦
Pod 1
📦
Pod 2
⟶ `cordon` ⟶
Düğüm A

(SchedulingDisabled)

📦
Pod 1
📦
Pod 2

Yeni Pod'lar artık bu düğüme atanmaz, ancak mevcut Pod'lar çalışmaya devam eder.

2. `kubectl drain`: Düğümdeki Tüm Pod'ları Boşaltma

`kubectl drain` komutu, bir düğümü hem `cordon` eder (yani yeni Pod'ların planlanmasını engeller) hem de düğümde halihazırda çalışan tüm Pod'ları (bazı istisnalar hariç) güvenli bir şekilde tahliye ederek kümedeki diğer uygun düğümlere taşır. Bu, düğümün tamamen boşaltılmasını ve güvenli bir şekilde kapatılmasını veya üzerinde kapsamlı bakım yapılmasını sağlar. `drain` komutu, uygulamanın kesintisiz hizmet vermeye devam etmesini sağlamak amacıyla Pod'ları kontrollü bir şekilde tahliye etmeye çalışır.

Neden ve Ne İşe Yarar?

  • **Kapsamlı Düğüm Bakımı/Güncellemesi:** Bir düğümü yeniden başlatmadan, yamalamadan, işletim sistemi veya Kubernetes sürümünü yükseltmeden önce üzerindeki tüm iş yüklerini güvenli bir şekilde başka düğümlere taşımak için en sık kullanılan yöntemdir.
  • **Düğüm Kaldırma:** Bir düğümü kümeden kalıcı olarak çıkarmadan önce tüm Pod'ları tahliye etmek ve kaynak israfını önlemek için kullanılır.
  • **Sorunlu Düğümü Ayırma:** Bir düğümde ciddi ve kalıcı sorunlar olduğunda, bu düğümdeki Pod'ları başka sağlıklı düğümlere taşımak için kullanılır.

Çalışma Şekli:

`kubectl drain ` komutu aşağıdaki adımları otomatik olarak yürütür:

  1. **Düğümü `cordon` eder:** Öncelikle düğümü planlanamaz olarak işaretler. Bu, yeni Pod'ların bu düğüme atanmasını durdurur.
  2. **Pod'ları tahliye etmeye çalışır:** Düğümde çalışan tüm yönetilen Pod'ları (yani bir `Deployment`, `StatefulSet` veya `ReplicaSet` gibi bir kontrolör tarafından yönetilen Pod'ları) tahliye etmeye (evict) çalışır. Kubernetes kontrol düzlemi, bu Pod'ları kümedeki başka uygun düğümlere yeniden planlar.
  3. **İstisnalar:**
    • **Tekil Pod'lar (Bare Pods):** Bir kontrolör tarafından yönetilmeyen Pod'lar varsayılan olarak tahliye edilmez çünkü Kubernetes bu Pod'ları otomatik olarak yeniden planlamaz. Bu Pod'ların manuel olarak silinmesi gerekir; aksi takdirde `drain` komutu başarısız olur. Bu durumlar için `--force` bayrağı kullanılabilir (ancak dikkatli olunmalıdır, çünkü veri kaybına yol açabilir).
    • **DaemonSet Pod'ları:** `DaemonSet` tarafından oluşturulan Pod'lar da varsayılan olarak tahliye edilmez, çünkü bu Pod'ların her düğümde çalışması beklenir (örneğin log toplayıcılar, izleme ajanları). Bu nedenle, genellikle `kubectl drain` komutu `--ignore-daemonsets` bayrağı ile birlikte kullanılır.
    • **Pod Disruption Budget (PDB):** Eğer bir uygulamanın Pod'ları için bir PDB tanımlanmışsa, `drain` işlemi PDB'nin izin verdiği kesinti bütçesine uymaya çalışır. PDB, aynı anda kullanılamaz hale gelebilecek Pod sayısını sınırlayarak uygulamanın kritik eşiğin altına düşmesini engeller. PDB'ye uyulamıyorsa `drain` işlemi duraklayabilir veya hata verebilir.
Tahliye işlemi tamamlandıktan sonra, düğüm üzerinde güvenli bir şekilde bakım yapılabilir veya düğüm kapatılabilir. Bakım sonrası düğüm tekrar kümeleştirilirse, `kubectl uncordon ` komutuyla tekrar `Ready` durumuna getirilir ve yeni Pod'lar için planlanabilir hale gelir.

Örnek Kullanım:


# Düğümü boşalt (DaemonSet Pod'larını yok say ve kontrolörsüz Pod'ları zorla sil)
kubectl drain my-worker-node-1 --ignore-daemonsets --delete-emptydir-data --force

# Düğümün Pod durumunu kontrol et (artık Pod'lar başka yerlere taşınmış olmalı)
kubectl get pods -o wide --all-namespaces | grep my-worker-node-1
# Bu komut genellikle boş çıktı verir, çünkü Pod'lar taşınmıştır.

# Bakım sonrası düğümü tekrar aktif hale getir
kubectl uncordon my-worker-node-1
                

`kubectl drain` Akışı

Düğüm A

(Ready)

📦
Pod 1
📦
Pod 2
⟶ `drain` ⟶
Düğüm A

(Draining...)

⬇️
Pod 1 (Evicting)
⬇️
Pod 2 (Evicting)
⟶ Yeniden Planlama ⟶
Düğüm B

(Ready)

📦
Pod 1 (Re-scheduled)
📦
Pod 2 (Re-scheduled)

`drain` komutu düğümü planlanamaz hale getirir ve mevcut Pod'ları güvenli bir şekilde tahliye ederek başka düğümlere taşır.

Cordon ve Drain Karşılaştırması

`kubectl cordon` ve `kubectl drain` komutları, Kubernetes'te düğüm yönetimi için farklı ancak ilişkili amaçlara hizmet eder. `cordon` daha az yıkıcı ve bir hazırlık adımı iken, `drain` daha kapsamlı bir tahliye işlemidir.

Özellik `kubectl cordon` `kubectl drain`
**Ana Amaç** Düğümü yeni Pod'ların planlanmasından (scheduling) engellemek. Düğümü hem planlanamaz olarak işaretlemek hem de üzerindeki tüm Pod'ları (bazı istisnalar hariç) tahliye etmek.
**Mevcut Pod'lara Etkisi** Mevcut çalışan Pod'lar etkilenmez, çalışmaya devam eder. Mevcut çalışan Pod'ları güvenli bir şekilde tahliye eder (evicts).
**Yan Etkileri** Yeni Pod'lar bu düğüme atanmaz. Başka Pod'lar etkilenmez. Tahliye edilen Pod'lar başka düğümlere yeniden planlanır. Bu, uygulamanın kısa süreli yeniden başlatılmasına neden olabilir.
**Kullanım Senaryoları** Kısa süreli bakım öncesi hazırlık, düğümün geçici olarak yeni iş yükü almasını engelleme, `drain` işleminden önceki ilk adım. Uzun süreli bakım, işletim sistemi yükseltmesi, donanım değişimi, düğümü kümeden kalıcı olarak çıkarma.
**Gereken Bayraklar** Genellikle ek bayrak gerekmez. `--ignore-daemonsets` (DaemonSet Pod'larını atlamak için), `--force` (kontrolör tarafından yönetilmeyen Pod'ları silmek için), `--delete-emptydir-data` (emptyDir birimlerini silmek için).
**Geri Alma** `kubectl uncordon ` komutu ile düğüm tekrar planlanabilir hale gelir. `kubectl uncordon ` komutu ile düğüm tekrar planlanabilir hale gelir. (Ancak tahliye edilen Pod'ların geri gelmesi için kontrolör tarafından yeniden planlanması gerekir).

Sonuç

`kubectl cordon` ve `kubectl drain` komutları, Kubernetes kümelerinde düğüm bakımı ve operasyonel görevler için vazgeçilmez araçlardır. `cordon`, yeni iş yüklerinin belirli bir düğüme gelmesini engellemek için hafif bir yaklaşım sunarken, `drain`, düğümün tamamen boşaltılmasını ve üzerindeki Pod'ların başka düğümlere taşınmasını sağlayarak daha kapsamlı bir bakım işlemi için temel teşkil eder. Bu komutları doğru anlamak ve kullanmak, Kubernetes operasyonlarınızın sorunsuz, kesintisiz ve güvenli bir şekilde yürütülmesini sağlar. Doğru senaryoda doğru komutu kullanmak, hem uygulama kullanılabilirliğini korur hem de operasyonel verimliliği artırır.