Der Traefik Kubernetes Ingress Provider ist ein Open-Source Ingress-Controller für Kubernetes. In Kombination mit cert-manager werden TLS-Zertifikate automatisch ausgestellt, sodass interne Kubernetes-Services sicher veröffentlicht werden.
In dieser Anleitung richten Sie den Traefik Ingress Controller in Ihrem Kubernetes-Cluster ein. Zusätzlich integrieren Sie cert-manager zur Bereitstellung von TLS-Zertifikaten, erstellen eine Beispielanwendung, konfigurieren einen Service, veröffentlichen diesen über ein Ingress-Objekt und stellen mit cert-manager ein TLS-Zertifikat aus.
Voraussetzungen
Bevor Sie starten, stellen Sie sicher, dass Sie:
- Zugriff auf einen Kubernetes-Cluster haben.
- kubectl lokal installiert haben.
- den Helm-Client lokal installiert haben.
- einen Domainnamen besitzen. In dieser Anleitung wird
example.comverwendet – ersetzen Sie diesen durch Ihre eigene Domain.
Passende Infrastruktur bei centron
Vom Container zum Cluster: Managed Kubernetes mit cStack gibt es ab 29,99 € im Monat – Control Plane, AutoScaler und Traffic inklusive. Managed Kubernetes ansehen →
Traefik installieren und konfigurieren
Legen Sie einen eigenen Namespace für die Traefik-Ressourcen an:
$ kubectl create namespace traefik-namespaceFügen Sie das offizielle Traefik Helm-Repository hinzu:
$ helm repo add traefik https://helm.traefik.io/traefikAktualisieren Sie die Helm-Repositories:
$ helm repo updateInstallieren Sie den Traefik Ingress Controller mit Helm:
$ helm install --namespace=traefik-namespace traefik traefik/traefikDer obige Befehl installiert den Traefik Ingress Controller im Namespace traefik-namespace.
Prüfen Sie den Service des Traefik Ingress Controllers, um die externe IP zu ermitteln:
$ kubectl get services -n traefik-namespaceBeispielausgabe solange die externe IP noch aussteht:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
traefik LoadBalancer 10.108.209.185 <pending> 80:30046/TCP,443:30279/TCP 78s
Nach einiger Zeit erhält der Service eine externe IP:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
traefik LoadBalancer 10.107.61.70 192.0.2.10 80:30351/TCP,443:32047/TCP 9m34s
Melden Sie sich anschließend beim DNS-Provider Ihrer Domain an und erstellen Sie einen A-Record, der Ihre Domain auf die externe IP des Traefik LoadBalancers verweist.
cert-manager installieren
cert-manager ist ein Kubernetes-Add-on, das TLS-Zertifikate von verschiedenen Certificate Authorities (CAs) wie Let’s Encrypt, HashiCorp Vault, Venafi und weiteren ausstellen kann. Zudem sorgt es für die rechtzeitige Erneuerung der Zertifikate. In diesem Schritt installieren Sie cert-manager in Ihrem Cluster.
Installieren Sie cert-manager in Version v1.17.2 mit folgendem Befehl:
$ kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.17.2/cert-manager.yamlDamit wird cert-manager v1.17.2 installiert. Um die neueste Version zu prüfen, besuchen Sie das GitHub-Repository von cert-manager.
Überprüfen Sie, ob alle cert-manager Pods laufen:
$ kubectl get pods --namespace cert-managerDie Ausgabe sollte Ressourcen mit cert-manager im Namen enthalten.
ClusterIssuer erstellen
Ein ClusterIssuer ist eine clusterweite Ressource von cert-manager, die TLS-Zertifikate für Ingress-Objekte ausstellt. Im nächsten Schritt konfigurieren Sie einen ClusterIssuer für Let’s Encrypt.
Legen Sie eine Datei cluster-issuer.yaml an:
$ nano cluster-issuer.yamlFügen Sie folgende Konfiguration ein:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: hello@example.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod-key
solvers:
- http01:
ingress:
class: traefikHinweis: Ersetzen Sie hello@example.com durch eine gültige E-Mail-Adresse. Die Verwendung von example.com verhindert die korrekte Funktion des ClusterIssuers.
Erklärung der Konfiguration:
- acme: Legt die ACME-Einstellungen für Let’s Encrypt fest.
- email: Die mit dem Let’s Encrypt-Konto verknüpfte E-Mail-Adresse.
- server: Die ACME-Server-URL.
- privateKeySecretRef: Verweist auf das Kubernetes-Secret, das den privaten Schlüssel speichert.
- solvers: Definiert, wie die ACME-Challenge gelöst wird.
- http01: Nutzt HTTP-01 zur Domainvalidierung.
- ingress: Definiert Traefik als Ingress-Klasse zur Validierung.
Speichern Sie die Datei und wenden Sie diese an:
$ kubectl apply -f cluster-issuer.yamlÜberprüfen Sie den Status des ClusterIssuers:
$ kubectl get clusterissuerBeispielausgabe:
NAME READY AGE
letsencrypt-prod True 2m44s
Der Wert True im Feld READY bestätigt, dass der ClusterIssuer ordnungsgemäß eingerichtet und bereit ist, Zertifikate auszustellen.
Bereitstellung einer Beispielanwendung
In diesem Abschnitt stellen Sie eine Testanwendung auf Basis des Nginx-Webservers bereit. Damit überprüfen Sie Ihre Traefik-Konfiguration sowie die Zertifikatsausstellung durch cert-manager.
Erstellen Sie einen Namespace namens example-app-namespace, der die Ressourcen der Anwendung aufnimmt:
$ kubectl create namespace example-app-namespaceErstellen Sie eine Deployment-Datei mit dem Namen example-app-deployment.yaml:
$ nano example-app-deployment.yamlFügen Sie folgenden Inhalt ein:
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: example-app-namespace
name: example-app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: example-app
template:
metadata:
labels:
app: example-app
spec:
containers:
- name: web-app
image: nginx
ports:
- containerPort: 80Dieses Deployment mit dem Namen example-app-deployment verwendet das offizielle Nginx-Image und startet drei Replikas.
Erläuterung der Konfiguration:
- replicas: Anzahl der erzeugten Pod-Instanzen.
- selector: Labels, mit denen die vom Deployment verwalteten Pods identifiziert werden.
- template: Vorlage für die Erstellung neuer Pods.
- metadata: Den Pods zugewiesene Labels.
- spec: Spezifikation der Pods.
- containers: Containerdefinitionen innerhalb der Pods.
- name: Name des Containers.
- image: Verwendetes Container-Image (nginx).
- ports: In den Containern geöffnete Ports.
Wenden Sie das Deployment an:
$ kubectl apply -f example-app-deployment.yamlPrüfen Sie, ob die Pods laufen:
$ kubectl get pods -n example-app-namespaceSie sollten drei Pods sehen, deren Namen mit example-app-deployment- beginnen.
Ein Ingress-Objekt erstellen
Erstellen Sie nun einen Service für das Deployment und anschließend ein Ingress, um diesen mit einem TLS-Zertifikat extern bereitzustellen.
Legen Sie eine Service-Datei namens example-app-service.yaml an:
$ nano example-app-service.yamlFügen Sie folgenden Inhalt ein:
apiVersion: v1
kind: Service
metadata:
namespace: example-app-namespace
name: example-app-service
spec:
selector:
app: example-app
ports:
- protocol: TCP
port: 80
targetPort: 80Dieser Service example-app-service macht die Pods des Deployments verfügbar.
Erläuterung der Konfiguration:
- spec: Legt die Service-Konfiguration fest.
- selector: Labels, nach denen die Ziel-Pods für den Datenverkehr ausgewählt werden.
- app: Entspricht dem Label
app=example-app. - ports: Vom Service bereitgestellte Ports.
- protocol: Verwendetes Protokoll (TCP).
- port: Vom Service exponierter Port.
- targetPort: Zielport innerhalb der Pods.
Wenden Sie das Service-Manifest an:
$ kubectl apply -f example-app-service.yamlÜberprüfen Sie die Erstellung des Services:
$ kubectl get services -n example-app-namespaceBeispielausgabe:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
example-app-service ClusterIP 10.97.221.68 <none> 80/TCP 81s
Erstellen Sie als Nächstes eine Ingress-Datei namens example-app-ingress.yaml. Ersetzen Sie example.com durch Ihre eigene Domain.
$ nano example-app-ingress.yamlFügen Sie die folgende Ingress-Konfiguration ein:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-app-ingress
namespace: example-app-namespace
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
traefik.ingress.kubernetes.io/router.tls: "true"
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-app-service
port:
number: 80
tls:
- secretName: web-app-cert
hosts:
- example.comDieses Ingress veröffentlicht den Service example-app-service unter der Domain example.com.
Erläuterung der Konfiguration:
- annotations: Legen das Verhalten für Traefik und cert-manager fest.
- traefik.ingress.kubernetes.io/router.entrypoints: websecure — Leitet den Traffic über den HTTPS-Einstiegspunkt.
- traefik.ingress.kubernetes.io/router.tls: "true" — Aktiviert TLS-Terminierung für sicheren Verkehr.
- cert-manager.io/cluster-issuer: letsencrypt-prod — Verknüpft das Ingress mit dem ClusterIssuer zur Zertifikatserstellung.
- rules: Definieren die Weiterleitungsregeln.
- host: Gibt den Domainnamen an.
- paths: Legen Pfade für Anfragen fest.
- backend: Leitet Anfragen an den Service weiter.
- tls: TLS-Konfiguration des Ingress.
- secretName: Secret, das das ausgestellte TLS-Zertifikat enthält.
Wenden Sie das Ingress-Manifest an:
$ kubectl apply -f example-app-ingress.yamlPrüfen Sie die Erstellung des Ingress:
$ kubectl get ingress -n example-app-namespaceBeispielausgabe:
NAME CLASS HOSTS ADDRESS PORTS AGE
web-app-ingress traefik example.com 80, 443 9s
Anfangs ist das Feld ADDRESS leer. Nach kurzer Zeit wird es mit der externen IP des Traefik-Services gefüllt.
Prüfen Sie, ob Let’s Encrypt ein Zertifikat für Ihre Domain ausgestellt hat:
$ kubectl get certificates -n example-app-namespaceBeispielausgabe:
NAME READY SECRET AGE
web-app-cert True web-app-cert 41s
Wenn das Feld READY den Wert True hat, wurde das SSL-Zertifikat erfolgreich ausgestellt. Bis ein Zertifikat bereit ist, kann es einige Minuten dauern.
Um die automatische Erneuerung zu bestätigen, beschreiben Sie die Certificate-Ressource:
$ kubectl describe -n example-app-namespace certificate web-app-certSuchen Sie in der Ausgabe nach dem Feld Renewal Time:
...
Renewal Time: 2023-09-17T15:23:45Z
...
Öffnen Sie abschließend Ihren Browser und rufen Sie Ihre Domain über HTTPS auf:
Sie sollten die standardmäßige Nginx-Willkommensseite sicher angezeigt bekommen.
Fehlerbehebung
Nachfolgend finden Sie einige gängige Tipps zur Fehlerbehebung, um Traefik und die Cluster-Ressourcen effektiv zu verwalten.
Kein Let’s Encrypt Zertifikat erhalten: Wenn die Spalte READY für Ihr Zertifikat den Wert False anzeigt, stellen Sie sicher, dass Ihre Domain korrekt auf die externe IP des Traefik LoadBalancers verweist. Für weitere Details prüfen Sie die Logs von cert-manager mit:
$ kubectl logs deployment/cert-manager -n cert-manager --tail=15 -fTraefik-Logs überprüfen: Falls Traefik nicht wie erwartet funktioniert, können Sie die Pod-Logs auf Fehlermeldungen oder Warnungen prüfen:
$ kubectl logs -n <namespace> <traefik-pod>DNS-Konfiguration prüfen: Stellen Sie sicher, dass Ihr Domainname korrekt auf die externe IP-Adresse des Traefik LoadBalancers verweist. Falsche DNS-Einträge verhindern, dass Traefik Anfragen richtig verarbeiten kann.
Ingress-Konfiguration prüfen: Wenn Traefik Anfragen nicht weiterleitet, kontrollieren Sie die Ingress-YAML-Datei. Vergewissern Sie sich, dass alle erforderlichen Annotationen für Traefik und cert-manager vorhanden sind:
$ kubectl get ingressTraefik-Ressourcen überprüfen: Kontrollieren Sie regelmäßig den Status von Traefik-Ressourcen wie Pods, Services und Ingress-Objekten, um sicherzustellen, dass diese korrekt laufen:
$ kubectl get pods -n traefik-namespaceFazit
In dieser Anleitung haben Sie den Traefik Ingress Controller installiert, eine Beispielanwendung bereitgestellt und diese mithilfe von Traefik, cert-manager und Let’s Encrypt sicher veröffentlicht. Für weiterführende Informationen und zusätzliche Konfigurationsmöglichkeiten besuchen Sie die offizielle Dokumentation:
Testen Sie Ihr Setup auf ccloud³
Registrieren Sie sich in der ccloud³ und erhalten Sie 200 € Startguthaben für Ihr Projekt – z. B. für eine PostgreSQL-VM mit automatischen Backups.