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:
- **Port Çakışmaları:** `NodePort` kullanıldığında, her Servis'in her düğümde benzersiz bir port açması gerekir ki bu büyük kümelerde yönetimi zorlaştırır.
- **Maliyet:** Her `LoadBalancer` tipli Servis genellikle bulut sağlayıcınızda ayrı bir yük dengeleyici (ve dolayısıyla ek maliyet) oluşturur.
- **Gelişmiş Yönlendirme:** Host tabanlı yönlendirme (örneğin `app1.example.com` ve `app2.example.com` adreslerini farklı servislere yönlendirme) veya path tabanlı yönlendirme (örneğin `example.com/api` ve `example.com/blog` adreslerini farklı servislere yönlendirme) gibi gelişmiş trafik yönetimi yetenekleri doğrudan `Service` objeleriyle sağlanamaz.
İş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ışı
(www.example.com/)
(Kurallar)
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ü
(Kurallar: Host, Path, Service)
(Kubernetes API'yi İzler)
(Nginx, ALB, Traefik)
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.