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 gelen; certificaterequests.cert-manager.io, orders.acme.cert-manager.io, challenges.acme.cert-manager.io objelerin oluşturulduğunu 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.