Certmanager with Cloudflare deploy Kubernetes 1.25.2

mnmtech
3 min readOct 7, 2022

--

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.

--

--