Ingress-Nginx, Kubernetes ortamında çalışan bir Ingress Controller'dır. Nginx web sunucusunu kullanarak Kubernetes üzerindeki servisler için HTTP ve HTTPS yönlendirme işlemlerini yönetir. Kubernetes Ingress kaynaklarını okuyarak, belirlenen trafik yönlendirme kurallarına uygun şekilde HTTP trafiğini yönlendirir.
Kubernetes ortamında çalışan uygulamalara dış dünyadan erişim sağlamak için birden fazla yol vardır:
- 🔌 NodePort: Her servisin belirli bir port üzerinden erişilebilir olmasını sağlar.
- 🌐 LoadBalancer: Bulut sağlayıcılarının sunduğu yük dengeleyicileri kullanarak erişim sağlar.
- 🚪 Ingress: Tek bir giriş noktası oluşturarak birden fazla servise yönlendirme yapar.
➡️ Ingress-Nginx, Ingress kaynaklarını kullanarak tek bir IP adresi üzerinden farklı servislerin farklı domain ve path bazlı yönlendirilmesini sağlar, böylece yönetimi kolaylaştırır.
- ✔️ Tek Bir Giriş Noktası: Birden fazla servisi yönetmek yerine, tek bir Load Balancer veya IP adresi üzerinden farklı servislerin erişimini sağlar.
- ✔️ 🔐 Güvenlik: TLS/SSL desteği ile güvenli bağlantılar oluşturabilir.
- ✔️ 📊 Yük Dengeleme: HTTP trafiğini verimli şekilde dağıtarak performansı artırır.
- ✔️ 🔀 URL Bazlı Yönlendirme: Farklı yolları (path) farklı servislere yönlendirme imkanı sunar.
- ✔️ ⚙️ Gelişmiş Konfigürasyon: Rate limiting, authentication, custom headers gibi gelişmiş özellikleri destekler.
- 1️⃣ Kullanıcı İsteği → Kullanıcı, belirlenen bir domain veya path üzerinden Kubernetes cluster'a HTTP(S) isteği gönderir.
- 2️⃣ Ingress Kaynakları → Kubernetes'te tanımlanan Ingress kaynakları, hangi domain ve path’in hangi servise yönlendirileceğini belirtir.
- 3️⃣ Ingress-Nginx Controller → Ingress kaynaklarını okuyarak Nginx konfigürasyonlarını oluşturur ve günceller.
- 4️⃣ Servislere Yönlendirme → Gelen HTTP isteğini ilgili Kubernetes servisine yönlendirir.
- 5️⃣ Yanıt Dönüşü → Servis tarafından dönen yanıt, Ingress-Nginx üzerinden kullanıcının tarayıcısına iletilir.
- ✅ TLS/SSL Kullanın 🔒: Tüm trafiği HTTPS üzerinden yönlendirerek güvenliği artırın.
- ✅ Rate Limiting Uygulayın 🚦: DDoS saldırılarına karşı koruma sağlamak için istek oranlarını sınırlayın.
- ✅ Güncel ve Optimize Edilmiş Konfigürasyonlar Kullanın 🛠️: Nginx yapılandırmasını ve limitlerini gerektiği gibi ayarlayın.
- ✅ Health Check ve Monitoring Kullanın 📈: Prometheus ve Grafana ile metrikleri toplayarak durumu izleyin.
- Kubernetes Dağıtımı: k3s (Hafif olduğu için tercih edildi)
- İşletim Sistemi: Ubuntu 24 LTS 🐧
- Gereksinimler: MetalLB, Prometheus/Grafana 📊
- Hedef: Kubernetes üzerinde Ingress-Nginx ile dış dünyaya servis yayınlamak 🌍
Kubernetes ortamında aşağıdaki bileşenlerin yüklü olması gerekiyor:
✅ Kubernetes cluster'ı (k3s veya rke2)
✅ Helm (Paket yöneticisi)
✅ Cert-Manager (SSL sertifikaları için)Eğer bunlar yüklü değilse, önce bu bileşenleri yükleyin!
K3s yüklemek için aşağıdaki komutu çalıştırın:
curl -sfL https://get.k3s.io | sh -K3s’in çalıştığını kontrol edin:
systemctl status k3sKubeconfig ayarlarını yapılandırın:
export KUBECONFIG=/etc/rancher/k3s/k3s.yamlOturum kapandığında bu ayar kaybolur, kalıcı yapmak için:
echo "export KUBECONFIG=/etc/rancher/k3s/k3s.yaml" >> ~/.bashrc
source ~/.bashrcHelm paket yöneticisini yüklemek için aşağıdaki komutu kullanın:
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bashKurulumun başarılı olup olmadığını kontrol etmek için:
helm versionÖncelikle Traefik kaldırılmalı:
kubectl get helmchart -A
kubectl delete helmchart traefik -n kube-system
kubectl delete helmchart traefik-crd -n kube-systemArdından Ingress-Nginx Controller kurulumu yapılır:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx --create-namespaceKurulumun başarılı olup olmadığını kontrol etmek için:
kubectl get pods -n ingress-nginxEğer hali hazırda bir nginx deployment yoksa, aşağıdaki gibi bir nginx deployment ve service oluşturmalısın.
nginx-deployment.yamlapiVersion: apps/v1 # Deployment API versiyonu
kind: Deployment # Kaynak türü: Deployment
metadata:
name: nginx # Deployment adı
namespace: monitoring # Bu deployment'in içinde bulunduğu namespace
labels:
app: nginx # Uygulama etiketi
spec:
replicas: 1 # Çalışacak pod sayısı
selector:
matchLabels:
app: nginx # Pod'ları seçmek için etiket eşlemesi
template:
metadata:
labels:
app: nginx # Pod etiketi
spec:
containers:
- name: nginx # Konteyner adı
image: nginx:latest # Kullanılacak Nginx imajı
ports:
- containerPort: 80 # Konteynerin dinlediği portnginx-service.yamlapiVersion: v1 # Servis API versiyonu
kind: Service # Kaynak türü: Service
metadata:
name: nginx # Servis adı
namespace: monitoring # Servisin içinde bulunduğu namespace
spec:
selector:
app: nginx # Hangi pod'lara yönlendirileceğini belirten etiket
ports:
- protocol: TCP # Kullanılan protokol
port: 80 # Servisin dinlediği port
targetPort: 80 # Yönlendirme yapılacak konteyner portu
type: ClusterIP # Servisin türü (ClusterIP: iç ağda erişilebilir)kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yamlMetalLB’yi yükleyin:
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/main/config/manifests/metallb-native.yamlIP Havuzu Tanımla:
metallb-config.yaml dosyası oluştur:apiVersion: metallb.io/v1beta1 # MetalLB API versiyonu
kind: IPAddressPool # IP havuzu tanımlama
metadata:
name: first-pool # IP havuzu adı
namespace: metallb-system # MetalLB'nin çalıştığı namespace
spec:
addresses:
- 192.168.1.155-192.168.1.158 # Kullanılacak IP aralığı
---
apiVersion: metallb.io/v1beta1 # MetalLB API versiyonu
kind: L2Advertisement # Layer 2 duyurusu
metadata:
name: first-advertisement # Duyuru adı
namespace: metallb-system # MetalLB'nin çalıştığı namespaceYAML Dosyasını Uygula:
kubectl apply -f metallb-config.yaml- Cert-Manager’ı kurmak için aşağıdaki komutu çalıştır:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml- Pod’ların çalıştığını kontrol edelim:
kubectl get pods -n cert-manager- cert-manager-selfsigned-issuer.yaml
apiVersion: cert-manager.io/v1 # Cert-Manager API versiyonu
kind: ClusterIssuer # Kümeye genel sertifika sağlayıcısı tanımı
metadata:
name: selfsigned-cluster-issuer # ClusterIssuer adı
spec:
selfSigned: {} # Self-signed sertifika kullanımıkubectl apply -f cert-manager-selfsigned-issuer.yamlÖrnek ingress-ati-sites.yaml dosyası oluşturulup uygulanır.
ingress-ati-sites.yamlapiVersion: networking.k8s.io/v1 # Ingress API versiyonu
kind: Ingress # Kaynak türü: Ingress
metadata:
name: ati-sites # Ingress kaynağının adı
namespace: monitoring # Ingress'in bulunduğu namespace
annotations:
cert-manager.io/cluster-issuer: selfsigned-cluster-issuer # Sertifika yöneticisinin kullanacağı ClusterIssuer
spec:
ingressClassName: nginx # Kullanılacak ingress sınıfı
rules:
- host: ati.local # İlk alan adı kuralı
http:
paths:
- path: / # Tüm yolları yönlendir
pathType: Prefix # Yol türü
backend:
service:
name: nginx # Yönlendirilecek servis adı
port:
number: 80 # Servis portu
- host: ati-duran1.local # İkinci alan adı kuralı
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
- host: ati-duran2.local # Üçüncü alan adı kuralı
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
tls:
- hosts:
- ati.local # TLS için tanımlanan alan adları
- ati-duran1.local
- ati-duran2.local
secretName: ati-sites-tls # TLS için kullanılacak gizli anahtar adıkubectl apply -f ingress-ati-sites.yamlkubectl get ingress -ATüm servislerin çalıştığını doğrulamak için curl komutlarını çalıştırın:
curl -k https://ati.local
curl -k https://grafana.ati.local
curl -k https://prometheus.ati.local🎉 Kurulum tamamlandı! Artık Kubernetes ortamınızda Ingress-Nginx çalışıyor! 🚀
Prometheus ve Grafana’yı Helm ile kuracağız.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack --namespace monitoring --create-namespace- podları kontrol edelim
watch kubectl --namespace monitoring get pods -l "release=prometheus"ingress-prometheus.yamlapiVersion: networking.k8s.io/v1 # Ingress API versiyonu
kind: Ingress # Kaynak türü: Ingress
metadata:
name: prometheus # Ingress kaynağının adı
namespace: monitoring # Ingress'in bulunduğu namespace
annotations:
cert-manager.io/cluster-issuer: selfsigned-cluster-issuer # Sertifika yöneticisinin kullanacağı ClusterIssuer
spec:
ingressClassName: nginx # Kullanılacak ingress sınıfı
rules:
- host: prometheus.ati.local # Prometheus için alan adı kuralı
http:
paths:
- path: / # Tüm yolları yönlendir
pathType: Prefix # Yol türü
backend:
service:
name: prometheus-kube-prometheus-prometheus # Yönlendirilecek Prometheus servisi
port:
number: 9090 # Prometheus servisi portu
tls:
- hosts:
- prometheus.ati.local # TLS için tanımlanan alan adı
secretName: prometheus-tls # TLS için kullanılacak gizli anahtar adıkubectl apply -f ingress-prometheus.yamlgrafana-deployment.yaml apiVersion: apps/v1 # Deployment API versiyonu
kind: Deployment # Kaynak türü: Deployment
metadata:
name: grafana # Deployment adı
labels:
app: grafana # Uygulama etiketi
spec:
replicas: 1 # Çalışacak pod sayısı
selector:
matchLabels:
app: grafana # Pod'ları seçmek için etiket eşlemesi
template:
metadata:
labels:
app: grafana # Pod etiketi
spec:
containers:
- name: grafana # Konteyner adı
image: grafana/grafana:latest # Kullanılacak Grafana imajı
ports:
- containerPort: 80 # Konteynerin dinlediği port
---
apiVersion: v1 # Servis API versiyonu
kind: Service # Kaynak türü: Service
metadata:
name: grafana # Servis adı
spec:
selector:
app: grafana # Hangi pod'lara yönlendirileceğini belirten etiket
ports:
- protocol: TCP # Kullanılan protokol
port: 80 # Servisin dinlediği port
targetPort: 80 # Yönlendirme yapılacak konteyner portu
type: ClusterIP # Servisin türü (ClusterIP: iç ağda erişilebilir)grafana-service.yaml apiVersion: v1 # Servis API versiyonu
kind: Service # Kaynak türü: Service
metadata:
name: prometheus-grafana # Servis adı
namespace: monitoring # Servisin bulunduğu namespace
spec:
selector:
app.kubernetes.io/name: grafana # Hangi pod'lara yönlendirileceğini belirten etiket
ports:
- protocol: TCP # Kullanılan protokol
port: 80 # Servisin dinlediği port
targetPort: 3000 # Grafana'nın çalıştığı varsayılan port
type: ClusterIP # Servisin türü (ClusterIP: iç ağda erişilebilir)ingress-grafana.yaml apiVersion: networking.k8s.io/v1 # Ingress API versiyonu
kind: Ingress # Kaynak türü: Ingress
metadata:
name: grafana # Ingress kaynağının adı
namespace: monitoring # Ingress'in bulunduğu namespace
annotations:
cert-manager.io/cluster-issuer: selfsigned-cluster-issuer # Sertifika yöneticisinin kullanacağı ClusterIssuer
spec:
ingressClassName: nginx # Kullanılacak ingress sınıfı
rules:
- host: grafana.ati.local # Grafana için alan adı kuralı
http:
paths:
- path: / # Tüm yolları yönlendir
pathType: Prefix # Yol türü
backend:
service:
name: prometheus-grafana # Yönlendirilecek Grafana servisi
port:
number: 80 # Servis portu
tls:
- hosts:
- grafana.ati.local # TLS için tanımlanan alan adı
secretName: grafana-tls # TLS için kullanılacak gizli anahtar adıkubectl apply -f grafana-deployment.yaml
kubectl apply -f grafana-service.yaml
kubectl apply -f ingress-grafana.yamlTarayıcıdan Erişim için Adımlar
- /etc/hosts Dosyasına Kayıt Ekle
Linux veya macOS için:
sudo nano /etc/hostsWindows için: Dosyayı Not Defteri (Yönetici olarak çalıştırarak) aç:
C:\Windows\System32\drivers\etc\hostsŞu satırları ekleyin (Eğer yoksa): !!! "Örnek " "Sizde yukarıda ingress lerinize baktığınızda gelen ip olacaktır."
192.168.1.143 ati.local
192.168.1.143 ati-duran1.local
192.168.1.143 ati-duran2.local
192.168.1.143 grafana.ati.local
192.168.1.143 prometheus.ati.localKaydedip çıkın:
Linux/macOS: CTRL + X → Y → Enter
Windows: Dosya > Kaydet- Tarayıcıdan HTTPS ile Erişim
Aşağıdaki adreslerden HTTPS kullanarak erişebilirsiniz:
NGINX Sayfası: https://ati.local
NGINX Sayfası: https://ati-duran1.local
NGINX Sayfası: https://ati-duran2.local
Grafana: https://grafana.ati.local
Prometheus: https://prometheus.ati.localSertifika self-signed olduğu için tarayıcıda Güvenlik Uyarısı çıkabilir. Gelişmiş → Devam Et seçeneğiyle geçebilirsiniz.
- Grafana Şifresini Kubernetes Secret İçinden Öğrenme
- Prometheus Stack genellikle şifreyi bir Kubernetes Secret içinde saklar. Mevcut şifreyi görmek için:
kubectl get secret -n monitoring prometheus-grafana -o jsonpath="{.data.admin-password}" | base64 --decodeprom-operatorÇıktıda prometheus-kube-prometheus-prometheus gibi bir servis adı görmelisin. Örnek:
kubectl get svc -n monitoring- Prometheus’u Veri Kaynağı Olarak Ekle
- Veri kaynağı olarak "Prometheus" seç.
- URL kısmına aşağıdaki Kubernetes servis adresini gir:
http://prometheus-kube-prometheus-prometheus.monitoring.svc:9090- Scrape Interval: 15s (Varsayılan olarak bırakabilirsin).
- HTTP Method: GET olarak bırak.
- "Save & Test" butonuna tıkla.
📢 Geri Bildirim ve Katkı
Bu proje, Ingress-Nginx, MetalLB, Cert-Manager, Longhorn, Prometheus ve Grafana gibi bileşenleri kullanarak Kubernetes ortamında çalışmaktadır.
Eğer projeyi denerken bir hata ile karşılaşırsanız veya geliştirilmesi gerektiğini düşündüğünüz bir nokta varsa issue açabilir ya da pull request göndererek katkıda bulunabilirsiniz.
Geri bildirimlerinizi bekliyorum! 🙌
📩 Bana ulaşmak için: 🔹 LinkedIn: linkedln.com/atilladuran 🔹 E-posta: [email protected]
Teşekkürler! 🚀