Cert-Manager automatisiert die Bereitstellung von Zertifikaten innerhalb von Kubernetes-Clustern. Es bietet eine Reihe benutzerdefinierter Ressourcen zum Ausstellen von Zertifikaten und zum Anhängen an Dienste.
Einer der häufigsten Anwendungsfälle ist die Sicherung von Web-Apps und APIs mit SSL-Zertifikaten von Let’s Encrypt. So fügen Sie Cert-Manager zu Ihrem Cluster hinzu, richten einen Let’s Encrypt-Zertifikatsaussteller ein und erwerben ein Zertifikat für Pods, die über einen Ingress verfügbar gemacht werden.
Cert-Manager installieren
Cert-Manager lässt sich am einfachsten mit Helm installieren. Helm ist ein Kubernetes-Paketmanager, mit dem Sie Anwendungen zu Ihrem Cluster hinzufügen können, indem Sie Repositories mit vorgefertigten Diagrammen verwenden. Stellen Sie sicher, dass Sie Helm installiert und mit einer Verbindung zu Ihrem Kubernetes-Cluster eingerichtet haben.
Beginnen Sie damit, das Jetstack-Repository zu Ihrer Helm-Installation hinzuzufügen. Jetstack hat Cert-Manager ursprünglich entwickelt, bevor es an die CNCF gespendet wurde.
helm repo add jetstack https://charts.jetstack.io helm repo update
Installieren Sie jetzt Cert-Manager in Ihrem Cluster:
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.5.3 --set installCRDs=true
Ersetzen Sie die oben angezeigte Versionsnummer durch die neueste Version, die in der Cert-Manager-Dokumentation angezeigt wird.
Der Befehl installiert Cert-Manager in einem neuen Kubernetes-Namespace namens cert-manager
. Die installCRDs
-Einstellung werden die benutzerdefinierten Kubernetes-Ressourcen von Cert-Manager während der Installation hinzugefügt. Dies funktioniert nur mit Helm-Version 3.2 und neuer – wenn Sie eine ältere Version verwenden, müssen Sie die Ressourcendefinitionen manuell mit Kubectl hinzufügen:
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.crds.yaml
Hinzufügen des Kubectl-Plugins
Cert-Manager verfügt über ein Kubectl-Plugin, das einige allgemeine Verwaltungsaufgaben vereinfacht. Außerdem können Sie überprüfen, ob Cert-Manager aktiv und bereit ist, Anfragen zu bedienen.
Installieren Sie das Plugin, indem Sie sein Archiv herunterladen und es in das richtige Verzeichnis extrahieren:
curl -L -o kubectl-cert-manager.tar.gz https://github.com/jetstack/cert-manager/releases/latest/download/kubectl-cert_manager-linux-amd64.tar.gz tar xzf kubectl-cert-manager.tar.gz sudo mv kubectl-cert_manager /usr/local/bin
Verwenden Sie nun das Plugin, um zu überprüfen, ob Ihre Cert-Manager-Installation funktioniert:
kubectl cert-manager check api
Sie sollten die folgende Ausgabe sehen:
The cert-manager API is ready
Jetzt können Sie einen Aussteller hinzufügen, um Zertifikate von Let’s Encrypt zu erhalten.
Erstellen eines Zertifikatausstellers
Aussteller und Cluster-Aussteller sind Ressourcen, die Ihrem Cluster Zertifikate bereitstellen. Die bisher erstellte grundlegende Cert-Manager-Installation kann keine Zertifikate ausstellen. Wenn Sie einen Aussteller hinzufügen, der für die Verwendung von Let’s Encrypt konfiguriert ist, können Sie dynamisch neue Zertifikate für Dienste in Ihrem Cluster erwerben.
Erstellen Sie eine YAML-Datei in Ihrem Arbeitsverzeichnis und nennen Sie sie issuer.yml
. Fügen Sie den folgenden Inhalt hinzu:
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-staging spec: acme: server: https://acme-staging-v02.api.letsencrypt.org/directory email: [email protected] privateKeySecretRef: name: letsencrypt-staging solvers: - http01: ingress: class: nginx
Sie müssen die E-Mail-Adresse durch Ihre eigene Kontakt-E-Mail ersetzen. Diese wird in Ihre Zeugnisse aufgenommen. Let’s Encrypt kann Ihnen auch eine E-Mail an die Adresse senden, wenn es Ihnen Benachrichtigungen zu Ihren Zertifikaten senden muss.
Wir erstellen einen ClusterIssuer
da diese für alle Ressourcen in Ihrem Cluster verfügbar sind, unabhängig vom Namespace. Ein Standard-Issuer
ist eine Namespace-Ressource, die nur Zertifikate innerhalb ihres eigenen Namespace bereitstellen kann.
Unsere Ausstellerkonfiguration weist Cert-Manager an, Zertifikate vom Staging-Server von Let’s Encrypt abzurufen. Es ist eine gute Idee, die Staging-Umgebung zu verwenden, während Sie Ihre Integration einrichten, um zu vermeiden, dass die strengen Produktionsratenbeschränkungen von Let’s Encrypt erreicht werden.
Verwenden Sie kubectl
So fügen Sie den Aussteller zu Ihrem Cluster hinzu:
kubectl create -f issuer.yml
Ein Zertifikat erhalten
Jetzt können Sie Ihren Aussteller verwenden, um ein Zertifikat für einen Dienst zu erwerben, der über eine Ingress-Ressource bereitgestellt wird. Cert-Manager überwacht automatisch Ingress-Ressourcen und erstellt Zertifikate anhand der Konfiguration in ihrem tls
Feld. Sie müssen lediglich eine Anmerkung hinzufügen, die den Aussteller oder Cluster-Aussteller nennt, den Sie verwenden möchten.
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: wordpress:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: port: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt-staging spec: rules: - host: example.com http: paths: - path: / backend: serviceName: my-service servicePort: 80 tls: - hosts: - example.com
Diese YAML-Datei definiert einen Pod, einen Dienst und einen Ingress, der den Dienst verfügbar macht. Es setzt die Verwendung von nginx-ingress
voraus als Ingress-Controller. Der Pod führt einen WordPress-Container aus, auf den über HTTPS unter example.com
zugegriffen werden kann .
Das Vorhandensein von cert-manager.io/cluster-issuer
Anmerkungen in der Ingress-Ressource werden von Cert-Manager erkannt. Es wird das letsencrypt-staging
verwendet Cluster-Aussteller, der zuvor erstellt wurde, um ein Zertifikat zu erwerben, das die in tls.hosts
von Ingress definierten Hostnamen abdeckt Feld.
Let’s Encrypt in der Produktion verwenden
Sobald Sie erfolgreich ein Staging-Zertifikat erworben haben, können Sie auf die Produktionsserver von Let’s Encrypt migrieren. Staging-Zertifikate sind gültig, werden aber von Browsern nicht als vertrauenswürdig eingestuft, daher müssen Sie einen Produktionsersatz besorgen, bevor Sie Ihre Website live schalten.
Am besten fügen Sie einen separaten Cluster-Aussteller für den Produktionsserver hinzu. Sie können dann in jeder Ihrer Ingress-Ressourcen auf den entsprechenden Aussteller verweisen, je nachdem, ob sie produktionsbereit sind.
Kopieren Sie die oben gezeigte Ausstellerkonfiguration und ändern Sie den name
Felder zu letsencrypt-production
. Ersetzen Sie als Nächstes die Server-URL durch den unten gezeigten Wert:
https://acme-v02.api.letsencrypt.org/directory
Erstellen Sie den neuen Aussteller in Ihrem Cluster:
kubectl create -f issuer-production.yml
Aktualisieren Sie Ihre Ingress-Ressource, um ein Produktionszertifikat anzufordern, indem Sie den Wert von cert-manager.io/cluster-issuer
ändern Anmerkung zu letsencrypt-production
(oder den Namen, den Sie Ihrem eigenen Produktionsaussteller zugewiesen haben). Verwenden Sie kubectl
um die Änderung zu übernehmen:
kubectl apply -f my-ingress.yaml
Sie sollten nun voll funktionsfähiges HTTPS für Ihre Ingress-Ressource aktiviert haben. Cert-Manager verwaltet Ihre Zertifikate automatisch und erneuert sie, bevor sie ablaufen.
Cert-Manager aktualisieren
Cert-Manager-Releases unterstützen normalerweise direkte Upgrades mit Helm:
helm repo update helm upgrade --version <new version> cert-manager jetstack/cert-manager
Zertifikate bleiben während Upgrades verfügbar, aber der Erneuerungsprozess wird angehalten.
Obwohl Upgrades jetzt normalerweise unkompliziert sind, sollten Sie immer die Versionshinweise lesen, um mögliche Änderungen zu identifizieren, die Sie vornehmen müssen. Dies ist besonders wichtig, wenn Sie Kubernetes aktualisieren oder mehrere Cert-Manager-Versionen durchlaufen. Wenn Sie noch eine ältere Kubernetes-Version verwenden, verwenden Sie möglicherweise eine veraltete Cert-Manager-Version, die einen erheblichen manuellen Eingriff erfordert, um sie auf den neuesten Stand zu bringen.
Zusammenfassung
Let’s Encrypt lässt sich mit Cert-Manager ganz einfach zu einem Kubernetes-Cluster hinzufügen. Sie müssen Cert-Manager mit Helm installieren, einen Aussteller erstellen, der die Let’s Encrypt-API verwendet, und dann in Ihren Ingress-Ressourcen auf diesen Aussteller verweisen.
Sie können Cert-Manager mit Ihrer eigenen Konfiguration für fortgeschrittenere Anwendungsfälle bereitstellen. Sie können eine Zertifikatslebensdauer angeben (verwenden Sie cert-manager.io/duration
Ingress-Anmerkung) deklarieren Sie manuell den allgemeinen Namen des Zertifikats (cert-manager.io/common-name
) und verwenden Sie DNS-Herausforderungen anstelle von HTTP. Die letztere Option kann in bestimmten Szenarien nützlich sein, z. B. wenn Sie ein Wildcard-Zertifikat erwerben möchten.
Die einfache Nutzung zum Schutz von Web-Apps und APIs sollte mit den oben gezeigten Ressourcen unverändert funktionieren. Die HTTP-Verifizierung funktioniert, indem der Ingress-Controller manipuliert wird, um einen temporären .well-known
bereitzustellen URL, auf die Let’s Encrypt zugreifen kann. Wenn Ihre Domain unter dieser URL den richtigen Wert bereitstellt, vertraut Let’s Encrypt darauf, dass Sie die Kontrolle haben, und stellt das Zertifikat aus.