HTTPS aktivieren
Mit cert-manager lassen Sie TLS-Zertifikate automatisch von Let's Encrypt ausstellen und rechtzeitig vor Ablauf erneuern. Die Zertifikate werden als Kubernetes-Secrets abgelegt und vom Ingress Controller zur TLS-Terminierung verwendet.
Voraussetzungen
- Ein installierter Ingress Controller, siehe Ingress Controller installieren
- Eine Domain, deren DNS-A-Record auf die externe Adresse des Ingress Controllers zeigt
- Installiertes Helm
Der DNS-Eintrag muss vor der Zertifikatsanforderung auf die externe Adresse zeigen und öffentlich auflösbar sein. Let's Encrypt prüft die Kontrolle über die Domain per HTTP-Anfrage – schlägt diese fehl, wird kein Zertifikat ausgestellt.
Die externe Adresse ermitteln Sie mit:
kubectl get service -n ingress-nginx ingress-nginx-controller
cert-manager installieren
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
Installation prüfen:
kubectl get pods -n cert-manager
Alle drei Pods (cert-manager, cert-manager-webhook, cert-manager-cainjector) sollten den Status Running aufweisen.
ClusterIssuer anlegen
Ein ClusterIssuer beschreibt, von welcher Zertifizierungsstelle Zertifikate bezogen werden.
Zunächst mit der Staging-Umgebung testen
Let's Encrypt begrenzt die Anzahl der Anfragen je Domain deutlich. Testen Sie Ihre Konfiguration daher zuerst gegen die Staging-Umgebung:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
server: https://acme-staging-v02.api.letsencrypt.org/directory
email: ihre-adresse@example.com
privateKeySecretRef:
name: letsencrypt-staging
solvers:
- http01:
ingress:
ingressClassName: nginx
Produktive Umgebung
Sobald der Test erfolgreich war, legen Sie den produktiven Issuer an:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: ihre-adresse@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
ingressClassName: nginx
Anwenden und prüfen:
kubectl apply -f clusterissuer.yaml
kubectl get clusterissuer
In der Spalte READY sollte True stehen.
Ingress um TLS erweitern
Ergänzen Sie Ihren Ingress um die Annotation für den Issuer und einen tls-Abschnitt:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
tls:
- hosts:
- app.example.com
secretName: web-tls
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
Anwenden:
kubectl apply -f ingress.yaml
Das unter secretName angegebene Secret wird von cert-manager automatisch angelegt – Sie müssen es nicht selbst erstellen.
Ausstellung verfolgen
# Status des Zertifikats
kubectl get certificate
# Details und Ereignisse
kubectl describe certificate web-tls
# Laufende Anforderungen
kubectl get certificaterequest
kubectl get order
Die Ausstellung dauert in der Regel ein bis zwei Minuten. Anschließend steht in der Spalte READY des Zertifikats True.
Prüfen Sie das Ergebnis:
curl -I https://app.example.com
Automatische Erneuerung
cert-manager erneuert Zertifikate selbstständig, üblicherweise 30 Tage vor Ablauf. Ein manueller Eingriff ist nicht erforderlich, solange DNS-Eintrag und Ingress unverändert bleiben.
Fehlersuche
| Symptom | Mögliche Ursache |
|---|---|
Zertifikat bleibt auf READY: False | Prüfen Sie kubectl describe certificate <name> sowie die zugehörigen Order- und Challenge-Objekte |
| Challenge schlägt fehl | Der DNS-Eintrag zeigt nicht auf die externe Adresse des Ingress Controllers oder ist noch nicht propagiert |
rate limited in den Ereignissen | Das Kontingent von Let's Encrypt ist ausgeschöpft; verwenden Sie zum Testen den Staging-Issuer |
| Browser meldet ein nicht vertrauenswürdiges Zertifikat | Das Zertifikat stammt vom Staging-Issuer; stellen Sie auf letsencrypt-prod um |
Logs von cert-manager:
kubectl logs -n cert-manager -l app.kubernetes.io/name=cert-manager