DigitalOcean Kubernetes Üzerinde Nginx Ingress ve Cert-Manager Kurulumu: Kapsamlı Bir Rehber
Modern uygulama geliştirme ve dağıtım süreçlerinde Kubernetes, konteyner tabanlı iş yüklerini yönetmek için vazgeçilmez bir platform haline gelmiştir. Mikroservis mimarileri ve bulut yerel uygulamaların yükselişiyle birlikte, bu uygulamaların dış dünyaya güvenli ve verimli bir şekilde açılması kritik bir öneme sahiptir. Bu bağlamda, Nginx Ingress Controller ve Cert-Manager gibi araçlar, Kubernetes ekosisteminde temel taşlardan sayılır. Bu makalede, DigitalOcean Kubernetes (DOKS) üzerinde bu iki güçlü aracı nasıl kuracağımızı ve yapılandıracağımızı adım adım inceleyeceğiz. Amacımız, uygulamalarınıza hem güvenli HTTPS erişimi sağlamak hem de trafik yönlendirmesini merkezi bir şekilde yönetmektir.
Giriş: Kubernetes’te Trafik Yönetimi ve SSL Otomasyonu
Kubernetes, bir uygulamanın dağıtımını, ölçeklendirmesini ve yönetimini basitleştirse de, dış dünyadan gelen trafiği uygulamalara yönlendirme ve bu trafiği HTTPS ile güvence altına alma konuları özel bir yaklaşım gerektirir.
* Ingress: Kubernetes’te Ingress, küme içindeki servislere dışarıdan HTTP/HTTPS erişimi sağlayan bir API nesnesidir. Bir Ingress Controller (örneğin Nginx Ingress Controller) ise bu Ingress kurallarını uygulayan ve trafiği doğru servislere yönlendiren bir bileşendir. Geleneksel Load Balancer’ların aksine, Ingress Controller daha gelişmiş yönlendirme kuralları (host tabanlı, yol tabanlı), SSL sonlandırma ve daha birçok özellik sunar.
* Cert-Manager: Sertifika yönetimi, özellikle SSL/TLS sertifikalarının oluşturulması, yenilenmesi ve dağıtılması süreçleri genellikle manuel ve hataya açık olabilir. Cert-Manager, Kubernetes kümelerinde sertifika yönetimini otomatikleştirerek bu süreci basitleştirir. Let’s Encrypt gibi ücretsiz sertifika sağlayıcılarıyla entegre olarak, uygulamalarınız için otomatik olarak sertifika alabilir ve yenileyebilir.
DigitalOcean Kubernetes, yönetilen bir Kubernetes hizmeti sunarak altyapı karmaşıklığını azaltır. Bu sayede geliştiriciler, temel altyapı yönetimi yerine uygulama geliştirmeye odaklanabilirler. Bu makale, DOKS’un sağladığı avantajları kullanarak Nginx Ingress ve Cert-Manager’ı nasıl entegre edeceğimizi detaylandıracaktır.
Ön Koşullar
Bu rehbere başlamadan önce aşağıdaki ön koşulların karşılandığından emin olun:
* DigitalOcean Hesabı: Aktif bir DigitalOcean hesabınız olmalı.
* DigitalOcean Kubernetes Kümesi (DOKS): DigitalOcean üzerinde çalışan bir Kubernetes kümeniz olmalı. Eğer yoksa, DigitalOcean kontrol panelinden kolayca oluşturabilirsiniz.
* kubectl Kurulumu: Kubernetes kümenizle etkileşim kurmak için yerel makinenizde kubectl komut satırı aracının kurulu ve yapılandırılmış olması gerekir. Küme yapılandırma dosyasını (kubeconfig) DigitalOcean kontrol panelinden indirerek kubectl‘i kümenize bağlayabilirsiniz.
* helm Kurulumu: Kubernetes uygulamalarını yönetmek için bir paket yöneticisi olan Helm’in yerel makinenizde kurulu olması gerekmektedir. Helm 3 sürümü önerilir.
* Alan Adı (Domain Name): Uygulamalarınıza erişmek için kullanacağınız bir alan adına sahip olmanız ve bu alan adının DNS kayıtlarını yönetebiliyor olmanız gerekmektedir. Bu rehberde example.com gibi bir alan adı kullanacağız, siz kendi alan adınızı kullanmalısınız.
* doctl (İsteğe Bağlı): DigitalOcean API ile etkileşim kurmak için doctl komut satırı aracı isteğe bağlıdır ancak bazı işlemleri kolaylaştırabilir.
DigitalOcean Kubernetes Kümesi Oluşturma (Kısa Bakış)
Eğer henüz bir DOKS kümeniz yoksa, DigitalOcean kontrol paneli üzerinden veya doctl CLI aracıyla kolayca oluşturabilirsiniz.
DigitalOcean Kontrol Paneli Üzerinden:
1. DigitalOcean hesabınıza giriş yapın.
2. Sol menüden “Kubernetes” seçeneğine tıklayın.
3. “Create Kubernetes Cluster” butonuna tıklayın.
4. Bölge, Kubernetes sürümü, node havuzu boyutları ve sayısını seçerek kümenizi oluşturun.
doctl CLI ile:
doctl kubernetes cluster create \
--region \
--version \
--node-pool "name=worker-pool;size=;count="
Küme oluşturulduktan sonra, kubeconfig dosyasını indirip ~/.kube/config dizinine yerleştirerek kubectl‘i yapılandırın:
doctl kubernetes cluster kubeconfig save
Kümenizin çalıştığını doğrulamak için:
kubectl get nodes
Nginx Ingress Controller Kurulumu
Nginx Ingress Controller, gelen trafiği Kubernetes servislerinize yönlendirmek için temel bileşendir. Helm kullanarak kurulumu oldukça basittir.
1. Helm Repository Ekleme
Öncelikle Nginx Ingress Controller’ın Helm repository’sini eklememiz gerekiyor:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
2. Nginx Ingress Controller’ı Kurma
Şimdi Ingress Controller’ı ingress-nginx adında ayrı bir namespace’e kuralım. DigitalOcean Kubernetes’te Ingress Controller’ı bir LoadBalancer tipi servis olarak dağıttığımızda, DigitalOcean otomatik olarak bir Load Balancer (Yük Dengeleyici) oluşturur ve bu Load Balancer’a bir genel IP adresi atar. Bu IP adresi, uygulamalarınıza dışarıdan erişim için kullanılacaktır.
helm install nginx-ingress ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace \
--set controller.service.type=LoadBalancer \
--set controller.service.externalTrafficPolicy=Local
* --namespace ingress-nginx --create-namespace: Ingress Controller’ı ingress-nginx adında bir namespace’e kurar ve eğer yoksa bu namespace’i oluşturur.
* --set controller.service.type=LoadBalancer: Bu ayar, DigitalOcean’da otomatik olarak bir Load Balancer oluşturulmasını sağlar.
* --set controller.service.externalTrafficPolicy=Local: Bu ayar, istemci kaynak IP adresinin korunmasına yardımcı olur ve trafiği yalnızca Ingress Controller’ın çalıştığı düğümlere yönlendirir.
3. Kurulumu Doğrulama ve Load Balancer IP Adresini Alma
Ingress Controller’ın başarıyla dağıtıldığını ve DigitalOcean Load Balancer’ın oluşturulduğunu doğrulamak için servisleri kontrol edin:
kubectl get svc -n ingress-nginx
Çıktı aşağıdaki gibi olacaktır:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress-controller LoadBalancer 10.245.X.Y XXX.XXX.XXX.XXX 80:31448/TCP,443:32402/TCP 2m
nginx-ingress-defaultbackend ClusterIP 10.245.A.B 80/TCP 2m
nginx-ingress-controller servisinin EXTERNAL-IP sütununda gördüğünüz IP adresi, DigitalOcean Load Balancer’ınızın genel IP adresidir. Bu IP adresini bir yere not edin.
4. DNS Kaydı Oluşturma
Uygulamalarınıza alan adınız üzerinden erişebilmek için, alan adınızın DNS kayıtlarında bir A kaydı oluşturmanız gerekmektedir. Bu A kaydını, yukarıda elde ettiğiniz EXTERNAL-IP adresine işaret etmelisiniz.
Örneğin, app.example.com adresi üzerinden uygulamanıza erişmek istiyorsanız, DNS sağlayıcınızın kontrol panelinde aşağıdaki gibi bir kayıt oluşturmalısınız:
* Type: A
* Host: app (veya @ eğer ana alan adını kullanacaksanız)
* Value: XXX.XXX.XXX.XXX (Load Balancer’ınızın EXTERNAL-IP adresi)
* TTL: (Genellikle varsayılan değer bırakılabilir, örneğin 3600 saniye)
DNS değişikliklerinin internet genelinde yayılması biraz zaman alabilir (genellikle birkaç dakika ila birkaç saat).
Cert-Manager Kurulumu
Nginx Ingress Controller trafiği yönlendirecek olsa da, HTTPS trafiği için SSL/TLS sertifikalarına ihtiyacımız var. Cert-Manager, bu sertifikaları otomatik olarak yönetecek ve yenileyecektir.
1. Helm Repository Ekleme
Cert-Manager’ın Helm repository’sini ekleyin:
helm repo add jetstack https://charts.jetstack.io
helm repo update
2. Cert-Manager’ı Kurma
Cert-Manager’ı cert-manager adında ayrı bir namespace’e kuralım. Kurulum sırasında CRD’leri (Custom Resource Definitions) de yüklemesini sağlamak önemlidir.
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager --create-namespace \
--version v1.13.1 \
--set installCRDs=true
* --version v1.13.1: Belirli bir Cert-Manager sürümünü yüklemenizi sağlar. En güncel kararlı sürümü kullanmak iyi bir pratiktir.
* --set installCRDs=true: Cert-Manager’ın çalışması için gerekli olan Custom Resource Definitions’ı (Issuer, Certificate, CertificateRequest vb.) kurar.
3. Kurulumu Doğrulama
Cert-Manager’ın tüm bileşenlerinin çalıştığını doğrulamak için pod’ları kontrol edin:
kubectl get pods -n cert-manager
Tüm pod’ların Running durumunda olması gerekir:
NAME READY STATUS RESTARTS AGE
cert-manager-5d465c87f4-xxxxx 1/1 Running 0 2m
cert-manager-cainjector-78c4d76c6d-yyyyy 1/1 Running 0 2m
cert-manager-webhook-7d77b878b-zzzzz 1/1 Running 0 2m
Issuer ve ClusterIssuer Konfigürasyonu
Cert-Manager, sertifikaları düzenlemek için Issuer veya ClusterIssuer kaynaklarını kullanır. Issuer, sertifikaları belirli bir namespace içinde düzenlerken, ClusterIssuer küme genelinde sertifika düzenleyebilir. Genellikle ClusterIssuer tercih edilir, böylece farklı namespace’lerdeki uygulamalar aynı sertifika sağlayıcıyı kullanabilir. Let’s Encrypt ile çalışacağımız için ClusterIssuer kullanacağız.
Önce Let’s Encrypt’in “staging” ortamını kullanarak sertifika almayı denemek iyi bir uygulamadır. Bu, Let’s Encrypt’in “rate limit”lerine takılmadan yapılandırmanızı test etmenizi sağlar.
1. Let’s Encrypt Staging ClusterIssuer Oluşturma
letsencrypt-staging-clusterissuer.yaml adında bir dosya oluşturun:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
# E-posta adresinizi buraya girin. Let's Encrypt size sertifika yenileme bildirimlerini gönderecektir.
email: your-email@example.com
server: https://acme-staging-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# ACME hesabınızın özel anahtarının saklanacağı Kubernetes Secret adı.
name: letsencrypt-staging-private-key
solvers:
- http01:
ingress:
class: nginx
* email: Kendi e-posta adresinizi girmeniz zorunludur.
* server: Let’s Encrypt’in staging (test) ortamının URL’si.
* privateKeySecretRef: ACME hesabınızın özel anahtarının saklanacağı Secret’ın adı.
* solvers: Cert-Manager’ın alan adı sahipliğini nasıl doğrulayacağını belirtir. http01 challenge tipi, Ingress Controller üzerinden geçici bir web sunucusu başlatarak doğrulamayı yapar. ingress.class: nginx ise Nginx Ingress Controller’ı kullanacağımızı belirtir.
Bu dosyayı uygulayın:
kubectl apply -f letsencrypt-staging-clusterissuer.yaml
2. Let’s Encrypt Production ClusterIssuer Oluşturma
Staging ortamında testleriniz başarılı olduğunda, üretim ortamı için ClusterIssuer‘ı oluşturabilirsiniz. letsencrypt-production-clusterissuer.yaml adında bir dosya oluşturun:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-production
spec:
acme:
# E-posta adresinizi buraya girin. Let's Encrypt size sertifika yenileme bildirimlerini gönderecektir.
email: your-email@example.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# ACME hesabınızın özel anahtarının saklanacağı Kubernetes Secret adı.
name: letsencrypt-production-private-key
solvers:
- http01:
ingress:
class: nginx
Tek fark server URL’sinin https://acme-v02.api.letsencrypt.org/directory olmasıdır.
Bu dosyayı uygulayın:
kubectl apply -f letsencrypt-production-clusterissuer.yaml
ClusterIssuer‘larınızın durumunu kontrol edebilirsiniz:
kubectl get clusterissuers
Durumları Ready olarak görünmelidir.
Örnek Bir Uygulama Dağıtma
Şimdi Nginx Ingress Controller ve Cert-Manager’ı test etmek için basit bir uygulama dağıtalım. Bu, “Hello World” benzeri bir Nginx web sunucusu olacaktır.
1. Nginx Deployment Oluşturma
nginx-deployment.yaml adında bir dosya oluşturun:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-example
labels:
app: nginx-example
spec:
replicas: 2
selector:
matchLabels:
app: nginx-example
template:
metadata:
labels:
app: nginx-example
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Bu dağıtım, nginx:latest imajını kullanarak iki adet Nginx pod’u oluşturur.
2. Nginx Service Oluşturma
Bu pod’lara erişimi sağlamak için bir ClusterIP tipi servis oluşturalım. nginx-service.yaml adında bir dosya oluşturun:
apiVersion: v1
kind: Service
metadata:
name: nginx-example-service
spec:
selector:
app: nginx-example
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
Bu servis, app: nginx-example etiketine sahip pod’lara gelen trafiği 80 numaralı porttan yönlendirecektir.
Her iki dosyayı da uygulayın:
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
Uygulamanızın çalıştığını doğrulamak için:
kubectl get pods -l app=nginx-example
kubectl get svc nginx-example-service
Ingress Kaynağı Oluşturma
Şimdi Nginx Ingress Controller’ı, app.example.com adresinden gelen trafiği nginx-example-service‘e yönlendirmesi ve Cert-Manager’ı kullanarak bu alan adı için otomatik olarak bir SSL sertifikası alması için yapılandıracağız.
nginx-ingress.yaml adında bir dosya oluşturun:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-example-ingress
annotations:
# Cert-Manager'a bu Ingress için sertifika vermesini söyleyen annotation
cert-manager.io/cluster-issuer: letsencrypt-production # Veya letsencrypt-staging
# Nginx Ingress Controller için bazı ayarlar (isteğe bağlı)
nginx.ingress.kubernetes.io/ssl-redirect: "true" # Tüm HTTP isteklerini HTTPS'ye yönlendirir
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
ingressClassName: nginx # Nginx Ingress Controller'ı kullanacağımızı belirtir
rules:
- host: app.example.com # Kendi alan adınızı buraya girin
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-example-service
port:
number: 80
tls:
- hosts:
- app.example.com # Kendi alan adınızı buraya girin
secretName: nginx-example-tls # Sertifikanın saklanacağı Kubernetes Secret adı
* cert-manager.io/cluster-issuer: letsencrypt-production: Cert-Manager’a, letsencrypt-production adlı ClusterIssuer‘ı kullanarak bu Ingress için bir sertifika almasını söyler. İlk testleriniz için letsencrypt-staging kullanmayı unutmayın.
* nginx.ingress.kubernetes.io/ssl-redirect: "true": HTTP üzerinden gelen tüm istekleri otomatik olarak HTTPS’ye yönlendirir.
* ingressClassName: nginx: Kubernetes 1.18 ve sonrası için önerilen Ingress Controller sınıfını belirtir.
* host: app.example.com: Uygulamanıza erişmek için kullanacağınız alan adıdır. Kendi alan adınızla değiştirin.
* backend: Gelen trafiğin yönlendirileceği Kubernetes servisini belirtir.
* tls: Bu bölüm, Cert-Manager’ın sertifika almasını ve bu sertifikayı belirtilen secretName altında saklamasını sağlar. Ingress Controller bu secret’ı kullanarak SSL sonlandırması yapacaktır.
Bu Ingress kaynağını uygulayın:
kubectl apply -f nginx-ingress.yaml
Sertifika Talebi ve Durumunu İzleme
Ingress kaynağını uyguladıktan sonra Cert-Manager otomatik olarak bir Certificate nesnesi oluşturacak ve Let’s Encrypt’ten sertifika talebinde bulunacaktır. Bu süreci izleyebilirsiniz:
# Oluşturulan Certificate nesnesini görüntüle
kubectl get certificate -n default # Uygulamanızın ve Ingress'inizin olduğu namespace
Certificate nesnesinin detaylarını incele (olası hatalar için)
kubectl describe certificate nginx-example-tls -n default
Cert-Manager'ın loglarını kontrol et (sorun giderme için)
kubectl logs -n cert-manager deploy/cert-manager-5d465c87f4-xxxxx # Kendi pod adınızla değiştirin
Sertifika başarıyla alındığında, kubectl get certificate çıktısında READY sütunu True olmalı ve SECRET sütununda nginx-example-tls secret’ının adı görünmelidir.
Test ve Doğrulama
Her şey yolunda gittiyse, şimdi tarayıcınızdan https://app.example.com (kendi alan adınızla değiştirin) adresine giderek uygulamanıza erişebilmelisiniz.
* Tarayıcınızda bir kilit simgesi görmelisiniz, bu da HTTPS bağlantısının güvenli olduğunu gösterir.
* Kilit simgesine tıklayarak sertifika detaylarını inceleyebilir ve Let’s Encrypt tarafından verildiğini doğrulayabilirsiniz.
* HTTP üzerinden (http://app.example.com) erişmeye çalıştığınızda otomatik olarak HTTPS’ye yönlendirildiğinizi görmelisiniz.
Sık Karşılaşılan Sorunlar ve Çözümleri
Kurulum sürecinde bazı sorunlarla karşılaşmanız olasıdır. İşte yaygın sorunlar ve çözüm ipuçları:
* DNS Yayılımı Sorunları: Alan adınızın EXTERNAL-IP adresine doğru şekilde işaret ettiğinden emin olun. DNS değişikliklerinin tam olarak yayılması biraz zaman alabilir. dig app.example.com veya nslookup app.example.com komutlarıyla DNS çözümlemesini kontrol edin.
* Cert-Manager Sertifika Alamıyor:
* kubectl describe certificate komutunun çıktısını inceleyin. Genellikle burada hatanın nedeni belirtilir.
* kubectl logs -n cert-manager deploy/cert-manager- komutuyla Cert-Manager pod’unun loglarını kontrol edin.
* ClusterIssuer yapılandırmanızdaki e-posta adresinin doğru olduğundan emin olun.
* http01 challenge için Ingress Controller’ınızın doğru şekilde çalıştığından ve 80 numaralı porttan erişilebilir olduğundan emin olun.
* Let’s Encrypt’in “rate limit”lerine takılmamak için önce staging ortamını kullandığınızdan emin olun.
* Ingress Controller Trafiği Yönlendirmiyor:
* kubectl get ingress komutuyla Ingress’inizin durumunu kontrol edin.
* kubectl describe ingress komutunun çıktısını inceleyin. Kuralların doğru servislere işaret ettiğinden emin olun.
* Nginx Ingress Controller pod’unun loglarını kontrol edin: kubectl logs -n ingress-nginx deploy/nginx-ingress-controller-.
* ingressClassName: nginx tanımının doğru olduğundan ve Nginx Ingress Controller’ın bu sınıfı kullandığından emin olun.
* Yanlış ClusterIssuer Kullanımı: Ingress tanımınızdaki cert-manager.io/cluster-issuer annotation’ının, oluşturduğunuz ClusterIssuer‘ın name alanıyla tam olarak eşleştiğinden emin olun.
Gelişmiş Konfigürasyonlar (Kısaca)
Bu rehber temel bir kurulumu kapsasa da, Nginx Ingress ve Cert-Manager daha gelişmiş senaryolar için de kullanılabilir:
Wildcard Sertifikalar (DNS-01 Challenge): .example.com gibi wildcard sertifikalar almak için Cert-Manager’ın DNS-01 challenge yöntemini kullanmanız gerekir. Bu, genellikle DNS sağlayıcınızın API’si ile entegrasyon gerektirir (DigitalOcean DNS için Cert-Manager’ın DigitalOcean DNS webhook’u kullanılabilir).
* Farklı Ingress Controller Seçenekleri: Kubernetes ekosisteminde Nginx dışında Contour, Traefik, HAProxy gibi farklı Ingress Controller’lar da mevcuttur. İhtiyaçlarınıza göre farklı birini seçebilirsiniz.
* GitOps Yaklaşımları: Tüm Kubernetes kaynaklarınızı (Deployment, Service, Ingress, Issuer vb.) Git repolarında tutarak ve Argo CD veya Flux CD gibi araçlarla otomatik olarak senkronize ederek GitOps prensiplerini uygulayabilirsiniz.
* Daha Fazla Ingress Kuralı: Tek bir Ingress kaynağı altında birden fazla host veya yol tabanlı kural tanımlayarak farklı uygulamaları veya aynı uygulamanın farklı bölümlerini yönlendirebilirsiniz.
Sonuç
Bu kapsamlı rehberde, DigitalOcean Kubernetes üzerinde Nginx Ingress Controller ve Cert-Manager’ı başarıyla kurmayı ve yapılandırmayı öğrendiniz. Artık uygulamalarınızı dış dünyaya güvenli ve verimli bir şekilde açabilir, trafiği yönlendirebilir ve Let’s Encrypt ile otomatik olarak SSL/TLS sertifikaları alıp yenileyebilirsiniz. Bu entegrasyon, Kubernetes tabanlı uygulamalarınız için güvenilir, otomatik ve ölçeklenebilir bir trafik yönetimi ve güvenlik altyapısı sağlar.
DigitalOcean Kubernetes’in sunduğu kolaylıklar sayesinde, karmaşık altyapı kurulumları yerine uygulama geliştirmeye odaklanabilir ve modern bulut yerel mimarilerin tüm avantajlarından faydalanabilirsiniz. Bu yetenekler, üretim ortamında çalışan uygulamalar için temel bir gereklilik olup, geliştiricilerin ve operasyon ekiplerinin iş yükünü önemli ölçüde azaltmaktadır. Gelecekte, daha gelişmiş trafik yönetimi ve güvenlik senaryoları için bu temel kurulumun üzerine inşa edebilirsiniz.