Takip et

Kubernetes Ingress Açıklaması: Yönlendirme, TLS ve Gerçek Dünya Örnekleri

Kubernetes, modern uygulama dağıtımı ve yönetimi için vazgeçilmez bir platform haline gelmiştir. Ancak, küme içindeki servislerinizi dış dünyaya…

Kubernetes Ingress Açıklaması: Yönlendirme, TLS ve Gerçek Dünya Örnekleri

Kubernetes, modern uygulama dağıtımı ve yönetimi için vazgeçilmez bir platform haline gelmiştir. Ancak, küme içindeki servislerinizi dış dünyaya güvenli ve verimli bir şekilde açmak, özellikle birden fazla uygulamanız varsa, karmaşık bir hal alabilir. İşte tam bu noktada Kubernetes Ingress devreye girer. Ingress, küme içindeki servislere HTTP ve HTTPS trafiği için dışarıdan erişim sağlamanın en esnek ve güçlü yoludur. Bu makalede, Ingress’in ne olduğunu, nasıl çalıştığını, yönlendirme kurallarını, TLS yönetimini ve gerçek dünya senaryolarında nasıl kullanıldığını detaylı örneklerle inceleyeceğiz.

Ingress Nedir ve Neden İhtiyaç Duyarız?

Kubernetes kümelerindeki uygulamalar genellikle Service nesneleri aracılığıyla birbirleriyle iletişim kurar. Ancak bu Service nesneleri (ClusterIP, NodePort, LoadBalancer gibi) dış dünyadan doğrudan erişim sağlamak için her zaman yeterli veya ideal değildir. Özellikle birden fazla uygulamanız varsa ve her birine özel bir IP adresi veya port atamak istemiyorsanız, Ingress’e ihtiyaç duyarsınız.

Kubernetes’te Dışarıya Açılma İhtiyacı

Bir web uygulamasını Kubernetes kümesi içinde çalıştırdığınızda, kullanıcıların bu uygulamaya internet üzerinden erişebilmesi gerekir. Kubernetes, bu ihtiyacı karşılamak için çeşitli Service tipleri sunar:

  • ClusterIP: Sadece küme içinden erişilebilir.
  • NodePort: Her worker node üzerinde belirli bir port açarak dışarıdan erişim sağlar, ancak bu port genellikle statik ve yüksek numaralıdır.
  • LoadBalancer: Bulut sağlayıcınızdan bir dış yük dengeleyici temin eder ve trafiği servislerinize yönlendirir. Her servis için ayrı bir LoadBalancer maliyetli ve yönetimi zor olabilir.

Service Nesnelerinin Sınırlılıkları

NodePort ve LoadBalancer tipleri dış erişim sağlasa da, bazı sınırlamalara sahiptir:

  • Tek IP ile Çoklu Servis Yönetimi: Her bir LoadBalancer ayrı bir dış IP adresi gerektirir. Birden fazla uygulamanız varsa, çok sayıda IP adresi yönetmek karmaşıklaşır ve maliyetli olabilir.
  • Gelişmiş Yönlendirme Eksikliği: URL yoluna (path-based routing) veya alan adına (host-based routing) göre trafik yönlendirme yeteneği sınırlıdır.
  • TLS/SSL Yönetimi: Sertifika yönetimi ve HTTPS sonlandırması genellikle manuel veya ek araçlarla yapılmalıdır.

Ingress’in Sağladığı Avantajlar

Ingress, yukarıdaki sınırlamaları aşarak daha gelişmiş bir çözüm sunar:

  • Tek IP, Çoklu Servis: Tek bir dış IP adresi veya alan adı üzerinden birden fazla servisi yönetmenizi sağlar.
  • Gelişmiş Yönlendirme Kuralları: Gelen HTTP/HTTPS isteklerini host adına veya URL yoluna göre farklı servislere yönlendirebilir.
  • TLS/SSL Sonlandırma: HTTPS trafiğini sonlandırabilir ve sertifika yönetimini kolaylaştırır.
  • Yük Dengeleme: Gelen trafiği otomatik olarak arka uç servislerine dağıtır.
  • Esneklik: Yeniden yazma (rewrite), kimlik doğrulama gibi gelişmiş özellikler için annotation’lar (ek açıklamalar) kullanabilir.

Ingress Kaynağının Temel Bileşenleri

Bir Ingress kaynağı, Kubernetes API’sinde tanımlanan bir nesnedir ve gelen trafiğin nasıl yönlendirileceğini belirtir. İşte bir Ingress kaynağının temel bileşenleri:

apiVersion, kind, metadata

Her Kubernetes nesnesi gibi, Ingress de apiVersion (genellikle networking.k8s.io/v1), kind (Ingress) ve metadata (name, namespace, annotations gibi) alanlarına sahiptir.

spec.rules: Yönlendirme Kuralları

Bu bölüm, gelen trafiğin hangi host’a (alan adına) ve hangi yola (path) göre hangi Kubernetes servisine yönlendirileceğini tanımlar. Her kural bir host ve bir veya daha fazla http.paths içerebilir.

spec.tls: TLS Yapılandırması

Bu bölüm, HTTPS trafiğini sonlandırmak için kullanılacak TLS sertifikalarını belirtir. Genellikle bir Kubernetes Secret nesnesinde saklanan sertifika ve özel anahtar çiftine referans verir.

spec.defaultBackend: Varsayılan Arka Uç

Eğer gelen istekler hiçbir kurala uymazsa, trafiğin yönlendirileceği varsayılan bir servisi tanımlar. Bu, genellikle bir hata sayfası veya ana sayfa olabilir.

Basit Bir Ingress YAML Örneği

Aşağıdaki örnek, my-app.example.com alan adına gelen tüm trafiği my-service adlı servisin 80 numaralı portuna yönlendiren basit bir Ingress kaynağını gösterir:


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: basic-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: my-app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

Ingress Controller'lar: Kalp Atışı

Ingress kaynağı, sadece bir kural setidir; bu kuralları uygulayan ve trafiği gerçekten yönlendiren bir bileşene ihtiyaç duyarız: Ingress Controller. Ingress Controller, Kubernetes kümesi içinde çalışan ve Ingress kaynaklarını izleyen bir yazılımdır. Yeni Ingress kaynakları oluşturulduğunda veya mevcutlar güncellendiğinde, Controller bu değişiklikleri algılar ve kendi yapılandırmasını güncelleyerek gelen trafiği doğru servislere yönlendirir.

Ingress Kaynağı ve Controller İlişkisi

Ingress Controller olmadan bir Ingress kaynağının hiçbir etkisi olmaz. Ingress Controller, genellikle bir LoadBalancer Service veya NodePort Service aracılığıyla dış dünyaya açılır ve tüm gelen trafiği karşılar. Ardından, Ingress kurallarına göre trafiği küme içindeki uygun servislere iletir.

Popüler Ingress Controller'lar

Piyasada birçok farklı Ingress Controller bulunmaktadır, her birinin kendine özgü avantajları ve özellikleri vardır:

  • Nginx Ingress Controller: En popüler ve yaygın kullanılan Controller'dır. Nginx proxy sunucusunu temel alır ve zengin özellik setine sahiptir.
  • HAProxy Ingress Controller: Yüksek performanslı HAProxy yük dengeleyicisini kullanır.
  • Traefik: Dinamik konfigürasyon ve otomatik servis keşfi gibi modern özelliklere sahip, bulut yerel bir yük dengeleyici ve API ağ geçididir.
  • Cloud Provider Ingress Controllers: AWS ALB Ingress Controller, GKE Ingress (Google Cloud Load Balancer), Azure Application Gateway Ingress Controller gibi bulut sağlayıcılarına özel çözümler, bulutun yerel yük dengeleme hizmetleriyle entegrasyon sağlar.

Bir Controller Kurulumunun Önemi

Ingress kullanmaya başlamadan önce, kümenize bir Ingress Controller kurmanız şarttır. Kurulum adımları seçtiğiniz Controller'a göre değişir, ancak genellikle bir dizi YAML manifestini uygulayarak bir Deployment ve Service oluşturmayı içerir.

Yönlendirme Kuralları: Path-Based ve Host-Based

Ingress'in en güçlü özelliklerinden biri, gelen trafiği farklı kriterlere göre yönlendirme yeteneğidir. Bu, özellikle birden fazla uygulamanın veya uygulamanın farklı bölümlerinin tek bir dış erişim noktası üzerinden sunulması gerektiğinde kullanışlıdır.

Host-Based Routing: Alan Adına Göre Yönlendirme

Host-based routing, gelen isteğin HTTP Host başlığına bakarak trafiği farklı servislere yönlendirmenizi sağlar. Bu, aynı Ingress Controller'ı kullanarak birden fazla alan adını (örneğin, app1.example.com ve app2.example.com) yönetmek için idealdir.


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: host-based-ingress
spec:
  rules:
  - host: app1.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service-app1
            port:
              number: 80
  - host: app2.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service-app2
            port:
              number: 80

Yukarıdaki örnekte, app1.example.com adresine gelen istekler service-app1'e, app2.example.com adresine gelen istekler ise service-app2'ye yönlendirilir.

Path-Based Routing: URL Yoluna Göre Yönlendirme

Path-based routing, aynı alan adı altında farklı URL yollarına (örneğin, example.com/api ve example.com/dashboard) gelen trafiği farklı servislere yönlendirmenizi sağlar. Bu, tek bir alan adı altında birden fazla mikroservisi veya uygulamanın farklı bileşenlerini sunmak için kullanışlıdır.


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: path-based-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2 # Path'in /api/v1/(.*) kısmını yakalar ve /$2 olarak gönderir.
spec:
  rules:
  - host: mydomain.com
    http:
      paths:
      - path: /api/v1(/|$)(.*)
        pathType: Prefix # veya ImplementationSpecific
        backend:
          service:
            name: api-service
            port:
              number: 8080
      - path: /dashboard(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: dashboard-service
            port:
              number: 80

Bu örnekte, mydomain.com/api/v1 ile başlayan istekler api-service'e, mydomain.com/dashboard ile başlayan istekler ise dashboard-service'e yönlendirilir. rewrite-target annotation'ı, arka uç servisine gönderilen URL'yi yeniden yazmak için kullanılır.

pathType alanının üç değeri vardır:

  • Prefix: Belirtilen yolla başlayan tüm URL'leri eşleştirir.
  • Exact: Belirtilen yolla tam olarak eşleşen URL'leri eşleştirir.
  • ImplementationSpecific: Controller'a özgü bir eşleştirme davranışı anlamına gelir (genellikle regex destekler).

TLS/SSL ile Güvenli İletişim

Günümüzde web uygulamaları için HTTPS kullanımı bir standart haline gelmiştir. Ingress, TLS/SSL sertifikalarını yönetme ve HTTPS trafiğini sonlandırma konusunda güçlü yetenekler sunar.

Neden TLS Kullanmalıyız?

TLS (Transport Layer Security), istemci ve sunucu arasındaki iletişimi şifreleyerek veri bütünlüğünü ve gizliliğini sağlar. Bu, özellikle hassas verilerin (kullanıcı bilgileri, şifreler vb.) aktarıldığı uygulamalar için kritik öneme sahiptir.

Secret Nesneleri ile Sertifika Yönetimi

Kubernetes'te TLS sertifikaları ve özel anahtarlar, kubernetes.io/tls tipi bir Secret nesnesinde saklanır. Bu Secret, sertifikanın kendisini (tls.crt) ve özel anahtarını (tls.key) içerir.


apiVersion: v1
kind: Secret
metadata:
  name: my-tls-secret
  namespace: default
type: kubernetes.io/tls
data:
  tls.crt: |
    # base64 kodlanmış sertifika içeriği
    # (örneğin, cat cert.pem | base64 -w 0)
  tls.key: |
    # base64 kodlanmış özel anahtar içeriği
    # (örneğin, cat key.pem | base64 -w 0)

Bu Secret oluşturulduktan sonra, Ingress kaynağında bu Secret'a referans vererek HTTPS'i etkinleştirebilirsiniz.

Ingress Üzerinden TLS Yapılandırması

Bir Ingress kaynağında TLS'i etkinleştirmek için spec.tls bölümünü kullanırız. Bu bölümde, hangi host'lar için TLS'in etkinleştirileceğini ve hangi Secret'ın kullanılacağını belirtiriz.


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tls-ingress
spec:
  tls:
  - hosts:
    - secure.example.com
    secretName: my-tls-secret # Yukarıda oluşturduğumuz Secret'ın adı
  rules:
  - host: secure.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: secure-app-service
            port:
              number: 443 # Arka uç servisi HTTPS kullanıyorsa

Bu yapılandırma ile secure.example.com adresine gelen HTTPS istekleri, my-tls-secret içinde tanımlı sertifika ile sonlandırılır ve ardından secure-app-service'e yönlendirilir.

Let's Encrypt ve Cert-Manager ile Otomatik TLS

Sertifikaları manuel olarak oluşturmak ve yönetmek zahmetli olabilir. Cert-Manager gibi araçlar, Let's Encrypt gibi CA'lardan otomatik olarak TLS sertifikaları almanızı ve yenilemenizi sağlar. Cert-Manager'ı kümenize kurduktan sonra, Ingress kaynaklarınızda özel annotation'lar kullanarak otomatik sertifika sağlamayı etkinleştirebilirsiniz. Bu, özellikle dinamik ve sürekli değişen ortamlarda büyük kolaylık sağlar.


apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cert-manager-ingress
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod" # Cert-Manager Issuer'ınızın adı
spec:
  tls:
  - hosts:
    - auto-tls.example.com
    secretName: auto-tls-secret # Cert-Manager bu secret'ı otomatik oluşturacak/güncelleyecek
  rules:
  - host: auto-tls.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app-service
            port:
              number: 80

Gerçek Dünya Ingress Örnekleri

Ingress'in esnekliği, karmaşık senaryoları yönetmek için harika fırsatlar sunar.

Çoklu Uygulama Tek Alan Adı Üzerinden

Bir e-ticaret sitesi düşünün. Ana sayfa, ürünler ve kullanıcı paneli farklı servisler tarafından sunuluyor olabilir:

  • shop.example.com/ -> frontend-service
  • shop.example.com/api/ -> api-service
  • shop.example.com/admin/ -> admin-service

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: e-commerce-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: shop.example.com
    http:
      paths:
      - path: /api(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80
      - path: /admin(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: admin-service
            port:
              number: 80
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80

Farklı Ortamlar İçin Ayrı Ingress'ler

Geliştirme, test ve üretim ortamlarınız için farklı alan adları kullanmak isteyebilirsiniz:

  • dev.example.com -> Geliştirme ortamı
  • staging.example.com -> Test ortamı
  • prod.example.com -> Üretim ortamı

Her ortam için ayrı bir Ingress kaynağı veya aynı Ingress kaynağı içinde farklı host kuralları tanımlayabilirsiniz. Genellikle, her ortamın kendi namespace'i ve kendi Ingress kaynağı olması daha iyi bir izolasyon sağlar.

Redirect'ler ve Rewrite'lar (Annotation'lar ile)

Ingress Controller'lar, annotation'lar aracılığıyla ek özellikler sunar. Örneğin, Nginx Ingress Controller ile HTTP'den HTTPS'e yönlendirme veya URL yeniden yazma işlemleri yapabilirsiniz:

  • HTTP'den HTTPS'e Yönlendirme:
    
            apiVersion: networking.k8s.io/v1
            kind: Ingress
            metadata:
              name: redirect-ingress
              annotations:
                nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
                cert-manager.io/cluster-issuer: "letsencrypt-prod"
            spec:
              tls:
              - hosts:
                - myapp.example.com
                secretName: myapp-tls-secret
              rules:
              - host: myapp.example.com
                http:
                  paths:
                  - path: /
                    pathType: Prefix
                    backend:
                      service:
                        name: myapp-service
                        port:
                          number: 80
            

  • URL Yeniden Yazma (Rewrite): Daha önce path-based routing örneğinde gösterildiği gibi, nginx.ingress.kubernetes.io/rewrite-target annotation'ı ile gelen URL yolunu arka uç servisine göndermeden önce değiştirebilirsiniz.

Ingress Sınırlamaları ve Alternatifleri

Ingress, birçok senaryo için harika bir çözüm olsa da, her şeyi kapsamaz. Bazı durumlarda daha gelişmiş çözümlere ihtiyaç duyulabilir.

Ingress'in Sağlayamadığı Gelişmiş Özellikler

Ingress, temel HTTP/HTTPS yönlendirme ve TLS sonlandırma için tasarlanmıştır. Ancak aşağıdaki gibi özellikler genellikle doğrudan Ingress spesifikasyonunda yer almaz ve Ingress Controller'ın annotation'ları veya ek araçlar gerektirir:

  • Gelişmiş kimlik doğrulama ve yetkilendirme (OAuth2, JWT doğrulaması)
  • Rate limiting (oran sınırlama)
  • Web Uygulama Güvenlik Duvarı (WAF) özellikleri
  • Gelişmiş trafik yönetimi (A/B testi, canary dağıtımları)
  • Servisler arası iletişim için özellikler (Service Mesh)

API Gateway'ler ve Service Mesh'ler

Daha gelişmiş trafik yönetimi, güvenlik ve gözlemlenebilirlik gereksinimleriniz varsa, API Gateway'ler veya Service Mesh'ler gibi çözümleri düşünebilirsiniz.

  • API Gateway: Uygulama katmanında zengin özellikler sunan bir ters proxy'dir. Kimlik doğrulama, oran sınırlama, önbellekleme, dönüşüm ve izleme gibi yeteneklere sahiptir. Kong, Apigee, Ambassador gibi ürünler bu kategoriye girer. Bir API Gateway, Ingress Controller'ın önüne veya yerine kullanılabilir.
  • Service Mesh: Mikroservis mimarilerinde servisler arası iletişimi yönetmek için tasarlanmış bir altyapı katmanıdır. Trafik yönlendirme, hata toleransı, güvenlik ve gözlemlenebilirlik gibi konularda kapsamlı çözümler sunar. Istio, Linkerd, Consul Connect popüler Service Mesh çözümleridir. Service Mesh, genellikle Ingress Controller ile birlikte çalışır; Ingress dış trafiği küme içine getirirken, Service Mesh küme içi servisler arası trafiği yönetir.

Sonuç

Kubernetes Ingress, uygulamalarınızı dış dünyaya güvenli ve esnek bir şekilde açmak için güçlü ve maliyet etkin bir çözümdür. Host-based ve path-based yönlendirme kuralları sayesinde tek bir erişim noktası üzerinden birden fazla servisi yönetebilir, TLS entegrasyonu ile güvenli iletişimi kolayca sağlayabilirsiniz. Doğru Ingress Controller seçimi ve Cert-Manager gibi araçlarla entegrasyon, Ingress yönetimini daha da basitleştirir. Daha karmaşık senaryolar için API Gateway'ler veya Service Mesh'ler gibi alternatifleri değerlendirmek gerekse de, çoğu web uygulaması için Ingress, Kubernetes ekosisteminin vazgeçilmez bir parçasıdır.

Sıkça Sorulan Sorular (SSS)

Ingress Controller'ı nasıl kurarım?

Ingress Controller kurulumu, seçtiğiniz Controller'a göre değişir. Genellikle, Controller'ın resmi belgelerinde belirtilen YAML manifestlerini kubectl apply -f komutuyla uygulayarak bir Deployment ve bir Service (genellikle LoadBalancer tipi) oluşturursunuz. Örneğin, Nginx Ingress Controller için Helm chart'ları veya direkt manifestler mevcuttur.

Ingress ile LoadBalancer arasındaki fark nedir?

LoadBalancer tipi bir Kubernetes Service, bulut sağlayıcınızdan doğrudan bir dış yük dengeleyici (örn. AWS ELB, GCP Load Balancer) temin eder ve trafiği doğrudan bir Kubernetes Service'e yönlendirir. Her LoadBalancer Service'i genellikle kendi dış IP adresine sahiptir ve gelişmiş HTTP yönlendirme yetenekleri sınırlıdır. Ingress ise, tek bir LoadBalancer (genellikle Ingress Controller'ın önünde) kullanarak birden fazla servise gelişmiş HTTP/HTTPS yönlendirme kuralları (host-based, path-based) sağlar ve TLS yönetimini kolaylaştırır.

Tek bir Ingress kaynağı birden fazla alan adını yönetebilir mi?

Evet, kesinlikle. Bir Ingress kaynağı, spec.rules altında birden fazla host tanımı içerebilir. Her host için ayrı yönlendirme kuralları ve hatta ayrı TLS sertifikaları (farklı secretName'ler ile) belirleyebilirsiniz.

Ingress'te performans sorunları yaşarsam ne yapmalıyım?

Performans sorunları genellikle Ingress Controller'ın kaynak kısıtlamalarından (CPU, Bellek) veya yanlış yapılandırmadan kaynaklanır. Şunları kontrol edebilirsiniz:

  • Ingress Controller Pod'larının kaynak limitlerini artırın.
  • Controller loglarını inceleyerek hataları veya darboğazları tespit edin.
  • Ingress Controller'ın ölçeklenebilirliğini artırmak için birden fazla replika çalıştırın.
  • Özel Ingress Controller annotation'larını kullanarak performansı optimize edin (örn. Nginx için buffer boyutları, keepalive ayarları).

Ingress'e kimlik doğrulama ekleyebilir miyim?

Ingress spesifikasyonu doğrudan kimlik doğrulama sağlamaz. Ancak çoğu Ingress Controller, annotation'lar aracılığıyla temel kimlik doğrulama (Basic Auth) veya daha gelişmiş yöntemler için (OAuth2 proxy entegrasyonu gibi) destek sunar. Örneğin, Nginx Ingress Controller, nginx.ingress.kubernetes.io/auth-type ve nginx.ingress.kubernetes.io/auth-secret gibi annotation'lar ile Basic Auth yapılandırmasına izin verir. Daha karmaşık senaryolar için bir API Gateway kullanmak daha uygun olabilir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.