Kubernetes, container yönetimi ve microservice orkestrasyonu için en popüler çözümlerden biri. Ancak, Kubernetes üzerinde gelen trafiği yönetmek için iki ana seçenek bulunuyor: Kubernetes Ingress vs Gateway API. Bu yazıda, bu iki çözümün farklarını, kullanım alanlarını ve hangisini tercih etmeniz gerektiğini detaylıca ele alacağız.

Neden İkinci Bir API’ye İhtiyaç Duyuyoruz?

Gateway API stable hale gelmesine rağmen, birçok organizasyon hala Ingress API kullanmaya devam ediyor.

Ingress API, temel trafik yönlendirme için güçlü bir araç olmasına rağmen, bazı sınırlamaları bulunmaktadır:

  • Annotation tabanlı yapılandırma karmaşıklığı: Özellikle büyük ölçekli projelerde annotation ile yapılan ayarlamalar yönetimi zorlaştırabilir.
  • Protokol sınırlamaları: Yalnızca HTTP ve HTTPS desteği sunar.
  • Tek kaynak kontrolü: Tüm trafik yönlendirmesi tek bir obje üzerinden yönetildiği için rol bazlı ayrım yapmak zor olabilir.

Bu eksiklikleri gidermek amacıyla Gateway API geliştirildi. Gateway API, daha fazla protokol desteği, rol tabanlı ayrım ve daha geniş yapılandırma seçenekleri sunarak modern uygulama ihtiyaçlarını karşılıyor.

Kubernetes Ingress ile Servis Yayınlama

kubernetes ingress

Ingress Routing

Kubernetes’te Ingress, dış trafiği cluster içindeki servislere yönlendirmek için kullanılır. Bir load balancer gibi davranarak, dışarıdan gelen istekleri uygun Kubernetes servisine yönlendirir.

Ingress objesi, gelen trafiği hostname veya URL path bazında yönlendirmek için kurallar tanımlar. Bu kurallar genellikle bir YAML file içinde tanımlanır.

Ingress Controller

Bir Ingress resource‘unun çalışabilmesi için cluster üzerinde aktif bir Ingress Controller bulunmalıdır. Kubernetes ekosisteminde birden fazla Ingress Controller seçeneği mevcut. Bu yazıda, yaygın olarak kullanılan Nginx Ingress Controller üzerinde duracağız.

Ingress Configuration Örneği:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-example
spec:
  rules:
  - host: sub.example.com
    http:
      paths:
      - path: /auth
        pathType: Prefix
        backend:
          service:
            name: http-echo-server
            port:
              number: 8080
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-svc
            port:
              number: 9090
  ingressClassName: nginx

Yukarıdaki yapılandırmada, /auth istekleri http-echo-server servisine yönlendirilirken, /api istekleri api-svc‘ye yönlendirilir.

URL Rewriting

Bazı durumlarda gelen URL’leri yeniden yazmak gerekebilir. Bu işlemi yapabilmek için annotation kullanmak yaygın bir yöntemdir.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-myservicea-two
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /uat/$2
spec:
  rules:
  - host: sub.example.com
    http:
      paths:
      - path: /auth/api(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: http-echo-server
            port:
              number: 8080
  ingressClassName: nginx

Bu yapılandırma, /auth/api/example/1 gibi bir URL’yi /uat/example/1 olarak yeniden yazar.

Ayrıca additional controller’lara buradan ulaşabilirsiniz.

Gateway API ile Servis Yayınlama

image 1

Ingress API, annotation tabanlı yapılandırma esnekliği açısından sınırlıdır ve özellikle büyük ölçekli projelerde yönetimi zorlaştırabilir. Bu noktada Gateway API devreye girer.

Gateway API’nin Avantajları

  • HTTP header-based routing: Gelen talepleri header değerlerine göre yönlendirebilir.
  • Weighted traffic splitting: Yük dengeleme işlemlerinde ağırlıklandırılmış trafik yönlendirmesi yapabilir.
  • Geniş protokol desteği: HTTP, gRPC ve daha birçok protokolü destekler.
  • Genişletilebilir backend seçenekleri: Fonksiyonlar, bucket gibi farklı backend yapıları ile uyumludur.
  • Rol tabanlı yönetim: Gateway ve Route objeleri ile sorumluluk ayrımı daha net yapılabilir.

Gateway API Configuration Örneği:

kind: HTTPRoute
apiVersion: networking.x-k8s.io/v1alpha1
metadata:
  name: bar-route
  namespace: bar
spec:
  hostnames:
  - "bar.example.com"
  rules:
  - forwardTo:
    - serviceName: bar-v1
      port: 8080
      weight: 90
    - serviceName: bar-v2
      port: 8080
      weight: 10
  - matches:
    - headers:
        values:
          env: canary
    forwardTo:
    - serviceName: bar-v2
      port: 8080

Bu örnek, trafiği ağırlıklı olarak bar-v1 servisine yönlendirirken, belirli bir header değerine sahip talepleri bar-v2‘ye yönlendirir.

Kubernetes Ingress vs Gateway API Arasındaki Farklar

ÖzellikIngress APIGateway API
Yapılandırma EsnekliğiAnnotation tabanlı, sınırlıGeniş özellik seti ve daha fazla kontrol
Protokol DesteğiHTTP ve HTTPSHTTP, gRPC ve diğer protokoller
Rol Tabanlı YönetimTek kaynak üzerinden kontrolAyrı Gateway ve Route objeleri ile iş bölümü
Yönetim ve BakımTek obje ile sınırlı yapılandırmaGateway ve Route objeleri ile daha iyi yönetim

Sonuç

Küçük ve temel trafik yönlendirme ihtiyaçlarınız varsa, Nginx Ingress Controller gibi çözümleri kullanmaya devam etmek mantıklı olacaktır. Ancak daha karmaşık yapılandırmalar ve rol bazlı yönetim gereksinimleri olan projelerde Gateway API daha fazla esneklik ve güç sunar.

Proje gereksinimlerinizi analiz ederek doğru API’yi seçmek, hem yönetimi kolaylaştırır hem de gelecekteki ölçeklenebilirlik sorunlarını önler.

Ayrıca incelemek isterseniz Kubernetes Objects, Resources ve Custom Resource: 1 Yazıda Ayrıntılı Rehber yazıma da göz atabilirsiniz.