Giriş: Dinamik İş Yüklerini Yönetmek
Bulut tabanlı uygulamaların iş yükleri genellikle dalgalanmalar gösterir; günün veya haftanın belirli saatlerinde yoğunluk artarken, diğer zamanlarda düşüş yaşanabilir. Bu dinamik iş yüklerini manuel olarak yönetmek (Pod sayısını artırmak/azaltmak veya Pod'ların kaynaklarını değiştirmek) verimsiz, zaman alıcı ve hataya açık bir süreçtir. Kubernetes, bu sorunu çözmek için otomatik ölçeklendirme mekanizmaları sunar.
Kubernetes'te otomatik ölçeklendirme, uygulamanızın performansını ve kaynak verimliliğini, değişen taleplere göre dinamik olarak ayarlamasını sağlar. İki ana otomatik ölçeklendirme türü vardır:
- **Yatay Ölçeklendirme (Horizontal Scaling):** Uygulamanın performansını artırmak için Pod sayısını (replikalarını) artırma veya azaltma.
- **Dikey Ölçeklendirme (Vertical Scaling):** Bir Pod'un kaynak (CPU, bellek) taleplerini ve limitlerini değiştirerek tek bir Pod'un performansını artırma veya azaltma.
Otomatik Ölçeklendirme Konsepti
1 Pod
CPU %80
3 Pod
Otomatik ölçeklendirme, talep arttıkça kaynakları dinamik olarak ayarlar.
1. Horizontal Pod Autoscaler (HPA)
**Horizontal Pod Autoscaler (HPA)**, Kubernetes kümesindeki bir `Deployment`, `ReplicaSet` veya `StatefulSet`'teki Pod sayısını (replikalarını) otomatik olarak ayarlayan bir API objesidir. Bu ayarlama, belirtilen hedeflenen metrik değerlerine (örneğin ortalama CPU kullanımı, ortalama bellek kullanımı veya özel metrikler) göre yapılır. HPA, uygulamanızın yatay olarak ölçeklenmesinden sorumludur.
Neden ve Ne İşe Yarar?
- **Dinamik Talep Karşılama:** Uygulamanızın gelen talebi otomatik olarak karşılamasını sağlar, ani yük artışlarına veya azalışlarına hızlıca yanıt verir.
- **Performans Optimizasyonu:** Pod'lar aşırı yüklenmeden önce yeni Pod'lar ekleyerek uygulama performansını korur.
- **Maliyet Verimliliği:** Talep azaldığında Pod sayısını düşürerek gereksiz kaynak tüketimini ve bulut maliyetlerini azaltır.
- **Yüksek Erişilebilirlik:** Daha fazla Pod çalıştırarak uygulamanın hata toleransını artırır.
Nasıl Çalışır?
HPA denetleyicisi, `kube-controller-manager` içinde çalışır ve belirtilen Pod metriklerini düzenli aralıklarla (varsayılan olarak 15 saniye) kontrol eder. Bu metrikler genellikle `metrics-server` (CPU ve bellek gibi yerleşik metrikler için) veya Prometheus gibi harici izleme sistemlerinden (özel metrikler için) alınır. HPA, mevcut metrik değerlerini tanımlanan hedeflerle karşılaştırır ve `Deployment` veya `StatefulSet`'in `replicas` alanını uygun şekilde ayarlar.
Özellikleri:
- `spec.scaleTargetRef`: Ölçeklendirilecek hedef kaynağı (örneğin bir Deployment).
- `spec.minReplicas`: Uygulamanın sahip olabileceği minimum Pod sayısı.
- `spec.maxReplicas`: Uygulamanın sahip olabileceği maksimum Pod sayısı.
- `spec.metrics`: Ölçekleme kararlarının temel alınacağı metrikler.
- `Resource` metrikleri (CPU, Memory): Hedef değer yüzde cinsinden (örneğin %50 CPU kullanımı).
- `Pods` metrikleri: Pod'lar tarafından yayılan metrikler (örneğin istek kuyruğu boyutu).
- `Object` metrikleri: Küme genelindeki bir objeye ait metrikler (örneğin Ingress'ten gelen saniye başına istek sayısı).
- `External` metrikler: Küme dışından gelen metrikler (örneğin bir bulut sağlayıcısının mesaj kuyruğundaki mesaj sayısı).
Örnek YAML:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
namespace: default
spec:
scaleTargetRef: # Ölçeklendirilecek hedef
apiVersion: apps/v1
kind: Deployment
name: my-app-deployment
minReplicas: 2 # Minimum 2 Pod
maxReplicas: 10 # Maksimum 10 Pod
metrics:
- type: Resource # Kaynak metriği
resource:
name: cpu
target:
type: Utilization # Hedef CPU kullanımı yüzdesi
averageUtilization: 50 # Ortalama %50 CPU kullanımında ölçeklendir
- type: Resource
resource:
name: memory
target:
type: AverageValue # Hedef ortalama bellek değeri
averageValue: 200Mi # Ortalama 200MiB bellek kullanımında ölçeklendir
HPA Çalışma Akışı
(Mevcut Kaynak Kullanımı)
(Metrikleri Toplar)
(Hedefleri Karşılaştırır)
(Pod Sayısını Ayarlar)
HPA, metrikleri izleyerek Pod sayısını yatay olarak ayarlar.
2. Vertical Pod Autoscaler (VPA)
**Vertical Pod Autoscaler (VPA)**, bir Pod'un konteynerleri için CPU ve bellek `request` ve `limit` değerlerini otomatik olarak ayarlayan bir Kubernetes bileşenidir. VPA, uygulamanızın geçmiş kaynak kullanım verilerini analiz eder ve en uygun kaynak konfigürasyonunu önerir veya doğrudan uygular. Amacı, kaynak israfını azaltmak ve aynı zamanda uygulamanın performans gereksinimlerini karşılamak için Pod'ların yeterli kaynağa sahip olmasını sağlamaktır.
Neden ve Ne İşe Yarar?
- **Kaynak Optimizasyonu:** Pod'lara doğru miktarda CPU ve bellek atayarak kaynak israfını önler.
- **Performans İstikrarı:** Pod'ların darboğaz yaşamasını engelleyerek uygulamanın performansını artırır.
- **Manuel Ayarlama Yükünü Azaltma:** Geliştiricilerin veya operatörlerin Pod'lar için manuel olarak kaynak `request` ve `limit` değerleri belirlemesi ihtiyacını ortadan kaldırır.
- **Daha İyi Zamanlama:** Doğru kaynak istekleri, Scheduler'ın Pod'ları düğümlere daha verimli bir şekilde yerleştirmesine yardımcı olur.
Nasıl Çalışır?
VPA, Kubernetes kümesinde birkaç bileşenden oluşur (VPA Recommender, VPA Updater, VPA Admission Plugin).
- **VPA Recommender:** Pod'ların geçmiş CPU ve bellek kullanım verilerini toplar ve analiz eder (genellikle `metrics-server`'dan). Bu verilere dayanarak, Pod'ların konteynerleri için önerilen `request` ve `limit` değerlerini hesaplar.
- **VPA Updater:** Recommender'dan gelen önerilere göre Pod'ları yeniden yapılandırır. Bu, genellikle Pod'ları tahliye edip yeni kaynak istekleriyle yeniden başlatmak anlamına gelir.
- **VPA Admission Plugin:** Yeni veya güncellenen Pod'ların kaynak isteklerini ve limitlerini VPA önerilerine göre otomatik olarak ayarlar, böylece yeni Pod'lar doğru boyutlandırılarak başlatılır.
Özellikleri:
- `spec.targetRef`: Ölçeklendirilecek hedef kaynağı (örneğin bir Deployment).
- `spec.updatePolicy.updateMode`: VPA'nın kaynakları nasıl uygulayacağını belirler:
- `Off`: Sadece öneri yapar, otomatik değişiklik yapmaz.
- `Initial`: Pod başlatıldığında kaynakları ayarlar.
- `Recreate`: Kaynaklar değiştiğinde Pod'u yeniden oluşturur.
- `Auto` (varsayılan): `Recreate` gibi Pod'u yeniden oluşturur (bazı durumlarda yerinde güncelleme de yapabilir).
- `spec.resourcePolicy`: VPA'nın hangi konteynerler için öneriler yapacağını ve min/max kaynaklarını belirler.
Örnek YAML:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-app-vpa
namespace: default
spec:
targetRef: # Ölçeklendirilecek hedef
apiVersion: "apps/v1"
kind: Deployment
name: my-app-deployment
updatePolicy:
updateMode: "Auto" # Otomatik olarak kaynakları güncelle ve Pod'u yeniden başlat
resourcePolicy:
containerPolicies:
- containerName: '*' # Tüm konteynerler için geçerli
minAllowed:
cpu: 100m
memory: 50Mi
maxAllowed:
cpu: 2
memory: 1Gi
VPA Çalışma Akışı
(Kaynak Kullanımı)
(Metrikleri Toplar)
(Öneri Hesaplar)
(Pod Kaynaklarını Ayarlar)
VPA, metrikleri izleyerek Pod kaynaklarını dikey olarak ayarlar.
HPA ve VPA Karşılaştırması
HPA ve VPA, farklı ölçeklendirme boyutlarına odaklanır ve genellikle birbirini tamamlayıcı olarak kullanılırlar. Aynı anda bir Pod'u hem HPA hem de VPA ile ölçeklendirmek çakışmalara yol açabilir, bu nedenle dikkatli olunmalıdır.
Temel Farklar:
Özellik | Horizontal Pod Autoscaler (HPA) | Vertical Pod Autoscaler (VPA) |
---|---|---|
**Ölçeklendirme Türü** | **Yatay (Horizontal)**: Pod sayısını artırma/azaltma. | **Dikey (Vertical)**: Konteynerlerin CPU/bellek kaynaklarını (request/limit) artırma/azaltma. |
**Ne Ölçeklendirir?** | `Deployment`, `ReplicaSet`, `StatefulSet`'teki Pod replikası sayısı. | Pod'lardaki konteynerlerin `requests` ve `limits` değerleri. |
**Amacı** | Dinamik talebi karşılamak, yüksek kullanılabilirlik sağlamak. | Kaynak verimliliği, kaynak israfını azaltmak, performans istikrarı. |
**Metrikler** | CPU kullanımı, bellek kullanımı (yüzde veya değer olarak), özel metrikler, harici metrikler. | Geçmiş CPU ve bellek kullanımı. |
**Uygulama Etkisi** | Uygulamanın stateless olması veya yük dağıtımı için tasarlanmış olması gerekir. Pod'lar eklenir/kaldırılır. | Pod'ların yeniden başlatılmasına neden olabilir (UpdateMode'a bağlı olarak). Pod'ların restart'a toleranslı olması gerekir. |
**Kullanım Senaryosu** | Web sunucuları, API ağ geçitleri gibi değişken yüke sahip uygulamalar. | Başlangıçta doğru kaynak boyutunu belirlemekte zorlanılan veya kaynak kullanımı dalgalanan uygulamalar. Batch işleri. |
**Kurulum** | Kubernetes'in yerleşik bir kontrolcüsü olarak gelir. | Ek bir bileşen olarak kümede dağıtılmalıdır (genellikle bir operatör gibi). |
**Çakışma** | VPA ile aynı Pod'lar üzerinde doğrudan çakışır. Genellikle birlikte kullanılmaz. | HPA ile aynı Pod'lar üzerinde doğrudan çakışır (ikisi de Pod'ların kaynaklarını veya sayısını kontrol etmeye çalışır). |
Birlikte Kullanım (Ama Dikkatle):
HPA ve VPA aynı Pod'ların kaynaklarını veya replikalarını doğrudan kontrol etmeye çalıştığında çakışabilirler. Ancak, bazı senaryolarda dolaylı olarak birlikte kullanılabilirler:
- **HPA ve Cluster Autoscaler ile VPA:** Yaygın bir kombinasyondur. VPA, Pod'ların CPU/bellek `request` değerlerini optimize ederken, HPA Pod sayısını (replikaları) yönetir. Cluster Autoscaler ise Pod'ların zamanlanması için yeterli düğüm olmadığında yeni düğümler ekler. Bu üçlü birlikte, kümenin genel kaynak verimliliğini ve uygulama performansını optimize eder.
- **Farklı İş Yükleri İçin:** VPA'yı CPU ve bellek yoğun, daha sabit bir Pod sayısına sahip uygulamalar için kullanırken, HPA'yı değişken yüke sahip stateless web uygulamaları için kullanabilirsiniz.
Sonuç
Kubernetes'teki Horizontal Pod Autoscaler (HPA) ve Vertical Pod Autoscaler (VPA), uygulamalarınızın değişen taleplere göre otomatik olarak ölçeklenmesini sağlayan güçlü araçlardır. HPA, uygulamanızın performansını yatay olarak (Pod sayısını artırarak/azaltarak) optimize ederken, VPA Pod'larınızın kaynak verimliliğini dikey olarak (CPU/bellek `request` ve `limit` değerlerini ayarlayarak) artırır.
Her ikisinin de kendine özgü avantajları ve kullanım alanları vardır. Genellikle, uygulamanın talebine hızlı yanıt vermek ve yüksek kullanılabilirlik sağlamak için HPA tercih edilirken, kaynak israfını azaltmak ve Pod'ların doğru boyutlandırıldığından emin olmak için VPA kullanılır. Bu otoscaler'ları doğru bir şekilde yapılandırmak ve kullanmak, Kubernetes kümelerinizde hem maliyet verimliliği hem de yüksek performans elde etmenin anahtarıdır.