Es ist kein Geheimnis, dass K8S eine exzellente Community und allgemein gute Dokumentation hat. Darin finden Sie leicht die Antwort auf viele Fragen. Aber wie jede andere Dokumentation kann sie nicht absolut alles abdecken. In diesem Artikel werde ich versuchen, detaillierte Anweisungen zum Bereitstellen und Konfigurieren von Traefik für die Verwendung als Ingress-Controller bereitzustellen .

Was ist Ingress?
Ingress ist ein API-Objekt, das den externen Zugriff auf Dienste in einem Cluster hauptsächlich über HTTP / HTTPS steuert. Damit die Ingress-Ressource funktioniert, benötigen Sie einen Ingress-Controller. Wenn Sie GCE verwenden, ist der Ingress-Controller bereits für den Assistenten bereitgestellt. Wenn Sie den Cluster jedoch selbst heruntergeladen haben, z. B. von kops
auf AWS, müssen Sie den Ingress-Controller selbst bereitstellen. In der Minikube wird dies durch das Einfügen des Ingress-Add-Ins gelöst.
Ingress Controller
Die Rolle des Ingress-Controllers kann von NGINX Ingress Controller, Kong, Octavia Ingress Controller usw. übernommen werden. In diesem Artikel wird ein Tool wie Traefik betrachtet und erläutert, wie Sie es als Ingress-Controller für Dienste in einem Cluster verwenden können.
Warum?
Warum einen Ingress-Controller verwenden, wenn Sie über NodePort
oder LoadBalancer
Zugriff auf jeden Dienst NodePort
LoadBalancer
? Kurz gesagt, dies ermöglicht einem zentralen Punkt, den gesamten Datenverkehr zu vertreten. Das heißt, mit dem Ingress-Controller benötigen Sie nur einen LoadBalancer für Traefik und nichts weiter. Dieses Bundle löst den gesamten Datenverkehr auf.
Traefik-Komponenten
Traefik kündigte Unterstützung für Kubernetes Ingress in Version 1.4 an. Das kürzlich veröffentlichte Traefik 1.7 verfügt jedoch über die Option "sharedService" publishedService,
der das status
in Ingress aktualisiert werden kann, das in früheren Versionen nicht vorhanden war. Das Folgende ist eine Liste der Komponenten, die für den Betrieb erforderlich sind.
Erstellen:
- Namespace
- Dienstkonto
- TLS-Geheimnis
- Clusterrolle
- Cluster-Rollenbindung
- configmap
- Bereitstellung
- Service für http und https
- Service für Traefik Dashboard
- Ingress
Namespace
Erstellen Sie einen Namespace:
kubectl create namespace traefik
TLS-Geheimnis
(ca. per. - im folgenden Beispiel dupliziert der Autor aus irgendeinem Grund dieselbe Konfiguration, siehe die aktuelle Konfiguration in der README-Datei, die über den folgenden Link bereitgestellt wird)
Erstellen Sie zuerst ein Zertifikat:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com"
Erstellen Sie ein TLS-Zertifikat:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com"
Geheimnis schaffen:
kubectl create secret tls traefik-ui-tls-cert --key ./tls.key --cert ./tls.crt
Der Einfachheit halber habe ich mit diesen Befehlen eine README-Datei erstellt und auf meinen GitHub hochgeladen.
ConfigMap
--- apiVersion: v1 kind: ConfigMap metadata: name: traefik-configmap namespace: traefik data: traefik.toml: | defaultEntryPoints = ["http","https"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] CertFile = "/ssl/tls.crt" KeyFile = "/ssl/tls.key" [entryPoints.traefik] address = ":8080" [entryPoints.traefik.auth.basic] users = ["admin:$apr1$zjjGWKW4$W2JIcu4m26WzOzzESDF0W/"] [kubernetes] [kubernetes.ingressEndpoint] publishedService = "traefik/traefik" [ping] entryPoint = "http" [api] entryPoint = "traefik"
Standardmäßig sind EntryPoints die Ports 80
und 443
.
EntryPoint http
hört zu :80
und hat keine zusätzlichen Regeln
EntryPoint https
hört zu :443
und enthält eine Regel zum Verbinden von TLS-Zertifikaten.
EntryPoint traefik
hört zu :8080
und verwendet die Basisauthentifizierung. Benutzername ist admin
, Passwort ist admin
.
Die Definition des entsprechenden Endpunkts Ingress in Kubernetes erfolgt durch Angabe von publishService
und sollte aus dem namespace
Wert und dem service
Namen für Traefik bestehen. In diesem Fall ist es traefik / traefik
.
ping
oder Health Check verwenden entryPoint http
.
api
oder Dashboard / UI verwenden entryPoint traefik
.
Beachten Sie, dass Sie zusätzliche Einstiegspunkte mit einem Port definieren können. Dieser Port kann Datenverkehr an einen beliebigen Port NodePort
, anstatt an dynamische Ports und NodePort
.
Clusterrolle
Das Dienstkonto für Traefik muss über die Berechtigung zum Aktualisieren des Felds "Eingangsstatus" verfügen. Dies ist ein wichtiger Parameter, der in der offiziellen Traefik-Dokumentation noch nicht aufgeführt ist :
--- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller rules: - apiGroups: - "" resources: - services - endpoints - secrets verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses/status verbs: - update
Die letzten 6 Zeilen sind sehr wichtig für den korrekten Betrieb.
Bereitstellung
Die Bereitstellung ist ziemlich einfach. Lassen Sie uns kurz die Hauptblöcke durchgehen:
volumes: - name: traefik-ui-tls-cert secret: secretName: traefik-ui-tls-cert - name: traefik-configmap configMap: name: traefik-configmap
Definieren Sie volumes
für ConfigMap und Secret, die dann in volumeMounts
verwendet werden volumeMounts
.
volumeMounts: - mountPath: "/ssl" name: "traefik-ui-tls-cert" - mountPath: "/config" name: "traefik-configmap"
Integritätsprüfungen werden an Port 80 durchgeführt, wie in ConfigMap definiert.
Öffnen Sie die Ports für alle in der Konfigurationsdatei angegebenen Einstiegspunkte:
ports: - name: http containerPort: 80 - name: https containerPort: 443 - name: dashboard containerPort: 8080
Ich erinnere Sie daran, dass einige Beispiele und Dokumentationen im Internet veraltet sind. Verpassen Sie also nicht den Abschnitt mit den Argumenten, der für die Arbeit von Traefik erforderlich ist:
args: - --logLevel=INFO - --configfile=/config/traefik.toml
Übergeben Sie keine zusätzlichen Flags und Argumente wie -api, -ping oder -kubernetes, da dies die in der Konfigurationsdatei angegebenen Einstellungen überschreibt.
Service
Der erste der Dienste definiert einen Loadbalancer für entryPoints http
und https
. Wenn Sie sich die Sicherheitsgruppe (Ingress) für den LoadBalancer ansehen, werden dort die Ports 80 und 443 geöffnet. K8s erstellt einen LoadBalancer und verbindet ihn mit den Knoten, auf denen Traefik ausgeführt wird. Wenn Sie wie ich eine interne ELB erstellen möchten, müssen Sie Anmerkungen definieren:
--- kind: Service apiVersion: v1 metadata: name: traefik namespace: traefik annotations: # service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0 spec: selector: k8s-app: traefik-ingress ports: - protocol: TCP port: 80 name: http - protocol: TCP port: 443 name: https type: LoadBalancer
Service (für Dashboard)
Nun der lustige Teil! Da Dashboard die Basisauthentifizierung verwendet, benötigte ich https
. Um SSL zu verwenden, müssen wir den Datenverkehr an Port :8080
umleiten, auf dem Dashboard funktioniert. Wie Sie sehen können, ist es sehr einfach. Alle Magie geschieht in Ingress.
--- kind: Service apiVersion: v1 metadata: name: traefik-dashboard namespace: traefik spec: selector: k8s-app: traefik-ingress ports: - port: 8080 name: dashboard
Ingress (für Dashboard)
Die Magie ist, dass das Proxying von sicherem Datenverkehr zum Dashboard über Traefik selbst erfolgt. Das Verwalten von Traefik in Ingress erfolgt mithilfe von Traefik-Anmerkungen :
--- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-dashboard-ingress namespace: traefik annotations: kubernetes.io/ingress.class: traefik traefik.ingress.kubernetes.io/frontend-entry-points: http,https traefik.ingress.kubernetes.io/redirect-entry-point: https traefik.ingress.kubernetes.io/redirect-permanent: "true" spec: rules: - host: traefik-ui.example.com http: paths: - path: / backend: serviceName: traefik-dashboard servicePort: 8080
Es dauerte nur 4 einfache und klare Anmerkungen.
Um die volle Funktionalität sicherzustellen, müssen Sie natürlich einen DNS- traefik-ui.example.com
, der auf Ihre ELB traefik-ui.example.com
.
Wäre es schön, wenn dies automatisch erfolgen würde? Kein Problem, ich werde im nächsten Artikel über die automatische Erstellung von DNS-Einträgen schreiben.
Referenzen
Die fertige Datei deploy.yaml kann von meinem Github-Repository heruntergeladen werden. Wenn Sie während des Einrichtungsprozesses Schwierigkeiten haben, wenden Sie sich bitte an uns.
Abschiedswörter vom Übersetzer
Lesen Sie weitere Artikel in unserem Blog:
Stateful Backups in Kubernetes
Sichern einer großen Anzahl heterogener Webprojekte
Telegrammbot für Redmine. Wie Sie das Leben für sich und die Menschen vereinfachen können