Kubernetes Otomatik Ölçeklendirme: HPA ve VPA

Uygulamalarınızın kaynak kullanımını ve performansını otomatik olarak optimize edin.

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:

Kubernetes, bu iki ölçeklendirme türünü yönetmek için iki ana API objesi sunar: **Horizontal Pod Autoscaler (HPA)** ve **Vertical Pod Autoscaler (VPA)**. Bu belgede, her ikisini de detaylı olarak inceleyeceğiz.

Otomatik Ölçeklendirme Konsepti

📦
Düşük Yük

1 Pod

📈
Metrikler Yükseliyor

CPU %80

💜
Autoscaler Kararı
📦📦📦
Yüksek Yük

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ışı

📦📦
Uygulama Pod'ları

(Mevcut Kaynak Kullanımı)

📊
Metrics Server / Prometheus

(Metrikleri Toplar)

💜
Horizontal Pod Autoscaler

(Hedefleri Karşılaştırır)

↑ Replicas
Deployment / StatefulSet

(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ışı

📦
Uygulama Pod'u

(Kaynak Kullanımı)

📊
Metrics Server

(Metrikleri Toplar)

💜
VPA Recommender

(Öneri Hesaplar)

↑ Resource
VPA Updater

(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:

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.