Leitfaden: Einrichtung und Sicherung Ihres Webdienstes in Kubernetes
Entdecken Sie in unserem aktuellen Blogbeitrag, wie Sie mithilfe von Kubernetes Ihre Webdienste sicher und zugänglich machen können. Von der Einrichtung von Ingress-Ressourcen bis zur Verwendung von Zertifikaten von Let’s Encrypt – dieser Leitfaden bietet Ihnen einen umfassenden Überblick.
Kubernetes ist eine beliebte Methode, um Websites und andere Dienste zu hosten, die von seiner Zuverlässigkeit und Skalierbarkeit profitieren. Da immer mehr Websites sensible Daten wie persönliche Informationen oder Passwörter verarbeiten, fordern Browser mittlerweile, dass alle Websites TLS verwenden, um ihren Datenverkehr zu sichern. Es kann jedoch schwierig sein, alle erforderlichen Komponenten zu verwalten, um eine TLS-basierte Website zu hosten, angefangen bei der Beschaffung von TLS-Zertifikaten bis hin zur rechtzeitigen Erneuerung dieser Zertifikate und Konfiguration Ihres Servers zur Verwendung derselben.
Glücklicherweise gibt es Dienste, die Sie in Ihrem Kubernetes-Cluster ausführen können, um einen Großteil dieser Komplexität für Sie zu verwalten. Sie können Traefik Proxy (ausgesprochen wie „Traffic“) als Netzwerkproxy mit cert-manager als Dienst verwenden, der sichere Zertifikate erwirbt und verwaltet. Durch die Verwendung dieser Dienste mit Let’s Encrypt, einem Anbieter kostenloser und automatisierter sicherer Zertifikate, wird die Last der Zertifikatsverwaltung reduziert, in der Regel auf den Punkt, an dem Sie nur die anfängliche Einrichtung vornehmen müssen.
Im Rahmen dieses Tutorials richten Sie cert-manager, Traefik und Let’s Encrypt in Ihrem Kubernetes-Cluster ein, zusammen mit einem Beispiel-Website-Dienst, um automatisch sichere Zertifikate für Ihre Website zu erhalten, zu erneuern und zu verwenden.
Wenn Sie nach einem verwalteten Kubernetes-Hosting-Dienst suchen, sehen Sie sich unseren einfachen, verwalteten Kubernetes-Service an, der für Wachstum entwickelt wurde.
Voraussetzungen
- Ein über kubectl zugänglicher Kubernetes-Cluster
- Eine aktuelle Version von kubectl zum Interagieren mit Ihrem Cluster
- Ein ccenter-Konto
- Helm Version 3 oder höher
- Erfahrung im Umgang mit einem Kubernetes-Cluster mit kubectl
- Ein registrierter Domainname. In diesem Tutorial wird your_domain verwendet. Sie können einen Domainnamen von Namecheap kaufen, einen kostenlos mit Freenom erhalten oder den Domain-Registrar Ihrer Wahl verwenden.
- DNS-Einrichtung für Ihren Domainnamen inklusive persönlichen Zugriffstoken mit Lese- und Schreibzugriff
Schritt 1: Einrichten von cert-manager in Ihrem Cluster
Traditionell müssten Sie beim Einrichten sicherer Zertifikate für eine Website ein Zertifikatsanforderung erstellen und eine vertrauenswürdige Zertifizierungsstelle bezahlen, um ein Zertifikat für Sie zu erstellen. Anschließend müssten Sie Ihren Webserver so konfigurieren, dass er dieses Zertifikat verwendet, und sich daran erinnern, diesen gleichen Prozess jedes Jahr zu durchlaufen, um Ihre Zertifikate auf dem neuesten Stand zu halten.
Mit der Gründung von Let’s Encrypt im Jahr 2014 ist es jedoch nun möglich, kostenlose Zertifikate über einen automatisierten Prozess zu erhalten. Diese Zertifikate sind jedoch nur wenige Monate lang gültig, anstatt ein Jahr, daher ist die Verwendung eines automatisierten Systems zur Erneuerung dieser Zertifikate erforderlich. Zur Bewältigung dessen verwenden Sie cert-manager, einen Dienst, der entwickelt wurde, um in Kubernetes zu laufen und den Lebenszyklus Ihrer Zertifikate automatisch zu verwalten.
In diesem Abschnitt richten Sie cert-manager ein, um in Ihrem Cluster in seinem eigenen cert-manager-Namespace zu laufen.
Zuerst installieren Sie cert-manager mithilfe von kubectl mit der cert-manager-Release-Datei:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.9.1/cert-manager.yaml
Standardmäßig installiert cert-manager in seinem eigenen Namespace mit dem Namen cert-manager. Wenn die Datei angewendet wird, werden eine Reihe von Ressourcen in Ihrem Cluster erstellt.
Schritt 2: Konfigurieren des Let’s Encrypt-Zertifikatsausstellers
Die Verwendung eines sicheren Zertifikats für Ihre Website ist eine Möglichkeit, Ihren Benutzern mitzuteilen, dass sie darauf vertrauen können, dass die von ihnen angezeigte Website von Ihren Servern stammt. Der Zertifizierungsstellen muss überprüfen, ob Sie die Domain besitzen, für die das Zertifikat ausgestellt wird. Let’s Encrypt verwendet dazu einen Standard namens ACME, der Herausforderungen verwendet, um zu beweisen, dass Sie die Domain besitzen, für die Sie ein Zertifikat erstellen. Cert-manager unterstützt sowohl DNS- als auch HTTP-Herausforderungen für verschiedene Anbieter.
In diesem Abschnitt erstellen Sie einen ClusterIssuer für Ihren Cluster, um cert-manager mitzuteilen, wie Zertifikate von Let’s Encrypt ausgestellt werden sollen und welche Anmeldeinformationen für den Zugriff auf Ihren DNS-Anbieter verwendet werden sollen.
Speichern Sie dazu die folgenden YAML-Konfigurationsdetails in einer Datei mit dem Namen clusterissuer.yaml:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-dns
spec:
acme:
# Stellen Sie sicher, dass der Server auf die Produktionsumgebung von Let’s Encrypt zeigt
server: https://acme-v02.api.letsencrypt.org/directory
# Verwenden Sie einen E-Mail-Adresse, die Let’s Encrypt bei Problemen kontaktieren kann
email: your_email@your_domain
# Wir verwenden die DNS-01-Herausforderung, da es die einzige Möglichkeit ist, Herausforderungen in Zonen zu akzeptieren, die nur DNS unterstützen
solvers:
– dns01:
centron:
# Holen Sie Ihren centron API-Token aus der Umgebungsvariable
tokenSecretRef:
name: centron-dns
key: access-token
Ersetzen Sie your_email@your_domain durch Ihre eigene E-Mail-Adresse. Dies wird von Let’s Encrypt verwendet, um Sie zu benachrichtigen, wenn es Probleme mit Ihrem Zertifikat gibt. Sie können auch eine Alias-E-Mail-Adresse verwenden, wenn Sie möchten.
Schritt 3: Konfigurieren des centron-Zugriffstokens
Damit cert-manager DNS-01-Herausforderungen auf Ihrem DNS-Anbieter durchführen kann, muss es auf Ihr ccenter-Konto zugreifen können. Dies erfolgt über die Verwendung eines API-Tokens, der in Ihrem Cluster als Kubernetes-Geheimnis gespeichert wird.
In diesem Abschnitt erstellen Sie ein Kubernetes-Geheimnis mit Ihrem centron-Zugriffstoken.
Zuerst speichern Sie Ihren centron-Zugriffstoken in einer Umgebungsvariable:
export CENTRON_ACCESS_TOKEN=your_centron_access_token
Ersetzen Sie your_centron_access_token durch Ihren eigenen Zugriffstoken.
Dann erstellen Sie ein Kubernetes-Geheimnis mit Ihrem Zugriffstoken:
kubectl create secret generic centron-dns –from-literal=access-token=$CENTRON_ACCESS_TOKEN
Schritt 4: Erstellen eines Ingress-Ressourcenobjekts
In Kubernetes ist eine Ingress-Ressource ein Objekt, das HTTP- und HTTPS-Routen von außerhalb des Clusters in Dienste innerhalb des Clusters verwaltet. Traefik kann Ingress-Ressourcen verwenden, um automatisch SSL/TLS-Zertifikate von cert-manager zu erhalten und diese zu verwenden, um den Datenverkehr auf Ihre Dienste zu sichern.
Erstellen Sie eine Ingress-Ressource für Ihren Website-Dienst mit der folgenden Konfiguration:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
cert-manager.io/cluster-issuer: „letsencrypt-dns“
# Aktivieren Sie TLS-Zertifikate für diesen Ingress
traefik.ingress.kubernetes.io/router.tls: „true“
spec:
rules:
– host: your_domain
http:
paths:
– pathType: Prefix
path: „/“
backend:
service:
name: example-service
port:
number: 80
tls:
– hosts:
– your_domain
# Lassen Sie Let’s Encrypt das Zertifikat verwalten
secretName: example-tls
Ersetzen Sie your_domain durch Ihre eigene Domain und example-service durch den Namen Ihres Dienstes, den Sie sichern möchten.
Schritt 5: Erstellen des Beispiel-Website-Dienstes
Um zu demonstrieren, wie Traefik, cert-manager und Let’s Encrypt zusammenarbeiten, erstellen Sie einen einfachen Beispiel-Website-Dienst, der durch Traefik gesichert wird.
Erstellen Sie zuerst eine Beispiel-Website-Datei mit dem Namen index.html:
Hello, world!
This is an example website secured with Traefik, cert-manager, and Let’s Encrypt.
Speichern Sie die Datei auf Ihrem lokalen Computer.
Erstellen Sie dann eine ConfigMap-Ressource aus der index.html-Datei:
kubectl create configmap example-website –from-file=index.html
Erstellen Sie anschließend eine Deployment-Ressource für Ihren Beispiel-Website-Dienst:
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
replicas: 1
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
containers:
– name: example-container
image: nginx:latest
ports:
– containerPort: 80
volumeMounts:
– name: example-website
mountPath: /usr/share/nginx/html
volumes:
– name: example-website
configMap:
name: example-website
Erstellen Sie schließlich eine Service-Ressource für Ihren Beispiel-Website-Dienst:
apiVersion: v1
kind: Service
metadata:
name: example-service
spec:
selector:
app: example
ports:
– protocol: TCP
port: 80
targetPort: 80
Nachdem Sie diese Konfigurationen angewendet haben, sollten Sie Ihren Dienst auf Ihrer Domain mit einem gültigen TLS-Zertifikat verfügbar machen! Sie können Ihren Fortschritt überprüfen, indem Sie kubectl get ingress –watch ausführen und warten, bis die IP-Adresse zugewiesen wurde. Dann können Sie Ihre Domain in einem Webbrowser öffnen und Ihre sichere Website sehen.
Schritt 6 — Ihr Webdienst verfügbar und sicher machen
Obwohl alle einzelnen Dienste in Ihrem Cluster laufen, agieren sie relativ unabhängig voneinander. cert-manager ist einfach da, Traefik kennt keine Websites, die es bedienen soll, und Ihre Nginx-Website ist nur verfügbar, wenn Sie eine Portweiterleitung zum Cluster durchführen. In diesem Abschnitt erstellen Sie eine Ingress-Ressource, um alle Ihre Dienste zu verbinden.
Öffnen Sie zuerst erneut die Datei tutorial-service.yaml:
nano tutorial-service.yaml
Fügen Sie am Ende der Datei, nach dem tutorial-service Service, den Sie zuvor hinzugefügt haben, eine Ingress-Ressource hinzu. Stellen Sie sicher, dass Sie die Konfiguration mit Ihrem eigenen Domainnamen aktualisieren und die — am Anfang einfügen, um Ihre Ingress-Ressource von der Service-Ressource darüber zu trennen:
…
—
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tutorial-service-ingress
namespace: tutorial
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
traefik.ingress.kubernetes.io/router.tls: „true“
cert-manager.io/cluster-issuer: letsencrypt-issuer
spec:
rules:
– host: tutorial-service.your_domain
http:
paths:
– path: /
pathType: Prefix
backend:
service:
name: tutorial-service
port:
number: 80
tls:
– secretName: tutorial-service-cert
hosts:
– tutorial-service.your_domain
Diese Zeilen enthalten die Regeln und Annotationen, um alles miteinander zu verknüpfen. Die Ingress-Ressource enthält Verweise auf Traefik, cert-manager und Ihren tutorial-service. Der Abschnitt Annotationen enthält einige verschiedene, aber wichtige Annotationen.
Die Annotation traefik.ingress.kubernetes.io/router.entrypoints teilt Traefik mit, dass der Verkehr für diese Ingress über den Websecure-EntryPoint verfügbar sein sollte. Dies ist ein EntryPoint, den das Helm-Chart standardmäßig konfiguriert, um HTTPS-Verkehr zu handhaben und auf dem traefik_ip_address Port 443 zu lauschen, dem Standard für HTTPS.
Die nächste Annotation, traefik.ingress.kubernetes.io/router.tls, ist auf true gesetzt, um Traefik mitzuteilen, nur auf HTTPS-Verkehr zu antworten und nicht auf HTTP-Verkehr. Da Ihre Website sicher sein muss, um sensible Daten zu handhaben, möchten Sie nicht, dass Ihre Benutzer versehentlich eine unsichere Version verwenden.
Die letzte Annotation, cert-manager.io/cluster-issuer, ist auf letsencrypt-issuer gesetzt, um cert-manager mitzuteilen, welchen Aussteller Sie verwenden möchten, wenn sichere Zertifikate für diese Ingress ausgestellt werden sollen. Zu diesem Zeitpunkt ist letsencrypt-issuer der einzige Aussteller, den Sie konfiguriert haben, aber Sie könnten später weitere hinzufügen und verschiedene für verschiedene Websites verwenden.
Im Abschnitt spec.rules der Ingress geben Sie eine Regel für die Routen des an die Ingress gesendeten Verkehrs ein. Es sagt für den Host namens tutorial-service.your_domain, verwende http für die angegebenen Pfade. Der einzige enthaltene Pfad ist die Wurzel /path mit einem Pfadtyp von Prefix, was bedeutet, dass jeder gesendete Verkehr an das bereitgestellte Backend gesendet werden sollte. Der Abschnitt Backend sagt, dass es sich um einen Dienst handelt, dass der Dienst, an den Verkehr gesendet werden soll, der tutorial-service Service ist, den Sie zuvor erstellt haben, und dass der Verkehr an Port 80 des Dienstes gesendet werden soll.
Der Abschnitt spec.tls der Ingress enthält die Informationen, die cert-manager benötigt, um Ihre sicheren Zertifikate anzufordern und auszustellen, sowie die Informationen, die Traefik benötigt, um diese Zertifikate zu verwenden. Der secretName ist das Kubernetes Secret, in dem cert-manager das ausgestellte sichere Zertifikat ablegen wird, und das Secret, das Traefik verwenden wird, um das ausgestellte Zertifikat zu laden. Der hosts-Abschnitt listet die Hostnamen auf, für die cert-manager die Zertifikate anfordern wird. In diesem Fall wird es nur der Hostname tutorial-service.your_domain sein, aber Sie könnten auch andere, die Sie besitzen, hinzufügen, wenn Sie möchten, dass die Website auf mehrere Hostnamen reagiert.
Nachdem Sie die erstellte Ingress gespeichert haben, wenden Sie erneut kubectl apply an, um die neue Ressource auf Ihrem Cluster anzuwenden:
kubectl apply -f tutorial-service.yaml
Die Ingress wird erstellt und die anderen Ressourcen bleiben unverändert:
Output
namespace/tutorial unchanged
deployment.apps/tutorial-service unchanged
service/tutorial-service unchanged
ingress.networking.k8s.io/tutorial-service-ingress created
Sobald die Ingress erstellt ist, wird Traefik beginnen, sich zu konfigurieren, und cert-manager wird mit dem Challenge/Response-Prozess beginnen, um das Zertifikat auszustellen. Dies kann einige Minuten dauern, daher können Sie überprüfen, ob das Zertifikat ausgestellt wurde, indem Sie die Zertifikate in Ihrem Tutorial-Namespace überprüfen:
kubectl get -n tutorial certificates
Sie erhalten eine Ausgabe ähnlich der folgenden:
Output
NAME READY SECRET AGE
tutorial-service-cert False tutorial-service-cert 12m
Wenn das READY-Feld False ist, wurde das Zertifikat noch nicht ausgestellt. Sie können denselben Befehl weiterhin ausführen, um zu überprüfen, ob es zu True wird. Es kann einige Zeit dauern, bis es ausgestellt ist, aber wenn es länger als einige Minuten dauert, könnte dies bedeuten, dass etwas mit Ihrer Konfiguration nicht stimmt.
Hinweis: Wenn Ihr Zertifikat nach 10-15 Minuten nicht ausgestellt wird, kann es hilfreich sein, sich die Protokollmeldungen für cert-manager anzusehen, um zu sehen, ob Probleme beim Anfordern des Zertifikats auftreten. Um diese Protokolle anzuzeigen, können Sie den folgenden Befehl verwenden, um die Protokolle zu beobachten, und mit CONTRL+C stoppen, um ihnen nicht mehr zu folgen:
kubectl logs -n cert-manager deployment/cert-manager –tail
=10 -f
Sobald Ihr Zertifikat bereit ist, können Sie eine HTTPS-Anfrage gegen Ihren Cluster mit curl durchführen:
curl https://tutorial-service.your_domain
Hinweis: Abhängig davon, wie lange Sie Ihre DNS-Einträge aktualisiert haben und wie lange die DNS-Einträge zum Verbreiten über die DNS-Server des Internets benötigen, sehen Sie möglicherweise eine Fehlermeldung, dass Ihre Domain nicht gefunden werden konnte oder an den falschen Ort führt. Wenn dies geschieht, können Sie einen Curl-Workaround verwenden, um die DNS-Prüfung vorübergehend zu überspringen, indem Sie den folgenden Befehl ausführen:
curl https://tutorial-service.your_domain –resolve ‚tutorial-service.your_domain:443:traefik_ip_address‘
Dieser Befehl teilt dem Curl-Befehl mit, die –resolve-Option zu verwenden, um jegliche DNS-Auflösung für tutorial-service.your_domain auf Port 443 mit traefik_ip_address zu überschreiben. Da das DNS-Ergebnis, das Curl erhält, falsch ist, können Sie trotzdem eine Verbindung zu Traefik in Ihrem Cluster herstellen, bis DNS vollständig aktualisiert ist.
In Ihrer Ausgabe erhalten Sie dieselbe Nginx „Willkommen!“-Seite wie zuvor beim Port-Forwarding, aber diesmal ist sie über das Internet erreichbar:
Wenn Sie jedoch versuchen, die HTTP-Version Ihrer Website anzufordern, erhalten Sie keine Antwort:
curl http://tutorial-service.your_domain
Stattdessen wird eine 404-Fehlerseite geladen:
Output
404 page not found
Da Sie Ihre Website in der Ingress so konfiguriert haben, dass sie nicht auf HTTP-Verkehr antwortet, hat Traefik nie eine Website an dieser Adresse eingerichtet und gibt einen 404-Fehler zurück. Dies kann Ihre Benutzer verwirren, wenn sie wissen, dass sie eine Website sehen sollten. Viele Administratoren konfigurieren ihre Server so, dass sie den HTTP-Verkehr automatisch zur HTTPS-Site umleiten. Traefik ermöglicht Ihnen dies auch, indem Sie Traefik aktualisieren, um ihm mitzuteilen, den gesamten Webverkehr zum websecure-Port umzuleiten:
helm upgrade –namespace=traefik traefik traefik/traefik –set ‚ports.web.redirectTo=websecure‘
Die Option –set ‚ports.web.redirectTo=websecure‘ teilt Traefik mit, sich neu zu konfigurieren, um die Umleitung automatisch durchzuführen.
Sie sollten eine Meldung ähnlich der folgenden sehen, dass die Traefik-Installation „aktualisiert“ wurde:
Output
Release „traefik“ has been upgraded. Happy Helming!
NAME: traefik
LAST DEPLOYED: Sun Oct 2 19:17:34 2022
NAMESPACE: traefik
STATUS: deployed
REVISION: 2
TEST SUITE: None
Nun, wenn Sie eine Anfrage an Ihren HTTP-Standort senden, erhalten Sie eine Ausgabe, die besagt, dass die Site verschoben wurde:
curl http://tutorial-service.your_domain
Diese Antwort ist erwartet:
Output
Moved Permanently
Da Sie möchten, dass Ihr gesamter Verkehr zu Ihrer HTTPS-Site geht, gibt Traefik jetzt eine automatische Weiterleitung von der HTTP-Site zur HTTPS-Site zurück. Webbrowser führen diese Umleitung automatisch durch, aber Curl benötigt eine zusätzliche Option, -L, um ihm zu sagen, dass er Weiterleitungen folgen soll. Aktualisieren Sie Ihren Curl-Befehl mit der Option -L, um Weiterleitungen zu folgen:
curl -L http://tutorial-service.your_domain
Die Ausgabe enthält die Nginx-Begrüßungsseite von Ihrer HTTPS-Site:
Diese Ausgabe bestätigt, dass die Weiterleitung wie erwartet funktioniert.
In diesem Abschnitt haben Sie cert-manager, Traefik und Ihre Nginx-Website mithilfe einer Kubernetes-Ingress-Ressource verbunden. Außerdem haben Sie Ihre Traefik-Konfiguration aktualisiert, um HTTP-Verkehr zu HTTPS-Websites umzuleiten, um sicherzustellen, dass Benutzer Ihre Website finden können.
Fazit
In diesem Tutorial haben Sie einige verschiedene Dienste in Ihrem Kubernetes-Cluster installiert, um das Ausführen einer Website mit sicheren Zertifikaten zu vereinfachen. Sie haben den cert-manager-Dienst installiert, um den Lebenszyklus von TLS-Zertifikaten zu verwalten, die von Let’s Encrypt ausgestellt wurden. Sie haben Traefik installiert, um Ihre Websites außerhalb Ihres Clusters verfügbar zu machen und die von Let’s Encrypt ausgestellten TLS-Zertifikate zu verwenden. Schließlich haben Sie eine Nginx-Website in Ihrem Cluster erstellt, um Ihre cert-manager- und Traefik-Konfigurationen zu testen.
Nun, da Sie cert-manager und Traefik in Ihrem Cluster konfiguriert haben, könnten Sie auch weitere Websites mit verschiedenen Ingress-Ressourcen einrichten, um viele Websites aus demselben Cluster mit einer einzigen cert-manager- und Traefik-Installation zu bedienen.
Sie können die Dokumentation des Traefik-Proxys lesen, um mehr über die verschiedenen Funktionalitäten zu erfahren, die Traefik in Ihrem Cluster bereitstellen kann. cert-manager hat ebenfalls umfangreiche Dokumentation darüber, wie Sie es mit anderen Arten von Let’s Encrypt-Herausforderungen verwenden können, sowie Quellen außerhalb von Let’s Encrypt.
Um die Konfiguration Ihres Kubernetes-Clusters fortzusetzen, sehen Sie sich unsere anderen Tutorials zu Kubernetes an. Leitfaden: Einrichtung und Sicherung Ihres Webdienstes in Kubernetes