6.0 KiB
Configuration Let's Encrypt avec cert-manager
Ce document explique comment générer et utiliser des certificats Let's Encrypt avec cert-manager dans votre cluster Kubernetes.
Architecture
- cert-manager : Opérateur Kubernetes qui gère automatiquement les certificats TLS
- ClusterIssuer : Ressource qui définit comment obtenir des certificats (Let's Encrypt Production ou Staging)
- Certificate : Ressource Kubernetes qui demande un certificat pour un domaine spécifique
- Traefik : Ingress Controller qui utilise les certificats générés
Installation
1. Déployer cert-manager
cert-manager est déployé via ArgoCD via l'ApplicationSet cert-manager-apps.
Le chart inclut :
- cert-manager (controller, webhook, cainjector)
- ClusterIssuer pour Let's Encrypt Production (
letsencrypt-prod) - ClusterIssuer pour Let's Encrypt Staging (
letsencrypt-staging)
2. Vérifier l'installation
# Vérifier que cert-manager est déployé
kubectl get pods -n cert-manager
# Vérifier les ClusterIssuers
kubectl get clusterissuers
# Vérifier le statut d'un ClusterIssuer
kubectl describe clusterissuer letsencrypt-prod
Configuration
ClusterIssuers
Deux ClusterIssuers sont créés :
-
letsencrypt-prod : Pour les certificats de production
- Serveur :
https://acme-v02.api.letsencrypt.org/directory - Limite de taux : 50 certificats par semaine par domaine
- Serveur :
-
letsencrypt-staging : Pour les tests
- Serveur :
https://acme-staging-v02.api.letsencrypt.org/directory - Limite de taux : 300 certificats par semaine par domaine
- ⚠️ Les certificats staging ne sont pas fiables par les navigateurs
- Serveur :
Modifier l'email
L'email utilisé pour l'enregistrement ACME est défini dans :
helm/cert-manager/dev/templates/cluster-issuer-letsencrypt-prod.yamlhelm/cert-manager/dev/templates/cluster-issuer-letsencrypt-staging.yaml
Modifiez la ligne email: admin@gkdomaine.fr avec votre email.
Utilisation
Méthode 1 : Via annotations Ingress (Recommandé)
Ajoutez les annotations suivantes à votre Ingress :
ingress:
enabled: true
className: traefik
hosts:
- host: monapp.dev.gkdomaine.fr
paths:
- path: /
tls:
- secretName: monapp-dev-tls
hosts:
- monapp.dev.gkdomaine.fr
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod" # ou "letsencrypt-staging" pour les tests
Méthode 2 : Via ressource Certificate (Pour plus de contrôle)
Créez une ressource Certificate :
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: monapp-dev-tls
namespace: monapp-dev
spec:
secretName: monapp-dev-tls
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- monapp.dev.gkdomaine.fr
Puis référencez le secret dans votre Ingress :
ingress:
tls:
- secretName: monapp-dev-tls
hosts:
- monapp.dev.gkdomaine.fr
Validation HTTP-01
cert-manager utilise la méthode HTTP-01 pour valider la propriété du domaine :
- cert-manager crée un challenge HTTP
- Traefik expose le challenge sur
/.well-known/acme-challenge/ - Let's Encrypt vérifie que le challenge est accessible
- Le certificat est émis et stocké dans un Secret Kubernetes
Prérequis
- Le domaine doit pointer vers l'IP publique de Traefik (LoadBalancer)
- Le port 80 doit être accessible depuis Internet
- Traefik doit être configuré pour gérer les ingress avec la classe
traefik
Vérification
Vérifier le statut d'un certificat
# Lister les certificats
kubectl get certificates --all-namespaces
# Détails d'un certificat
kubectl describe certificate monapp-dev-tls -n monapp-dev
# Vérifier les challenges ACME
kubectl get challenges --all-namespaces
Vérifier le secret TLS
# Le secret est créé automatiquement quand le certificat est émis
kubectl get secret monapp-dev-tls -n monapp-dev
# Voir les détails du certificat
kubectl get secret monapp-dev-tls -n monapp-dev -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -noout
Renouvellement automatique
cert-manager renouvelle automatiquement les certificats avant expiration (30 jours avant la date d'expiration).
Les certificats Let's Encrypt sont valides pendant 90 jours.
Dépannage
Le certificat n'est pas émis
-
Vérifier les logs de cert-manager :
kubectl logs -n cert-manager deployment/cert-manager -
Vérifier les challenges :
kubectl describe challenge -n monapp-dev -
Vérifier que le domaine est accessible :
curl http://monapp.dev.gkdomaine.fr/.well-known/acme-challenge/test
Erreur "rate limit exceeded"
Let's Encrypt a des limites de taux :
- Production : 50 certificats par semaine par domaine
- Staging : 300 certificats par semaine par domaine
Solution : Utilisez letsencrypt-staging pour les tests, ou attendez la fin de la période de limitation.
Le certificat n'est pas utilisé par Traefik
Vérifiez que :
- Le secret TLS existe dans le même namespace que l'Ingress
- L'Ingress référence correctement le secret dans
spec.tls[].secretName - Traefik peut accéder au secret (même namespace ou RBAC approprié)
Exemples de configuration
Homarr
Voir helm/homarr/dev/values.yaml pour un exemple complet avec annotations cert-manager.
Traefik Dashboard
Pour sécuriser le dashboard Traefik, ajoutez TLS à l'IngressRoute :
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard
namespace: traefik-dev
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
entryPoints:
- websecure
routes:
- match: Host(`traefik.dev.gkdomaine.fr`)
kind: Rule
services:
- name: api@internal
kind: TraefikService
tls:
secretName: traefik-dashboard-tls