Günümüzde, Kubernetes ortamlarında güvenli iletişimi sağlamak için HTTPS kullanımı vazgeçilmezdir. Ancak, sertifika oluşturma, yenileme ve yönetimi gibi süreçler karmaşık ve zaman alıcı olabilir. İşte tam bu noktada, cert-manager imdadımıza yetişiyor!
Bu blog yazısında, Kubernetes ekosisteminin vazgeçilmez araçlarından biri olan cert-manager'ı yakından tanıyacak, ClusterIssuer ve Certificate gibi temel kavramları öğrenecek ve örneklerle nasıl kullanıldıklarını göreceğiz.
Cert-Manager Nedir?
Cert-manager, Kubernetes kümenizdeki sertifika yönetimini otomatikleştiren bir araçtır. Let's Encrypt, HashiCorp Vault, Venafi gibi çeşitli sertifika yetkilileriyle (CA) entegre olarak, TLS/SSL sertifikalarını otomatik olarak talep eder, alır, yeniler ve Kubernetes Secret'leri olarak saklar. Bu sayede, sertifika yaşam döngüsü yönetimiyle ilgili manuel işlemleri ortadan kaldırır ve güvenli iletişimi kolaylaştırır.
Cert-Manager'ın Temel Bileşenleri: ClusterIssuer ve Certificate
Cert-manager'ın işleyişini anlamak için iki önemli kaynağı incelememiz gerekiyor:
-
ClusterIssuer: Küme genelinde geçerli olan bir sertifika yetkilisi yapılandırmasıdır. Let's Encrypt, kendi CA'niz veya diğer desteklenen sağlayıcılar gibi farklı yetkilileri tanımlamanızı sağlar. ClusterIssuer, sertifika taleplerinde kullanılacak yetkiliyi ve kimlik doğrulama bilgilerini içerir.
- Issuer: ClusterIssuer'dan farklı olarak namespaceler için geçerlidir.
-
Certificate: Belirli bir alan adı (veya adları) için sertifika talebini temsil eden bir kaynaktır. Certificate kaynağı, hangi ClusterIssuer'ın kullanılacağını, sertifikanın geçerlilik süresini, DNS adlarını ve diğer ayarları belirtir. Cert-manager, bu kaynağı izleyerek sertifika talebini oluşturur, yetkiliye gönderir ve alınan sertifikayı bir Kubernetes Secret'i olarak kaydeder.
Cert-Manager ile Sertifika Yönetimi Avantajları
- Otomasyon: Sertifika oluşturma, yenileme ve güncelleme işlemleri otomatikleşir.
- Kolaylık: Karmaşık sertifika yönetimi süreçleri basitleşir.
- Güvenlik: Sertifikaların süresi dolmadan yenilenmesi sağlanarak güvenlik açıkları önlenir.
- Esneklik: Farklı sertifika yetkilileriyle entegrasyon imkanı sunar.
Sonuç
Cert-manager, Kubernetes ortamlarında sertifika yönetimini kolaylaştıran ve güvenliği artıran güçlü bir araçtır. Bu blog yazısında, cert-manager'ın temel kavramlarını ve nasıl kullanıldığını örneklerle inceledik. Artık siz de Kubernetes kümenizde sertifika yönetimini otomatikleştirebilir ve uygulamalarınızı güvenli bir şekilde yayınlayabilirsiniz.
Ek Bilgiler
- Cert-manager resmi web sitesi: https://cert-manager.io
- Cert-manager Ingress annotation'ları: https://cert-manager.io/docs/usage/ingress/#supported-annotations
Videoda kullanılan kodlar
helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.17.0 \
--set crds.enabled=true
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: selfsigned-cluster-issuer
spec:
selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: my-selfsigned-ca
namespace: cert-manager
spec:
isCA: true
commonName: my-selfsigned-ca
secretName: root-secret
privateKey:
algorithm: ECDSA
size: 256
issuerRef:
name: selfsigned-cluster-issuer
kind: ClusterIssuer
group: cert-manager.io
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: my-ca-issuer
spec:
ca:
secretName: root-secret
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: longhorn-ingress
namespace: longhorn-system
annotations:
cert-manager.io/cluster-issuer: selfsigned-cluster-issuer
cert-manager.io/duration: 24h
cert-manager.io/subject-organizationalunits: "Longhorn IT Services"
spec:
ingressClassName: nginx
tls:
- hosts:
- longhorn.sercangezer.home
secretName: longhorn-tls
rules:
- host: longhorn.sercangezer.home
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: longhorn-frontend
port:
number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: prometheus-ingress
namespace: monitoring
annotations:
cert-manager.io/cluster-issuer: selfsigned-cluster-issuer
cert-manager.io/email-sans: "sercangezer.public@gmail.com.tr"
cert-manager.io/subject-countries: "Türkiye"
cert-manager.io/subject-localities: "Ankara"
spec:
ingressClassName: nginx
tls:
- hosts:
- prometheus.sercangezer.home
secretName: prometheus-tls
rules:
- host: prometheus.sercangezer.home
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kube-prometheus-stack-prometheus
port:
number: 9090
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana-ingress
namespace: monitoring
annotations:
cert-manager.io/cluster-issuer: selfsigned-cluster-issuer
spec:
ingressClassName: nginx
tls:
- hosts:
- grafana.sercangezer.home
secretName: grafana-tls
rules:
- host: grafana.sercangezer.home
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kube-prometheus-stack-grafana
port:
number: 80
kubectl get secret root-secret -n cert-manager -o jsonpath="{.data['tls\.crt']}" | base64 --decode | openssl x509 -noout -text
Yorumlar