Bu makalede Certmanager ile ingress tanımınızdaki adresler için (Cloudflare DNS hizmetler için) Let’s Encrypt sertifikalarını almayı inceleyeceğiz,
Yapıyı kısaca anlatmak gerekirse;
Kubernetes üzerinde ingress kullanarak yayınladığımız web sitelerimiz olduğunu düşünelim,
Yine bahsedilen web sitelerin Cloudflare üzerinde DNS yönetiminin olduğunu varsayalım,
Helm reposunu ekleyerek kuruluma başlayalım;
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm upgrade --install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.9.1 --set installCRDs=true
installCRDs ile birlikte gelecek olan; certificaterequests.cert-manager.io, orders.acme.cert-manager.io, challenges.acme.cert-manager.io objelerin yaratıldığını gözlemleyebiliriz.
Cloudflare ile arasındaki entegrasyon için Api token oluşturmamız gerekiyor.
Bunun için;
API Tokens
Tokens can be created at User Profile > API Tokens > API Tokens. The following settings are recommended:
Permissions:
Zone - DNS - Edit
Zone - Zone - Read
Zone Resources:
Include - All Zones
Bu adımdan sonra oluşturulan token bilgisini aşağıdaki gibi bir yaml dosyasına yazalım, ve secret oluşturalım,
kubectl apply -f api-token-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: cloudflare-api-token-secret
type: Opaque
stringData:
api-token: XXXXXXXX #burayatoken
Certmanager ile token bağlantısı için bir issuer oluşturmamız gerekiyor,
Eğer her namespace için farklı bir durum söz konusu ise issuer ile ilerleyebilirsiniz. Clusterissuer oluşturarak tüm namespaceler için global bir tanımda gerçekleştirebilirsiniz; https://cert-manager.io/docs/concepts/issuer/
Tanım sonrasında; kubectl apply -f cluster-issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: mert@mnm.com.tr
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- dns01:
cloudflare:
apiTokenSecretRef:
key: api-token
name: cloudflare-api-token-secret
email: mert@mnm.com.tr
selector:
dnsZones:
- derinmor.com
Bitnami Nginx chartı kullanarak deneme amaçlı bir ingress deploy edeceğim;
Geçici bir values dosyasına aşağıdaki verileri tanımlıyorum.
ingress:
path: /
hostname: deneme22.derinmor.com
tls: true
className: nginx
enabled: true
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: letsencrypt-prod
Bu dosyayı göstererek deploy işlemini gerçekleştirelim,
helm upgrade --install nginx-test bitnami/nginx --create-namespace -n nginx-test -f values.yaml
Sertifika için request, order gibi durumları aşağıdaki komutla izleyebilirsiniz.
watch -n1 -d kubectl get certificaterequests.cert-manager.io,orders.acme.cert-manager.io,challenges.acme.cert-manager.io
İsteklerin başladığını gözlemleyebiliriz;
Eğer entegrasyonda herhangi bir problem yok ise request sonrası order oluşturulmuş olacak
Erişim testi için ingress external adresi host dosyanıza ekleyebilirsiniz.
Originally published at https://mertyakan.com on October 7, 2022.