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=true

Concept 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 challenge

Utiliser letsencrypt-staging pour 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 avant

Exemple : 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: 80

Vé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 yaml

Cycle de vie automatique

ÉtapeCe qui se passe
Création d’un Ingress annotécert-manager détecte et crée un Certificate
Challenge ACMEcert-manager prouve la possession du domaine (HTTP-01 ou DNS-01)
ÉmissionLet’s Encrypt émet le certificat → stocké dans un Secret
Renouvellementcert-manager renouvelle automatiquement avant renewBefore

Liens