Giriş: Kesintileri Yönetmek
Kubernetes kümelerinde, düğüm bakımı, küme yükseltmeleri veya ölçeklendirme gibi operasyonel nedenlerle Pod'ların bir düğümden diğerine taşınması veya yeniden başlatılması gerekebilir. Bu tür olaylar, uygulamaların hizmet kesintisi yaşamasına neden olabilir. Kubernetes'te kesintiler iki ana kategoriye ayrılır:
- **İstemsiz Kesintiler (Involuntary Disruptions):** Düğüm çökmesi, kernel panik, düğümün ağ bağlantısının kesilmesi veya fiziksel donanım arızası gibi kontrol dışı olaylardır. Kubernetes'in kendini iyileştirme mekanizmaları (örneğin ReplicaSet'ler) bu durumlarda Pod'ları başka sağlıklı düğümlere yeniden planlayarak uygulamaları kurtarmaya çalışır.
- **Gönüllü Kesintiler (Voluntary Disruptions):** Yöneticinin veya otomatik araçların kasıtlı olarak bir Pod'u bir düğümden tahliye etmesiyle oluşan kesintilerdir. Örnekler:
- `kubectl drain` komutu ile düğüm bakımı (işletim sistemi yükseltmesi, donanım değişimi).
- Küme yükseltmesi veya düğüm havuzu ölçeklendirmesi.
- Hata veren Pod'ları veya düğümleri kümeden çıkarma.
**Pod Disruption Budget (PDB - Pod Kesinti Bütçesi)**, özellikle bu **gönüllü kesintiler** sırasında bir uygulamanın minimum kullanılabilirlik düzeyini garanti altına almak için tasarlanmış bir Kubernetes API objesidir. PDB, bir uygulamanın kaç Pod'unun aynı anda kullanılamaz durumda olabileceğini belirleyerek, operasyonel eylemlerin uygulama kararlılığını bozmasını engeller.
1. Pod Disruption Budget (PDB) Nedir ve Ne İşe Yarar?
**Pod Disruption Budget (PDB)**, Kubernetes'te bir uygulamanın çalışır durumda kalması gereken minimum kopya sayısını veya aynı anda kullanılamayacak maksimum kopya sayısını tanımlamanıza olanak tanıyan bir kaynaktır. PDB, özellikle `kubectl drain` gibi gönüllü kesinti eylemleri sırasında devreye girer. Bu sayede, yöneticiler düğüm bakımı gibi işlemleri güvenle yapabilirken, uygulamaların hizmet kalitesinin düşmemesi veya tamamen kesintiye uğramaması sağlanır.
Neden ve Ne İşe Yarar?
- **Uygulama Yüksek Erişilebilirliği:** Bir düğüm tahliye edilirken bile, uygulamanın kritik sayıda Pod'unun çalışır durumda kalmasını sağlayarak hizmet kesintisini önler.
- **Gönüllü Kesinti Kontrolü:** `kubectl drain` veya küme otomatik yükseltme araçları gibi mekanizmaların, PDB tarafından belirlenen sınırlamalara uymasını sağlar.
- **Operasyonel Güvenlik:** Altyapı bakımı veya yükseltmeler sırasında, uygulama sahiplerinin belirlediği tolerans seviyelerinin aşılmamasını garanti eder.
- **Servis Düzeyi Anlaşmaları (SLA):** Uygulamaların SLA'larını korumasına yardımcı olur.
PDB'nin Etkisi: Drain Sırasında
Uygulama Kopyaları: 3
Düğüm (Tahliye Ediliyor)
Düğüm A
Mevcut: 2 (OK)
Düğüm B
Yeni Pod'lar
PDB, aynı anda sadece bir Pod'un tahliye edilmesine izin vererek uygulamanın minimum kullanılabilirliğini korur.
2. PDB Nasıl Çalışır?
PDB, bir Pod'un tahliye edilip edilemeyeceğini belirlemek için Kubernetes API'si ile etkileşime girer. Bir `kubectl drain` komutu veya başka bir tahliye işlemi başlatıldığında, Kubernetes, tahliye edilecek Pod'ların ait olduğu PDB'leri kontrol eder. PDB'deki kurallara göre, tahliye işlemi onaylanır veya reddedilir.
Temel Alanlar:
- `spec.selector`: Bu PDB'nin hangi Pod'ları koruduğunu belirleyen bir etiket seçicidir. Bu seçici, bir `Deployment`, `StatefulSet` veya `ReplicaSet`'in `selector`'ı ile eşleşmelidir.
- `spec.minAvailable`: Uygulamanın çalışır durumda kalması gereken minimum Pod sayısını veya yüzdesini belirtir. Örneğin, `minAvailable: 2` iki Pod'un her zaman çalışır durumda olmasını garanti eder. `minAvailable: 50%` ise toplam Pod sayısının en az yarısının çalışır durumda olmasını garanti eder.
- `spec.maxUnavailable`: Uygulamanın aynı anda kullanılamaz durumda olabilecek maksimum Pod sayısını veya yüzdesini belirtir. Örneğin, `maxUnavailable: 1` aynı anda sadece bir Pod'un kullanılamaz olmasına izin verir. `maxUnavailable: 25%` ise toplam Pod sayısının en fazla %25'inin kullanılamaz olmasına izin verir. (Genellikle `minAvailable` veya `maxUnavailable`'tan sadece biri kullanılır.)
Örnek YAML:
Aşağıdaki örnek PDB, `app: my-app` etiketine sahip Pod'lardan en az 2'sinin her zaman çalışır durumda olmasını garanti eder. Eğer uygulamanın 3 kopyası varsa, `kubectl drain` aynı anda sadece 1 Pod'u tahliye edebilir.
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-app-pdb
spec:
minAvailable: 2 # En az 2 Pod'un her zaman çalışır olmasını sağla
selector:
matchLabels:
app: my-app # Bu PDB'nin koruduğu Pod'ları seç
**Veya `maxUnavailable` ile:**
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-app-pdb-max-unavailable
spec:
maxUnavailable: 1 # Aynı anda en fazla 1 Pod'un kullanılamaz olmasına izin ver
selector:
matchLabels:
app: my-app
3. Kullanım Senaryoları
- **Düğüm Yükseltmeleri:** Küme yöneticileri, düğümleri güvenli bir şekilde yükseltebilir veya yamalayabilirken, PDB sayesinde uygulamalar minimum kesintiyle çalışmaya devam eder.
- **Düğüm Bakımı:** Bir düğümde planlı bakım (örneğin bellek ekleme, disk değişimi) yapmadan önce Pod'ların güvenli bir şekilde tahliye edilmesi.
- **Otomatik Ölçeklendirme (Downscaling):** Küme otomatik ölçeklendiricileri, düğümleri küçültürken (downscale) PDB kurallarına uyarak uygulamanın çalışır durumda kalmasını sağlar.
- **StatefulSet'ler:** Veritabanları gibi durum bilgisi olan uygulamalar için PDB'ler, replikaların minimum sayısının korunmasını sağlayarak veri kaybını veya hizmet kesintisini önler.
4. Önemli Hususlar ve Sınırlamalar
- **Sadece Gönüllü Kesintiler:** PDB'ler yalnızca gönüllü kesintilere karşı koruma sağlar. Bir düğüm aniden çökerse (istemsiz kesinti), PDB bunu önleyemez. Ancak Kubernetes'in diğer denetleyicileri (Deployment, StatefulSet) Pod'ları yeniden planlayarak kurtarmaya çalışacaktır.
- **Çakışan PDB'ler:** Aynı Pod'ları hedefleyen birden fazla PDB oluşturmaktan kaçının. Bu, beklenmeyen davranışlara yol açabilir.
- **`minAvailable` / `maxUnavailable` seçimi:** Bu değerleri doğru ayarlamak kritik öneme sahiptir. Çok kısıtlayıcı bir PDB, bakım işlemlerini engelleyebilirken, çok gevşek bir PDB uygulamayı koruyamayabilir. Uygulamanızın toleransını ve replika sayısını göz önünde bulundurun.
- **`kubectl drain --force`:** `--force` bayrağı kullanıldığında, `kubectl drain` PDB'yi göz ardı edebilir ve Pod'ları zorla tahliye edebilir. Bu nedenle `--force` kullanımında dikkatli olunmalıdır.
- **Tekil Pod'lar (Bare Pods):** PDB'ler, bir kontrolör (Deployment, StatefulSet, ReplicaSet) tarafından yönetilmeyen tekil Pod'ları korumaz. PDB'ler Pod'ların tahliyesini engeller, ancak tahliye edilen Pod'ların başka bir yerde yeniden planlanmasını garanti etmez; bu, kontrolörün görevidir.
Sonuç
Pod Disruption Budget (PDB), Kubernetes kümelerinde uygulamaların yüksek kullanılabilirliğini sağlamak için hayati bir araçtır, özellikle de gönüllü kesintilerle başa çıkarken. PDB'ler, yöneticilerin düğüm bakımı ve yükseltmeler gibi işlemleri güvenle gerçekleştirmesine olanak tanırken, uygulamanın minimum çalışır durumdaki kopya sayısını garanti eder. Bu, hizmet kesintilerini en aza indirir ve uygulama operasyonlarının güvenilirliğini artırır. Kubernetes'te yüksek kullanılabilirliğe sahip uygulamalar çalıştırıyorsanız, PDB'leri doğru bir şekilde yapılandırmak, operasyonel süreçlerinizin ayrılmaz bir parçası olmalıdır.