Kubernetes Ingress ve Ingress Controller Detaylı Anlatım

Uygulamalarınıza dışarıdan erişimi merkezi ve esnek bir şekilde yönetin.

Giriş: Uygulamaları Dış Dünyaya Açmak

Kubernetes kümelerinde dağıtılan uygulamalar, varsayılan olarak küme içinden erişilebilir haldedir. Ancak, bir web sitesi veya bir API gibi dış dünyadan erişilmesi gereken uygulamalar için bu dahili erişim yeterli değildir. Kubernetes'te uygulamaları dışarıya açmanın çeşitli yolları vardır; `NodePort` ve `LoadBalancer` tipli Servisler bu amaçla kullanılabilir. Ancak, bu çözümlerin büyük ve karmaşık ortamlarda bazı sınırlamaları vardır:

İşte bu noktada **Ingress** ve **Ingress Controller** devreye girer. Ingress, uygulamalarınıza küme dışından HTTP ve HTTPS erişimi sağlayan bir API objesidir. Ingress Controller ise bu Ingress kurallarını gerçekten uygulayan bir bileşendir.

1. Ingress: Gelen Trafik Kuralları

**Ingress**, Kubernetes kümesindeki Servislerinize dışarıdan gelen HTTP ve HTTPS trafiğini yöneten bir API objesidir. Bir nevi küme içi HTTP/HTTPS yönlendirici veya ters proxy kurallarını tanımlar. Ingress'in kendisi trafiği yönlendirmez; sadece trafiğin nasıl yönlendirilmesi gerektiğini belirten bir kural setidir. Bu kuralları uygulayacak olan bir **Ingress Controller**'a ihtiyaç duyar.

Neden ve Ne İşe Yarar?

  • **Tek Bir Giriş Noktası:** Birden fazla Servisi tek bir IP adresi üzerinden dışarıya açmanızı sağlar, bu da maliyeti ve karmaşıklığı azaltır.
  • **Host Tabanlı Yönlendirme:** Farklı domain adlarına (hostname) gelen trafiği farklı Servislere yönlendirebilir. Örneğin, `blog.example.com`'u blog Servisine, `api.example.com`'u API Servisine yönlendirebilirsiniz.
  • **Path Tabanlı Yönlendirme:** Aynı domain adı altında farklı URL yollarına (path) gelen trafiği farklı Servislere yönlendirebilir. Örneğin, `example.com/blog`'u blog Servisine, `example.com/api`'yi API Servisine yönlendirebilirsiniz.
  • **TLS Sonlandırma:** SSL/TLS sertifikalarını yöneterek HTTPS trafiğini sonlandırabilir ve küme içi trafiği şifrelenmemiş HTTP olarak yönlendirebilir (veya küme içinde de mTLS kullanabilir).
  • **Yük Dengeleme:** Gelen trafiği Ingress kurallarına göre doğru Servise ve dolayısıyla Pod'lara yük dengeleme yaparak dağıtır.

Örnek YAML:


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: / # Nginx Ingress Controller'a özel bir annotation
spec:
  ingressClassName: nginx # Kullanılacak Ingress Controller sınıfı
  rules:
  - host: www.example.com # Host tabanlı yönlendirme
    http:
      paths:
      - path: / # Tüm kök yolu yakala
        pathType: Prefix # / ile başlayan tüm yolları kapsar
        backend:
          service:
            name: web-frontend-service # Yönlendirilecek Service
            port:
              number: 80 # Service'in portu
  - host: api.example.com # Başka bir host
    http:
      paths:
      - path: /v1 # /v1 ile başlayan yolları yakala
        pathType: Prefix
        backend:
          service:
            name: api-backend-service # Yönlendirilecek diğer Service
            port:
              number: 8080
  tls: # TLS (HTTPS) yapılandırması
  - hosts:
      - www.example.com
      - api.example.com
    secretName: example-com-tls # TLS sertifikasını içeren Secret
                

Ingress Temel Akışı

🌍
Dışarıdan Gelen İstek

(www.example.com/)

🚦
Ingress Kaynağı

(Kurallar)

Web Frontend Service
📦
Podlar

Ingress, dışarıdan gelen trafiği kurallara göre uygun Servislere yönlendirir.

2. Ingress Controller: Kuralları Uygulayan Mekanizma

Bir **Ingress Controller**, Kubernetes API'sini izleyen ve `Ingress` kaynaklarında tanımlanan kurallara göre bir yük dengeleyiciyi veya ters proxy'yi yapılandıran bir Pod'dur (veya Pod grubudur). Ingress objeleri tek başlarına hiçbir şey yapmaz; trafiği yönlendirmek için bir Ingress Controller'a ihtiyaç duyarlar. Ingress Controller, bir Kubernetes kümesinin dışında da çalışabilen, ancak genellikle küme içinde Deployment veya DaemonSet olarak dağıtılan özel bir uygulamadır.

Neden ve Ne İşe Yarar?

  • **Ingress Kurallarını Uygulama:** Ingress kaynaklarında tanımlanan host, path, backend service gibi kuralları okur ve bunları altta yatan yük dengeleyici veya proxy üzerinde yapılandırır.
  • **Trafik Yönlendirme:** Gelen HTTP/HTTPS isteklerini doğru Servislere ve dolayısıyla Pod'lara yönlendirir.
  • **TLS Sonlandırma:** Ingress kaynağında belirtilen Secret'ları kullanarak HTTPS trafiğini sonlandırır.
  • **Özelleştirilebilir Davranış:** Birçok Ingress Controller, Kubernetes `Ingress` objesine ek olarak kendi özel kaynaklarını (Custom Resources) veya anotasyonları (annotations) kullanarak gelişmiş yapılandırma seçenekleri sunar (örneğin, yeniden yazma kuralları, hız sınırlama, kimlik doğrulama).

Popüler Ingress Controller Türleri:

  • **Nginx Ingress Controller:** En yaygın ve popüler Ingress Controller'lardan biridir. Ters proxy olarak Nginx'i kullanır. Hem HTTP hem de HTTPS trafiği için gelişmiş yönlendirme ve yapılandırma seçenekleri sunar.
  • **Traefik:** Cloud-native bir ters proxy ve yük dengeleyicidir. Dinamik yapılandırma özelliğiyle bilinir ve Kubernetes ile derin entegrasyonu vardır.
  • **HAProxy Ingress Controller:** HAProxy tabanlı bir başka güçlü Ingress Controller'dır.
  • **Cloud Sağlayıcılarına Özel Ingress Controller'lar:**
    • **AWS ALB Ingress Controller (şimdiki AWS Load Balancer Controller):** AWS Application Load Balancer (ALB) kullanarak Ingress kurallarını uygular.
    • **GCE Ingress Controller (Google Kubernetes Engine):** Google Cloud Load Balancer'ları kullanarak Ingress'i yönetir.
    • **Azure Application Gateway Ingress Controller (AGIC):** Azure Application Gateway'i kullanarak Ingress'i sağlar.
  • **Istio Ingress Gateway:** Bir servis ağı olan Istio'nun bir parçasıdır ve trafiği kümenin içine yönlendirmek için bir giriş noktası sağlar.

Ingress Controller'ın Rolü

🚦
Ingress Kaynağı

(Kurallar: Host, Path, Service)

↓ İzleme
🤖
Ingress Controller

(Kubernetes API'yi İzler)

↓ Yapılandırma
🌐
Fiziksel Yük Dengeleyici / Proxy

(Nginx, ALB, Traefik)

↓ Gelen Trafik
Kubernetes Servisleri

Ingress Controller, Ingress kaynaklarını okur ve altta yatan trafik yönlendirme mekanizmasını yapılandırır.

Ingress ve LoadBalancer Tipi Service Karşılaştırması

Uygulamaları dışarıya açmak için hem `Ingress` hem de `LoadBalancer` tipli `Service` kullanılabilir. Ancak, her birinin farklı kullanım senaryoları ve avantajları vardır.

Özellik Ingress LoadBalancer Tipi Service
**Ana Amaç** HTTP/HTTPS trafiğini host/path kurallarına göre Servislere yönlendirme, TLS sonlandırma. TCP/UDP trafik yük dengelemesi, bir Servisi harici bir IP ile açığa çıkarma.
**Protokol Desteği** HTTP, HTTPS (Katman 7). TCP, UDP (Katman 4). HTTP/HTTPS de kullanabilir, ancak gelişmiş yönlendirme için değil.
**Maliyet** Tek bir Ingress Controller arkasında birden fazla uygulama barındırılabilir, maliyet etkin olabilir. Genellikle her LoadBalancer Service için ayrı bir bulut yük dengeleyici (ve maliyet) oluşur.
**Gelişmiş Yönlendirme** Host tabanlı (Virtual Hosts), Path tabanlı yönlendirme, URL yeniden yazma, kimlik doğrulama gibi özellikler. Basit TCP/UDP port yönlendirmesi ve yük dengeleme.
**TLS Yönetimi** Ingress objesi üzerinden merkezi TLS sonlandırma ve sertifika yönetimi (Kubernetes Secret ile). LoadBalancer'ın kendisi TLS sonlandırma yapabilir (bulut sağlayıcısına bağlı olarak), ancak Kubernetes içinde doğrudan yönetimi yoktur.
**Bağımlılık** Çalışmak için bir Ingress Controller'a ihtiyaç duyar. Bulut sağlayıcınızın yük dengeleyici hizmetine doğrudan bağımlıdır.
**Ne Zaman Kullanılır?** Çoklu web uygulaması/API, host/path tabanlı yönlendirme, merkezi TLS, CDN entegrasyonu gerektiğinde. TCP/UDP tabanlı servisler (veritabanları, Redis), basit HTTP/HTTPS açma, her servisin kendi harici IP'sine ihtiyacı olduğunda.

Sonuç

Kubernetes'te `Ingress` ve `Ingress Controller` ikilisi, uygulamalarınıza dış dünyadan HTTP ve HTTPS trafiğini merkezi, esnek ve maliyet etkin bir şekilde yönlendirmek için güçlü bir çözüm sunar. Ingress objeleri, trafiğin nasıl yönlendirileceğini bildirimsel olarak tanımlarken, Ingress Controller'lar bu kuralları altta yatan yük dengeleyiciler veya ters proxy'ler üzerinde hayata geçirir.

`LoadBalancer` tipi Servisler basit dışa açma senaryoları için uygun olsa da, `Ingress` gelişmiş trafik yönetimi, TLS sonlandırma ve host/path tabanlı yönlendirme gibi yetenekler sunarak modern, çoklu servisli uygulamalar için daha tercih edilen bir çözümdür. Doğru Ingress Controller'ı seçmek ve Ingress kaynaklarını etkin bir şekilde yapılandırmak, Kubernetes'teki uygulamalarınızın dışarıdan erişilebilirliğini ve performansını optimize etmek için hayati öneme sahiptir.