NGINX Ingress Controller Tanımları

ergün elvan bilsel
6 min readApr 26, 2024

NGINX Ingress Controller, Kubernetes cluster içerisindeki uygulamalara HTTP ve HTTPS yoluyla erişim sağlamak için kullanılan bir araçtır. Bu controller, dış trafiği alarak uygun servislere yönlendirir. NGINX Ingress Controller’ın kullanımının önemi, özellikle yük dengeleme, SSL/TLS şifreleme ve ad tabanlı sanal hosting gibi özellikleri kolaylıkla yönetebilmesidir. Kubernetes ortamında, Ingress Controller’ı kurmak için öncelikle bir Ingress Controller seçmeli ve ardından bu controller’ı ilgili Ingress kaynaklarıyla yapılandırmalısınız.

Örnek bir NGINX Ingress Controller kurulum komutu:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.0/deploy/static/provider/cloud/deploy.yaml

Bu komut, standart NGINX Ingress Controller kurulumunu başlatır. Kurulum tamamlandıktan sonra, uygulamalarınıza yönlendirme kuralları ekleyebilirsiniz. Bu kurallar genellikle YAML dosyaları aracılığıyla tanımlanır. İşte basit bir Ingress kaynağı örneği:

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

Bu yapılandırma, www.example.com adresine gelen tüm trafiği, example-service adlı servise ve bu servisin 80 numaralı portuna yönlendirir. NGINX Ingress Controller, bu tür yönlendirmeleri dinamik olarak yönetebilir, bu da uygulama trafiğinin verimli bir şekilde dengelenmesini sağlar.

NGINX Service Mesh Rolü ve İşlevleri

NGINX Service Mesh, Kubernetes servisler arası iletişimi güvenli ve izlenebilir bir şekilde yönetmek için tasarlanmıştır. Bu service mesh, mikroservis mimarilerindeki servislerin buluşmasını, güvenlik politikalarının uygulanmasını ve trafik yönetiminin optimizasyonunu sağlar. Service mesh’in temel işlevleri arasında hizmet keşfi, yük dengeleme, hata toleransı, servisler arası güvenlik ve izleme bulunmaktadır.

Service mesh kullanmanın avantajları şunlardır:

  • Güvenlik: Tüm iletişimi TLS ile şifreleyerek ağ güvenliğini sağlar.
  • Gözlemenebilirlik: Trafik akışlarını izleyerek ve metrikler toplayarak uygulamanın sağlığını izleme.
  • Yapılandırma ve Yönetim: Servisler arası etkileşimleri merkezi olarak yönetme ve yapılandırma güncellemelerini kolaylıkla uygulama.

NGINX Service Mesh kurulumu genellikle bir komut satırı arayüzü (CLI) üzerinden gerçekleştirilir. Örnek bir kurulum komutu şöyledir:

nginx-meshctl deploy

Bu komut, NGINX Service Mesh’inizi başlatır ve gerekli tüm bileşenleri otomatik olarak Kubernetes cluster’ınıza yerleştirir. Mesh’in düzgün çalışabilmesi için, tüm mikroservislerin mesh ağına dahil edilmesi gerekir. Bu, genellikle mikroservislerin deployment tanımlarına eklenen bir sidecar proxy ile sağlanır.

(Service Mesh) Entegrasyon Faydaları

NGINX Ingress Controller ve NGINX Service Mesh’in entegrasyonu, yüksek düzeyde güvenlik, performans ve kolaylık sağlar. Bu entegrasyon, ağ trafiğini merkezi bir noktadan yönetmenize olanak tanırken, mikro hizmetler arası iletişimi şeffaf bir şekilde güvence altına alır. İşte bu entegrasyonun sağladığı faydalardan bazıları:

  • Artırılmış Güvenlik: Uçtan uca şifreleme sayesinde veri ihlalleri riski azalır.
  • Daha İyi Trafik Kontrolü: İsteklerin yönlendirilmesi ve yük dengelemesi daha etkin bir şekilde gerçekleştirilir.
  • Kolay Yapılandırma: Ingress kuralları ve güvenlik politikaları tek bir arayüz üzerinden yönetilir.

Entegrasyonun bir örneği olarak, NGINX Ingress Controller ile bir Service Mesh proxy’sinin nasıl çalıştığını gösteren bir yapılandırma düşünebiliriz. Aşağıda, NGINX Ingress kaynağına bir HTTP güvenlik politikası eklemek için kullanılan bir Kubernetes manifest örneği yer almaktadır:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: secure-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/secure-backends: "true"
spec:
tls:
- hosts:
- "example.com"
secretName: example-tls
rules:
- host: "example.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: secure-service
port:
number: 443

Bu yapılandırma, example.com domain'i için HTTPS trafiğini zorlar ve tüm trafiği secure-service adlı Kubernetes servisine yönlendirir.

(Service Mesh) Mimari Yaklaşımlar

NGINX Service Mesh’in mimarisi, Kubernetes cluster’ındaki mikro servisler arası iletişimde merkezi bir rol oynar. Bu mimari, her bir mikro servise yerleştirilen sidecar proxy’ler aracılığıyla çalışır. Sidecar proxy’ler, servislerin ağ trafiğini şeffaf bir şekilde yönlendirir ve güvenlik politikalarını uygular.

Mimariyi daha iyi anlamak için NGINX Service Mesh’in temel bileşenlerini ele alalım:

  • Control Plane: Tüm yapılandırmaların ve politikaların yönetildiği merkezi bileşendir.
  • Data Plane: Trafik akışını kontrol eden ve proxy’ler aracılığıyla iletişimi sağlayan bileşendir.

Aşağıda, Kubernetes cluster’ında NGINX Service Mesh kurulumu için bir örnek Helm chart komutu bulunmaktadır:

helm install nginx-mesh nginx-mesh/nginx-mesh --set mesh.controlPlane.security.enabled=true

Bu komut, güvenlik özelliklerini etkinleştirerek NGINX Service Mesh’in kontrol ve veri düzlemini kurar. Bu düzenleme, ağ trafiğinin güvenliğini ve izlenebilirliğini artırırken, sistem genelinde kesintisiz bir hizmet sunar.

Kurulum Prosedürleri

NGINX Ingress Controller ve NGINX Service Mesh’in kurulumu, Kubernetes cluster’ınıza modern, güvenli ve izlenebilir bir ağ çözümü sunar. Bu araçların kurulumu, çeşitli yöntemlerle gerçekleştirilebilir ve genellikle birkaç adımı kapsar.

NGINX Ingress Controller için kurulum genellikle aşağıdaki adımları içerir:

  1. NGINX Ingress Controller için gerekli olan Namespace’in oluşturulması.
  2. Ingress Controller’ın YAML dosyalarının uygulanması.
  3. İlgili Servislerin ve Yönlendirme Kurallarının tanımlanması.

Örnek bir Namespace oluşturma komutu:

kubectl create namespace nginx-ingress

Ve NGINX Ingress Controller kurulumunu başlatmak için kullanılan tipik bir komut:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml -n nginx-ingress

NGINX Service Mesh kurulumu ise genellikle NGINX’in sağladığı CLI araçları kullanılarak gerçekleştirilir. İşte basit bir Service Mesh kurulum komutu:

nginx-meshctl deploy --mesh-name my-mesh

Bu komut, belirtilen my-mesh adıyla NGINX Service Mesh'i başlatır ve gerekli tüm yapılandırmaları otomatik olarak uygular. Bu kurulum, mikro servisler arasındaki iletişimi güvenli ve izlenebilir hale getirir, ayrıca yük dengeleme ve hata toleransı gibi özellikler sunar.

Detaylar: NGINX Service Mesh CLI ve Helm ile Kurulum

NGINX Service Mesh, Kubernetes içinde mikro servislerin iletişimini yönetmek ve güvenliğini sağlamak için kullanılan kompleks bir araçtır. CLI ve Helm aracılığıyla kurulum yapmak, bu süreci otomatikleştirir ve kullanıcı hatalarını azaltır.

NGINX Service Mesh CLI Kurulumu: NGINX Service Mesh’in CLI aracı, mesh’i kolayca kurmanızı ve yönetmenizi sağlar. Aşağıda, NGINX Service Mesh CLI ile kurulum için bir örnek komut bulunmaktadır:

nginx-meshctl install --nginx-mesh-config=./config.yaml

Bu komut, belirtilen yapılandırma dosyasını kullanarak NGINX Service Mesh’i kurar.

Helm ile NGINX Service Mesh Kurulumu: Helm, Kubernetes uygulamalarının paket yönetim aracıdır. NGINX Service Mesh’i Helm kullanarak kurmak için öncelikle bir Helm chart gereklidir. İşte bir Helm kurulum komutu örneği:

helm install my-nginx-mesh nginx/nginx-service-mesh --namespace nginx-mesh

Bu komut, nginx-mesh namespace'inde my-nginx-mesh adında bir NGINX Service Mesh instance'ı başlatır.

NGINX Kubernetes Ortamlarında Kurulum Önkoşulları

NGINX Ingress Controller veya NGINX Service Mesh’i Kubernetes cluster’ınıza kurmadan önce, belirli önkoşulların sağlanması gerekir. Bu önkoşullar genellikle aşağıdakileri içerir:

  1. Kubernetes Sürüm Uyumluluğu: Kurulum yapılacak Kubernetes sürümünün, NGINX ürünleri ile uyumlu olması gerekir.
  2. Yeterli Kaynaklar: Controller ve mesh, belirli miktarda CPU ve bellek gerektirir. Cluster’ınızda bu kaynakların mevcut olduğundan emin olun.
  3. Bağımlılıkların Kurulması: NGINX ürünlerinin bazı bağımlılıkları olabilir. Örneğin, Helm veya özel bir CLI aracının kurulu olması gerekebilir.

Önkoşulları kontrol etmek için Kubernetes cluster’ınızın mevcut durumunu inceleyebilir ve gerekli araçları kurabilirsiniz. İşte bir örnek kontrol komutu:

kubectl cluster-info

SSL Termination ve HTTP Yönlendirme

SSL Termination, güvenli bir şekilde trafiği şifresiz hale getirerek performansı artırır ve uygulamaların yönetimini kolaylaştırır. HTTP tabanlı yönlendirme ise, gelen isteklerin doğru servislere gitmesini sağlar.

SSL Termination Örneği:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ssl-termination-example
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
tls:
- hosts:
- "example.com"
secretName: example-tls
rules:
- host: "example.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80

Bu yapılandırma, example.com için gelen tüm HTTPS trafiğini belirli bir servise yönlendirir ve SSL şifrelemesini yönetir. Bu, kullanıcıların verilerinin güvenliğini artırırken, uygulamanın performansını da korur.

Yük Dengeleme ve TLS Passthrough Yapılandırmaları

Yük dengeleme, yüksek trafik durumlarında uygulamalar arasında trafiği etkin bir şekilde dağıtmak için kullanılır. TLS passthrough, TLS/SSL şifrelemesinin uçtan uca korunmasını sağlar, yani şifreleme ve deşifreleme işlemleri doğrudan uç noktalarda gerçekleşir.

Yük Dengeleme ve TLS Passthrough Örneği:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-passthrough-example
annotations:
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
tls:
- hosts:
- "secure.example.com"
rules:
- host: "secure.example.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: secure-backend
port:
number: 443

Bu yapılandırma, secure.example.com için gelen HTTPS trafiğini, TLS/SSL şifrelemesi ile doğrudan secure-backend servisine yönlendirir. Bu yöntem, özellikle güvenlik gereksinimleri yüksek uygulamalar için tercih edilir.

Annotasyon Kullanımı

NGINX Ingress kaynaklarında annotasyonlar, özel davranışların tanımlanmasında kullanılır. Örneğin, URL yeniden yazma, özel loglama, limitler gibi özellikler annotasyonlar aracılığıyla tanımlanabilir.

Annotasyon Kullanımı Örneği:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: annotation-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: "rewrite.example.com"
http:
paths:
- path: /oldpath(/|$)(.*)
pathType: Prefix
backend:
service:
name: rewrite-service
port:
number: 80

Bu örnek, gelen isteklerin URL’sini yeniden yazarak, rewrite-service adlı servise yönlendirir. Eski yol /oldpath ile gelen trafik, servisin anlayabileceği yeni bir yola çevrilir.

Genel Yapılandırmalar: ConfigMaps

NGINX Ingress Controller, global seviyede yapılandırmaları yönetmek için ConfigMaps kullanır. Bu, loglama seviyelerini ayarlamak, SSL politikalarını tanımlamak veya özel zaman aşımı limitleri belirlemek gibi işlemleri içerebilir.

ConfigMaps Örneği:

apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configuration
namespace: nginx-ingress
data:
log-format-upstream: "host=$host remote_addr=$remote_addr request_time=$request_time"
ssl-protocols: "TLSv1.2 TLSv1.3"
keepalive-timeout: "65"

Bu ConfigMap, NGINX Ingress Controller için bazı global yapılandırmaları tanımlar. Bu yapılandırmalar, tüm Ingress kaynaklarına uygulanır ve performansı veya güvenliği etkileyebilir.

Canary Dağıtımlar ve Trafik Kontrolü

Canary dağıtımları, yeni sürümlerin küçük bir kullanıcı grubuna sunularak potansiyel sorunların büyük ölçekli etkilerini azaltmayı amaçlar. NGINX Ingress ile canary dağıtımlar, belirli kullanıcılar veya trafik yüzdesine göre yönlendirme yapılarak gerçekleştirilir.

Canary Dağıtımı Örneği:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: canary-example
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
spec:
rules:
- host: "canary.example.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: canary-service
port:
number: 80

Bu yapılandırma, trafiğin %20'sinin canary sürümüne yönlendirilmesini sağlar, böylece yeni özelliklerin riskini azaltarak test edilmesine olanak tanır.

Başlık Manipülasyonu

  • Annotasyonlar kullanarak istek başlıkları dinamik olarak değiştirilir.
metadata:
annotations:
nginx.ingress.kubernetes.io/add-headers: |
X-Custom-Header: value

mTLS Kimlik Doğrulama

  • Karşılıklı TLS, istemci ve sunucu doğrulamasını sağlar.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"

Yük Dengeleme Senaryoları

Çeşitli yük dengeleme yöntemleri; round robin, en az bağlantı.

metadata:
annotations:
nginx.ingress.kubernetes.io/load-balancing: "ewma"

Multi-Tenancy ve Namespace İzolasyonu

  • Namespace izolasyonu, kaynakları güvenli bir şekilde gruplandırır.
kind: Namespace
metadata:
name: tenant-a

--

--