Takip et

Ön Gereksinimler ve Temel Hazırlıklar

Modern bulut tabanlı uygulamaların vazgeçilmezi olan Kubernetes, konteynerize edilmiş iş yüklerini yönetme konusunda eşsiz bir esneklik suna

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.com kısmını kendi alan adınızla değiştirin.
  • cert-manager.io/cluster-issuer: letsencrypt-staging annotation’ı, cert-manager‘a letsencrypt-staging ClusterIssuer’ını kullanarak sertifika almasını söyler. Testleriniz bittikten sonra bunu letsencrypt-production olarak değiştirebilirsiniz.
  • secretName: uygulamam-tls, cert-manager tarafı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

  • Certificate durumunda False veya Pending kalması:
    • kubectl describe certificate komutunu kullanarak olayları kontrol edin.
    • kubectl logs -n cert-manager deploy/cert-manager-controller komutuyla cert-manager kontrolcü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: ClusterIssuer iç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-nginx komutuyla 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.


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.