Rancher 2.0 - Zertifikate mit Let's Encrypt und Cert-Manager
Rancher-Workloads unter Rancher 2 mit Zertifikaten auszustatten und sie zu pflegen, bedarf einiges an Aufwand. Ein Container mit installiertem certbot muss mit der gewünschten Domain temporär verknüpft werden (Load-Balancer), um die Domain-Verifizierung durch Let's Encrypt zu ermöglichen. Darüberhinaus müssen Zertifikate regelmäßig manuell aktualisert werden.
Automatisieren lässt sich die Zertifikatsverwaltung mit cert-manager. Zertifikate lassen sich mit dem "Certificate Management Controller" bequem mit Hilfe von kubectl konfigurieren. Die Aktualisierung der Zertifikate erfolgt im Anschluss automatisiert.
Dieser Artikel stellt die absolut minimalen Einstellungen, die für die Anlage eines Zertifikats notwendig sind, dar.
Installation
Um den Cert-Manager zu installieren, muss im Rancher unter "Global" --> "Catalogs" das Katalog "Helm Stable" aktiviert werden.
Im gewünschten Rancher-Projekt kann dann unter "Catalog Apps" die App "cert-manager" ausgewählt und gestartet werden.
Konfiguration
Um die Konfiguration vornehmen zu können, sollte Rancher CLI und Kubectl installiert sein
Die generierten Zertifikate möchten wir im geseamten Cluster verfübgar haben (ClusterIssuer).
Als Validierung wählen wir die HTTP01-Methode.
Die Domain, für die wir ein Zertifikat generieren wollen, nenne ich in diesem Beispiel www.example.com.
Schritt 1: ClusterIssuer anlegen
Ein ClusterIssuer muss angelegt werden. Dazu legen wir eine datei clusterIssuer.yml an:
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
name: letsencrypt-issuer
namespace: default
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: cert@www.example.com
privateKeySecretRef:
name: letsencrypt-cluster
http01: {}
Der ClusterIssuer wird generiert mit
$ rancher kubectl create -f clusterIssuer.yml
Prüfung ob der ClusterIssuer korrekt angelegt ist:
$ rancher kubectl describe clusterissuer letsencrypt-issuer
Schritt 2: Zertifikat anlegen
Ein Zertifikats-Objekt muss angelegt werden. Die Konfiguration speichern wir in einer Datei mit dem Namen certificate.yml:
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
name: example-com
namespace: default
spec:
secretName: example-com-tls
issuerRef:
name: letsencrypt-issuer
kind: ClusterIssuer
commonName: www.example.com
dnsNames:
- example.com
- www.example.com
acme:
config:
- http01:
ingressClass: nginx
domains:
- example.com
- www.example.com
Die Konfiguration an Rancher übertragen:
$ rancher kubectl create -f certificate.yml
Das Zertifikat überprüfen:
$ rancher kubectl describe certificate example-com
Schritt 3: Zertifikat verwenden
Nach erfolgreicher Konfiguration des Cert-Manager sollte das Zertifikat unter "Ressources" --> "Certificates" einsehbar sein. Es erscheint mit dem Namen, den wir unter "secretName" der Datei certificate.yml eingetragen haben. In den Details des Zertifikats sind keine Einstellungen sichtbar. Das ist erstmal korrekt so. Cert-Manager und Rancher 2.0 können es an der Stelle noch nicht besser lösen.
Unter "Workloads" --> "Load Balancing" --> Im gewünschten Eintrag unter "SSL/TLS Certificates" kann das frisch generierte Zertifikat ausgewählt werden. Unter "Hosts" müssen zusätzlich noch dieselben Hostnamen eingetragen werden, die man für die Zertifikatgenerierung konfiguriert hat.