Cert-manager is een Kubernetes-tool die het beheer van TLS-certificaten in een Kubernetes-cluster automatiseert. Het kan certificaten uitgeven vanuit verschillende bronnen, zoals Let's Encrypt of self-signed certificaten.
Cert-manager verlengt automatisch deze certificaten wanneer 2/3e van de geldigheidsperiode van het certificaat verlopen is.
In deze handleiding laten we zien hoe je Cert-manager installeert en configureert om Let's Encrypt-certificaten uit te geven op je Kubernetes-cluster.
Installeer voor je deze handleiding doorloopt:
Cert-manager installeren
Stap 1
Voeg de Jetstack-repository toe. Dit is de enige officiële bron van cert-manager Helm charts. Update vervolgens met het tweede commando je repositories om de Jetstack-repository te kunnen gebruiken
helm repo add jetstack https://charts.jetstack.io
helm repo update
Stap 2
Installeer Cert-manager met het commando:
helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.12.0 \
--set installCRDs=true
- Je bent vrij een andere namespace naam dan cert-manager te gebruiken, maar deze is makkelijk herkenbaar.
- Vervang hier v1.12.0 door de meest recente stabiele versie zoals te zien is hier op Github.
- De optie installCRDs is verplicht, maar je kunt alternatief de installCRDs optie uitcommentarieëren en de CRD's (simpel gezegd is een CRD code om de Kubernetes API uit te breiden met custom resources die niet aanwezig zijn in de core Kubernetes API) los installeren met het commando:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.0/cert-manager.crds.yaml
Je krijgt nu een output zoals hieronder te zien om te bevestigen dat de installatie geslaagd is:
NAME: cert-manager LAST DEPLOYED: Tue Jun 13 13:21:23 2023 NAMESPACE: cert-manager STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: cert-manager v1.11.0 has been deployed successfully! In order to begin issuing certificates, you will need to set up a ClusterIssuer or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer). More information on the different types of issuers and how to configure them can be found in our documentation: https://cert-manager.io/docs/configuration/ For information on how to configure cert-manager to automatically provision Certificates for Ingress resources, take a look at the `ingress-shim` documentation: https://cert-manager.io/docs/usage/ingress/
De status van de Pods en Services die worden aangemaakt voor Cert-manager controleer je met respectievelijk de volgende commando's:
kubectl get pods -n cert-manager
kubectl get svc -n cert-manager
Een (Cluster)Issuer aanmaken
Om gebruik te kunnen maken van Cert-manager heb je een ClusterIssuer of Issuer nodig. Een ClusterIssuer definieert een certificaat uitgever (bijvoorbeeld Let's Encrypt) die gebruikt kan worden om TLS-certificaten voor je gehele Kubernetes-cluster te genereren. Een Issuer kan dat enkel voor een specifieke namespace.
Stap 1
Maak een .yaml bestand aan, bijvoorbeeld letsencrypt-issuer.yaml:
nano letsencrypt-issuer.yaml
Geef het bestand de volgende inhoud:
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-issuer spec: acme: email: jouwmailadres@voorbeeld.nl server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: name: letsencrypt-issuer solvers: - http01: ingress: class: nginx
Pas het mailadres aan naar je eigen mailadres. Sla tot slot je wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Stap 2
Pas de configuratie van het .yaml bestand toe op je cluster:
kubectl apply -f letsencrypt-issuer.yaml
Je krijgt nu een bevestiging te zien dat de configuratie succesvol is toegepast:
clusterissuer.cert-manager.io/letsencrypt-issuer created
Let op: Wanneer je een certificaat wil genereren (zie de volgende paragraaf) maak je een Ingress resource die precies de waarde hierboven moet gebruiken, oftewel clusterissuer.cert-manager.io/letsencrypt-issuer
Cert-manager gebruiken
Cert-manager is nu klaar voor gebruik. We gaan ervan uit dat je een Nginx Ingress Controller gebruikt op je Kubernetes-cluster. In dat geval is het gebruik van Cert-manager tweedelig: 1) je maakt een certificaat aan 2) je maakt een ingress resource aan. Het is aan te raden om van tevoren alvast de software te deployen waar je het certificaat voor wil gebruiken.
Stap 1
Voor je daadwerkelijk het certificaat genereerd, heb je een (sub)domein nodig in je TransIP-account. Verwijs de DNS-records van dit (sub)domein naar het publieke IP-adres van de loadbalancer van je Nginx Ingress Controller, zie stap 5 van deze handleiding.
Stap 2
Voor je het certificaat aanmaakt, heb je een ingress resource nodig om het certificaat toe te kunnen wijzen. De preciese inhoud van het bestand hangt af van jouw use case. Als voorbeeld gebruiken we hier een ingress voor Grafana. Maak eerst de resource aan:
nano grafana-ingress.yaml
Geef het bestand de onderstaande inhoud, waarbij je de volgende gegevens aanpast:
- metadata name: Pas aan naar de naam van de software waar je het certificaat voor wil gebruiken.
- namespace: De namespace moet overeenkomen met de naam van de namespace waar je het certificaat in wil gebruiken (op te vragen met kubectl get ns).
- annotations cert-manager.io/cluster-issuer: Pas de waarde aan naar de naam van de issuer die je eerder in dit artikel hebt aangemaakt.
- spec rules host: Pas aan naar het (sub)domein waar je het certificaat voor hebt aangemaakt.
- spec tls hosts: Pas deze waarde ook aan naar het (sub)domein waar je het certificaat voor hebt aangemaakt.
- spec tls secretName: Pas aan naar de naam van de secretName waarde uit stap 2 van deze paragraaf.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana
namespace: grafana
annotations:
ingressClassName: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-issuer"
spec:
rules:
- host: subdomein.voorbeeld.nl
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: grafana
port:
number: 3000
tls:
- hosts:
- subdomein.voorbeeld.nl
secretName: subdomein-voorbeeld-nl-tls
Sla tot slot je wijzigingen op en sluit het bestand (ctrl + c > y > enter).
Stap 3
Pas de aangemaakte ingress toe met het kubectl apply-commando:
kubectl apply -f grafana-ingress.yaml
Stap 4
Maak een certificate resource aan, bijvoorbeeld subdomein-voorbeeld-nl-certificate.yaml
nano subdomein-voorbeeld-nl-certificate.yaml
Geef het bestand de onderstaande inhoud, waarbij je de volgende gegevens aanpast:
- metadata name: Vervang subdomein-voorbeeld-nl door een naam naar keuze, bijvoorbeeld die van je (sub)domein
- metadata namespace: Vervang ingress-nginx door de naam van de namespace waar je Nginx Ingress Controller in is opgenomen (indien die verschilt)
- spec secretName: Vervang door een naam naar keuze, bijvoorbeeld die van je (sub)domein met de toevoeging -tls
- spec issuerRef name: Vervang door de issuerRef name zoals je die hebt ingesteld in stap 1 van de vorige paragraaf. Als je de code uit deze handleiding hebt overgenomen dan is de naam 'letsencrypt-issuer'.
- spec commonName: De naam van je (sub)domein waar je het certificaat voor aanvraagt.
- dnsNames: De naam van het (sub)domein(en) waar je het certificaat voor aanvraagt, bijvoorbeeld voorbeeld.nl en www.voorbeeld.nl.
apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: subdomein-voorbeeld-nl namespace: ingress-nginx spec: secretName: subdomein-voorbeeld-nl-tls issuerRef: name: letsencrypt-issuer kind: ClusterIssuer commonName: subdomein.voorbeeld.nl dnsNames: - subdomein.voorbeeld.nl - www.subdomein.voorbeeld.nl
Sla tot slot je wijzigingen op en sluit het bestand (ctrl + c > y > enter).
Stap 5
Genereer het certificaat met het kubectl apply-commando:
kubectl apply -f subdomein-voorbeeld-nl-certificate.yaml
Je krijgt een bevestiging te zien die er als volgt uitziet:
certificate.cert-manager.io/subdomein.voorbeeld.nl configured
Controleer vervolgens of het certificaat succesvol is aangemaakt met het commando:
kubectl get cert -n ingress-nginx
Onder 'READY' zou nu de status 'True' zichtbaar moeten zijn.
NAME READY SECRET AGE subdomein.voorbeeld.nl True subdomein-voorbeeld-nl-tls 2m14s
Zie je echter de status 'False'? Gebruik dan het volgende commando om te achterhalen wat de oorzaak van het issue is:
kubectl describe cert subdomein.voorbeeld.nl -n ingress-nginx
That's it! Je certificaat is nu gekoppeld aan je applicatie en is in dit voorbeeld bereikbaar vanaf voorbeeld.subdomein.nl/grafana