cert-manager est un contrôleur Kubernetes qui automatise l’émission, le renouvellement et la révocation des certificats TLS. Il s’intègre avec des autorités de certification comme Let’s Encrypt, Vault, ou des CA internes.
Problème résolu
Sans cert-manager, les certificats TLS sont gérés manuellement : génération, dépôt en Secret, renouvellement avant expiration. Ce processus est error-prone et peu scalable.
cert-manager rend ce cycle entièrement automatique.
cert-manager surveille les ressources Certificate/Ingress
│
▼
Contacte l'autorité de certification (ex: Let's Encrypt)
│
▼
Crée/renouvelle le Secret TLS dans Kubernetes
│
▼
Le pod (ex: ingress-nginx) utilise le Secret à jour
Installation via Helm
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set crds.enabled=trueConcept clé : l’Issuer
Un Issuer (ou ClusterIssuer) définit comment cert-manager obtient les certificats.
ClusterIssuer Let’s Encrypt (production)
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@mondomaine.com
privateKeySecretRef:
name: letsencrypt-prod-key
solvers:
- http01:
ingress:
ingressClassName: nginx # utilise ingress-nginx pour le challengeUtiliser
letsencrypt-stagingpour les tests (évite les rate limits).
Exemple : Certificat explicite
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: mon-certificat
namespace: default
spec:
secretName: mon-cert-tls # Secret créé automatiquement
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- monapp.exemple.com
- api.exemple.com
duration: 2160h # 90 jours
renewBefore: 360h # Renouvellement 15 jours avantExemple : Via annotation Ingress (méthode la plus courante)
Il suffit d’une annotation sur l’Ingress — cert-manager crée le Certificate automatiquement :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mon-app
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod" # ← déclenche cert-manager
spec:
ingressClassName: nginx
tls:
- hosts:
- monapp.exemple.com
secretName: monapp-tls # cert-manager remplit ce secret
rules:
- host: monapp.exemple.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-svc
port:
number: 80Vérification
# État des certificats
kubectl get certificate -A
kubectl describe certificate mon-certificat -n default
# Challenges ACME en cours
kubectl get challenge -A
# Secrets TLS créés
kubectl get secret mon-cert-tls -n default -o yamlCycle de vie automatique
| Étape | Ce qui se passe |
|---|---|
| Création d’un Ingress annoté | cert-manager détecte et crée un Certificate |
| Challenge ACME | cert-manager prouve la possession du domaine (HTTP-01 ou DNS-01) |
| Émission | Let’s Encrypt émet le certificat → stocké dans un Secret |
| Renouvellement | cert-manager renouvelle automatiquement avant renewBefore |
Liens
- ingress-nginx — s’utilise avec cert-manager pour le TLS
- Plugins Kubernetes - Vue d’ensemble — vue globale
- kube-apiserver — cert-manager utilise l’API pour surveiller les ressources