Modern bulut tabanlı uygulamaların vazgeçilmezi olan Kubernetes, konteynerize edilmiş iş yüklerini yönetme konusunda eşsiz bir esneklik sunar. Ancak bu uygulamaların dış dünyaya güvenli bir şekilde açılması, özellikle de HTTPS üzerinden erişim sağlanması kritik bir öneme sahiptir. Bu rehberde, Kubernetes Ingress kaynaklarınızı Let’s Encrypt ile nasıl güvence altına alacağınızı, ücretsiz ve otomatik SSL/TLS sertifikaları kullanarak adım adım açıklayacağız.
Uygulamalarınızın kullanıcılar tarafından güvenle erişilebilir olması, sadece veri şifrelemesi için değil, aynı zamanda tarayıcıların “Güvenli Değil” uyarısını engellemek ve web sitenizin profesyonel imajını korumak için de hayati önem taşır. Let’s Encrypt ve cert-manager aracı, bu süreci tamamen otomatikleştirerek sertifika yönetiminin karmaşıklığını ortadan kaldırır.
Bu rehberde, bir Kubernetes kümesinde Ingress Controller’dan başlayarak, cert-manager kurulumuna, Let’s Encrypt ile sertifika talebinde bulunmaya ve son olarak Ingress kaynağınızı TLS ile yapılandırmaya kadar tüm adımları detaylı bir şekilde ele alacağız.
Ön Gereksinimler ve Temel Hazırlıklar
Bu rehberdeki adımları takip edebilmek için aşağıdaki ön gereksinimlere sahip olmanız gerekmektedir:
1. Çalışır Durumda Bir Kubernetes Kümesi
Herhangi bir bulut sağlayıcısında (GCP, AWS, Azure vb.) veya kendi sunucularınızda (on-premise) çalışan bir Kubernetes kümeniz olmalıdır. Bu küme üzerinde kubectl komutlarını çalıştırabiliyor ve yönetici yetkilerine sahip olmalısınız.
2. Bir Ingress Controller
Kubernetes Ingress kaynakları, gelen HTTP/HTTPS trafiğini küme içindeki servislere yönlendirmek için bir Ingress Controller’a ihtiyaç duyar. En yaygın kullanılanlardan biri olan Nginx Ingress Controller’ı bu rehberde varsayacağız. Eğer yüklü değilse, aşağıdaki komutlarla kurabilirsiniz:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml
Kurulumun ardından Nginx Ingress Controller’ın çalışıp çalışmadığını kontrol edelim:
kubectl get pods -n ingress-nginx
Bu komut, ingress-nginx namespace’indeki pod’ları listelemeli ve durumlarının Running olduğunu göstermelidir.
3. Alan Adı (Domain Name) ve DNS Yapılandırması
Sertifika alacağınız bir alan adına (örneğin, uygulamam.com) sahip olmalısınız. Bu alan adının bir A kaydı veya CNAME kaydı, Kubernetes Ingress Controller’ınızın dış IP adresini veya DNS adını işaret etmelidir. Ingress Controller’ınızın dış IP adresini aşağıdaki komutla bulabilirsiniz:
kubectl get services -n ingress-nginx ingress-nginx-controller
EXTERNAL-IP sütunundaki IP adresini not alın ve alan adınızın A kaydını bu IP adresine yönlendirin. DNS değişikliklerinin internet üzerinde yayılması biraz zaman alabilir.
4. Helm Kurulumu
cert-manager kurulumu için Helm paket yöneticisini kullanacağız. Helm yüklü değilse, işletim sisteminize uygun şekilde kurmanız gerekmektedir. Kurulum talimatları için Helm resmi dokümantasyonuna başvurabilirsiniz.
Cert-Manager Kurulumu
cert-manager, Kubernetes kümelerinde sertifikaların otomatik olarak sağlanması, yenilenmesi ve yönetilmesinden sorumlu güçlü bir araçtır. Let’s Encrypt gibi sertifika otoriteleriyle entegre olarak çalışır ve sertifika yönetimini sizin için basitleştirir.
1. Cert-Manager CRD’lerini Yükleme
cert-manager, Kubernetes’e özel kaynak tanımlamaları (Custom Resource Definitions – CRD’ler) ekler. Bu CRD’leri öncelikle yüklememiz gerekir:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.2/cert-manager.crds.yaml
Bu komut, Certificate, Issuer, ClusterIssuer gibi kaynakları Kubernetes API’sine tanıtır.
2. Cert-Manager Repository’sini Ekleme ve Kurulum
Şimdi Helm kullanarak cert-manager‘ı kuralım. Öncelikle Helm repository’sini ekliyoruz:
helm repo add jetstack https://charts.jetstack.io
helm repo update
Ardından, cert-manager‘ı ayrı bir namespace’e kuruyoruz. Bu, küme kaynaklarını düzenli tutmak için iyi bir pratiktir:
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.13.2 \
--set installCRDs=true
--set installCRDs=true parametresini eklemek, CRD’lerin otomatik olarak yüklenmesini sağlar, ancak yukarıdaki adımı zaten manuel olarak yaptığımız için bu parametre opsiyoneldir. Yine de Helm chart’ı bu şekilde yapılandırılmışsa kullanmakta fayda var.
3. Kurulumu Doğrulama
cert-manager pod’larının başarıyla çalıştığını kontrol edelim:
kubectl get pods --namespace cert-manager
Aşağıdakine benzer çıktılar görmelisiniz:
NAME READY STATUS RESTARTS AGE
cert-manager-5f677b588-abcd1 1/1 Running 0 5m
cert-manager-cainjector-785c494f6c-efgh2 1/1 Running 0 5m
cert-manager-webhook-64c87b8d8-ijkl3 1/1 Running 0 5m
Cert-Manager Yapılandırması: Issuer ve ClusterIssuer
cert-manager‘ın Let’s Encrypt ile iletişim kurabilmesi için bir Issuer veya ClusterIssuer kaynağı tanımlamamız gerekir. Bu kaynaklar, sertifika taleplerinin hangi sertifika otoritesine (CA) gönderileceğini ve hangi doğrulama yönteminin (challenge) kullanılacağını belirtir.
Issuer: Belirli bir namespace’e özgü sertifika yetkilendirmesi sağlar.ClusterIssuer: Tüm küme genelinde kullanılabilen sertifika yetkilendirmesi sağlar. Genellikle bu tercih edilir, çünkü sertifikaları farklı namespace’lerdeki uygulamalar için kullanmanıza olanak tanır.
Bu rehberde, tüm küme genelinde geçerli olacak bir ClusterIssuer kullanacağız.
Let’s Encrypt Ortamları: Staging ve Production
Let’s Encrypt, iki farklı ortam sunar:
- Staging (Geçici): Test amaçlı kullanılır. Rate limitleri (belli bir sürede yapılabilecek istek sayısı) çok daha düşüktür, bu sayede deneme yanılma yaparken gerçek sertifika limitlerine takılmazsınız. Geçici sertifikalar verir ve tarayıcılar tarafından güvenilir olarak tanınmaz.
- Production (Üretim): Gerçek, güvenilir sertifikalar verir. Daha sıkı rate limitleri vardır.
Önce Staging ortamını kullanarak yapılandırmanızı test etmeniz şiddetle tavsiye edilir.
ClusterIssuer Tanımlama (Staging)
Aşağıdaki YAML dosyasını letsencrypt-staging-clusterissuer.yaml olarak kaydedin:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
# Let's Encrypt Staging ortamı URL'si
server: https://acme-staging-v02.api.letsencrypt.org/directory
# Sertifika yenileme ve önemli bildirimler için e-posta adresi
email: your-email@example.com
# Sertifika anahtarını depolamak için secret
privateKeySecretRef:
name: letsencrypt-staging-key
# Alan adı doğrulama yöntemleri
solvers:
- http01:
# HTTP01 challenge için Ingress Controller sınıfı
ingress:
class: nginx
your-email@example.com kısmını kendi e-posta adresinizle değiştirmeyi unutmayın. Bu e-posta adresi, sertifika yenileme bildirimleri veya herhangi bir sorun durumunda Let’s Encrypt tarafından kullanılacaktır.
Bu dosyayı uygulayın:
kubectl apply -f letsencrypt-staging-clusterissuer.yaml
ClusterIssuer‘ın durumunu kontrol edelim:
kubectl get clusterissuer letsencrypt-staging
READY sütununda True görmelisiniz. Eğer False ise, kubectl describe clusterissuer letsencrypt-staging komutu ile daha fazla bilgi alabilirsiniz.
ClusterIssuer Tanımlama (Production)
Staging ortamında testleriniz başarılı olduktan sonra, Production ortamına geçebilirsiniz. Aşağıdaki YAML dosyasını letsencrypt-production-clusterissuer.yaml olarak kaydedin:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-production
spec:
acme:
# Let's Encrypt Production ortamı URL'si
server: https://acme-v02.api.letsencrypt.org/directory
email: your-email@example.com
privateKeySecretRef:
name: letsencrypt-production-key
solvers:
- http01:
ingress:
class: nginx
Yine, e-posta adresinizi güncellemeyi unutmayın.
Bu dosyayı uygulayın:
kubectl apply -f letsencrypt-production-clusterissuer.yaml
Durumunu kontrol edin:
kubectl get clusterissuer letsencrypt-production
TLS Destekli Ingress Kaynağı Oluşturma
Artık cert-manager ve ClusterIssuer‘larımız hazır olduğuna göre, uygulamamız için TLS destekli bir Ingress kaynağı oluşturabiliriz. Bu Ingress kaynağı, cert-manager‘a hangi sertifikanın hangi alan adı için alınacağını ve hangi ClusterIssuer‘ın kullanılacağını bildirecektir.
Öncelikle, örnek bir uygulama ve servis oluşturalım. Bu uygulama, basit bir Nginx web sunucusu olabilir.
Örnek Uygulama ve Servis
Aşağıdaki YAML dosyasını example-app.yaml olarak kaydedin:
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-nginx
spec:
selector:
matchLabels:
app: example-nginx
replicas: 1
template:
metadata:
labels:
app: example-nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: example-nginx-service
spec:
selector:
app: example-nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
Bu dosyayı uygulayın:
kubectl apply -f example-app.yaml
TLS Destekli Ingress Oluşturma
Şimdi, example-app.yaml dosyasında oluşturduğumuz servise dışarıdan TLS ile erişim sağlayacak Ingress kaynağını tanımlayalım. Aşağıdaki YAML dosyasını example-ingress.yaml olarak kaydedin:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
# Bu annotation, cert-manager'a bu Ingress için bir sertifika almasını söyler.
# Kullanmak istediğiniz ClusterIssuer'ın adını buraya yazın (letsencrypt-staging veya letsencrypt-production).
cert-manager.io/cluster-issuer: letsencrypt-staging
# Nginx Ingress Controller'ı kullanıyorsanız, HTTP'den HTTPS'e yönlendirme için bu annotation'ı ekleyebilirsiniz.
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
ingressClassName: nginx # Nginx Ingress Controller kullanıyorsanız bu satırı ekleyin
tls:
- hosts:
- uygulamam.com # Alan adınızı buraya yazın
secretName: uygulamam-tls # Cert-manager tarafından oluşturulacak Secret'ın adı
rules:
- host: uygulamam.com # Alan adınızı buraya yazın
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-nginx-service
port:
number: 80
Yukarıdaki YAML dosyasında:
uygulamam.comkısmını kendi alan adınızla değiştirin.cert-manager.io/cluster-issuer: letsencrypt-stagingannotation’ı,cert-manager‘aletsencrypt-stagingClusterIssuer’ını kullanarak sertifika almasını söyler. Testleriniz bittikten sonra bunuletsencrypt-productionolarak değiştirebilirsiniz.secretName: uygulamam-tls,cert-managertarafından oluşturulacak ve sertifikayı içerecek Kubernetes Secret’ının adıdır.
Bu dosyayı uygulayın:
kubectl apply -f example-ingress.yaml
Doğrulama ve Sorun Giderme
Ingress kaynağını uyguladıktan sonra, cert-manager arka planda çalışmaya başlayacak ve Let’s Encrypt ile iletişime geçerek sertifika alma sürecini başlatacaktır. Bu süreç genellikle birkaç dakika sürer.
1. Sertifika Durumunu Kontrol Etme
Sertifika talebinizin durumunu kontrol etmek için aşağıdaki komutu kullanın:
kubectl get certificate
Aşağıdakine benzer bir çıktı görmelisiniz:
NAME READY SECRET AGE
uygulamam-tls True uygulamam-tls 2m
READY sütununda True yazıyorsa, sertifika başarıyla alınmış ve uygulamam-tls adında bir Secret oluşturulmuştur.
Daha detaylı bilgi için:
kubectl describe certificate uygulamam-tls
2. Secret’ın Oluştuğunu Kontrol Etme
Sertifikanın depolandığı Secret’ın oluştuğunu doğrulayın:
kubectl get secret uygulamam-tls
Bu komut, Secret’ın var olduğunu ve boyutunu göstermelidir.
3. Ingress Durumunu Kontrol Etme
Ingress kaynağının da doğru şekilde yapılandırıldığından emin olun:
kubectl get ingress example-ingress
ADDRESS sütununda Ingress Controller’ınızın dış IP adresini görmelisiniz.
4. Tarayıcıdan Erişimi Kontrol Etme
Artık tarayıcınızdan alan adınıza (örneğin, https://uygulamam.com) erişerek bağlantının güvenli olup olmadığını kontrol edebilirsiniz. Tarayıcınızın adres çubuğunda bir kilit simgesi görmelisiniz.
Yaygın Sorunlar ve Çözümleri
CertificatedurumundaFalseveyaPendingkalması:kubectl describe certificatekomutunu kullanarak olayları kontrol edin.kubectl logs -n cert-manager deploy/cert-manager-controllerkomutuylacert-managerkontrolcüsünün loglarını inceleyin.- DNS Problemleri: Alan adınızın A kaydının Ingress Controller’ın doğru dış IP adresini işaret ettiğinden emin olun. DNS yayılımı zaman alabilir.
- Yanlış E-posta Adresi:
ClusterIssueriçindeki e-posta adresinin geçerli olduğundan emin olun. - Rate Limitler: Özellikle üretim ortamında çok sık sertifika isteği yaparsanız Let’s Encrypt’in rate limitlerine takılabilirsiniz. Bu yüzden önce Staging ortamını kullanın.
- Firewall Kuralları: Kümenizin dışarıdan gelen HTTP (80) trafiğine izin verdiğinden emin olun, çünkü Let’s Encrypt HTTP01 challenge için bu portu kullanır.
- Ingress Controller çalışmıyor:
kubectl get pods -n ingress-nginxkomutuyla pod’ların durumunu kontrol edin ve loglarını inceleyin.
Sorunlarla karşılaşırsanız, hata mesajlarını dikkatlice okuyun ve ilgili kaynakların (Certificate, Ingress, ClusterIssuer, Pod logları) durumunu kontrol etmek için kubectl describe ve kubectl logs komutlarını kullanın.
Sonuç
Bu rehberde, Kubernetes kümenizdeki Ingress kaynaklarınızı Let’s Encrypt ile nasıl güvence altına alacağınızı adım adım öğrendiniz. cert-manager‘ın gücünü kullanarak, SSL/TLS sertifikalarını otomatik olarak almayı, yenilemeyi ve yönetmeyi başardınız. Bu sayede uygulamalarınız hem daha güvenli hale geldi hem de sertifika yönetimi için harcayacağınız zaman ve efor minimize edildi. Artık kullanıcılarınız uygulamalarınıza güvenli ve şifreli bir bağlantı üzerinden erişebilirler.
Sıkça Sorulan Sorular (SSS)
S: Cert-manager neden gerekli? Sertifikaları manuel olarak yükleyemez miyim?
C: Evet, sertifikaları manuel olarak Kubernetes Secret’larına yükleyebilir ve Ingress kaynaklarınızda kullanabilirsiniz. Ancak cert-manager bu süreci otomatikleştirir: sertifikaları otomatik olarak ister, yeniler ve süresi dolmadan önce günceller. Bu, özellikle çok sayıda uygulamanız ve alan adınız varsa manuel yönetimin getireceği yükü ortadan kaldırır.
S: Wildcard sertifika (örneğin, *.uygulamam.com) alabilir miyim?
C: Evet, cert-manager ile wildcard sertifikalar alabilirsiniz. Ancak wildcard sertifikalar için Let’s Encrypt, HTTP01 yerine DNS01 challenge yöntemini gerektirir. Bu yöntem, alan adınızın DNS kayıtlarını cert-manager’ın değiştirebilmesini veya doğrulayabilmesini gerektirir. Bu genellikle bulut sağlayıcınızın DNS API’si ile entegrasyon (örneğin, AWS Route 53, Google Cloud DNS) veya ExternalDNS gibi araçlar aracılığıyla yapılır.
S: Sertifika yenileme otomatik mi gerçekleşiyor?
C: Evet, cert-manager varsayılan olarak sertifikaların süresi dolmadan 30 gün önce otomatik olarak yenileme sürecini başlatır ve yeni sertifikayı Kubernetes Secret’ına kaydeder. Bu sayede manuel müdahaleye gerek kalmaz.
S: Staging yerine doğrudan Production ClusterIssuer kullanabilir miyim?
C: Teknik olarak evet, ancak bu önerilmez. Let’s Encrypt’in üretim ortamı, IP adresi ve alan adı bazında sıkı rate limitlere sahiptir. Test aşamasında yanlış yapılandırmalar nedeniyle bu limitlere takılabilir ve bir süre boyunca gerçek sertifika alamayabilirsiniz. Önce Staging ortamında tüm yapılandırmanın doğru çalıştığından emin olmak en güvenli yaklaşımdır.
S: Nginx Ingress Controller yerine başka bir Ingress Controller kullanabilir miyim?
C: Evet, cert-manager çoğu Ingress Controller ile uyumludur. HTTP01 challenge için ClusterIssuer yapılandırmasında ingress.class alanını kullandığınız Ingress Controller’ın sınıfına göre (örneğin, gce, traefik vb.) değiştirmeniz gerekebilir. Ingress kaynağınızda da ingressClassName alanını doğru şekilde belirtmelisiniz.
