githubixx.traefik_kubernetes
traefik-kubernetes
Diese Ansible-Rolle installiert den Traefik Edge-Router für Kubernetes als Ingress-Controller. Hinter den Kulissen wird das offizielle Helm-Chart verwendet. Derzeit werden Verfahren wie Installation, Aktualisierung/Upgrade und Löschen des Traefik-Deployments unterstützt.
Die bereitgestellten Standardeinstellungen sind optimiert für einen Bare-Metal/on-Premise Kubernetes-Cluster, in dem Traefik der öffentliche Einstiegspunkt für die Kubernetes-Dienste ist. Obwohl die Konfiguration selbstverständlich anpassbar ist, wie man es mit jedem Helm-Chart tun kann, richten die Standardeinstellungen Traefik mit folgender Konfiguration ein:
- Traefik-Instanzen werden als
DaemonSet
bereitgestellt - Traefik-Pods verwenden
hostPort
- Traefik hört auf Port
80
an allen Schnittstellen des Hosts für eingehende HTTP-Anfragen - Traefik hört auf Port
443
an allen Schnittstellen des Hosts für eingehende HTTPS-Anfragen - Das Traefik-Dashboard ist aktiviert und nicht öffentlich zugänglich
- TLS-Zertifikate werden von cert-manager bereitgestellt (Meine Ansible-Rolle cert-manager-kubernetes kann verwendet werden, um den cert-manager zu installieren)
Weitere Informationen zu den Einstellungen des Helm-Charts finden Sie unten.
Versionen
Ich markiere jede Veröffentlichung und versuche, mit semantischer Versionierung Schritt zu halten. Wenn Sie die Rolle verwenden möchten, empfehle ich, die neueste Version zu überprüfen. Der Master-Branch ist grundsätzlich die Entwicklungsumgebung, während die Tags stabile Versionen kennzeichnen. Ein Tag 5.0.0+23.0.1
bedeutet, dass dies die Veröffentlichung 5.0.0
dieser Rolle ist und die Helm-Chart-Version 23.0.1
verwendet (die verwendete Traefik
-Version ist in der Werte-Datei [siehe unten] angegeben). Wenn sich die Rolle selbst ändert, erhöht sich X.Y.Z
vor dem +
. Wenn sich die Traefik-Chart-Version ändert, erhöht sich X.Y.Z
nach dem +
auch. Dies ermöglicht es, Bugfixes und neue Hauptversionen der Rolle zu kennzeichnen, während sie noch für eine bestimmte Traefik-Version entwickelt wird.
Voraussetzungen
Sie müssen das Helm 3 Binary auf dem Host installiert haben, auf dem ansible-playbook
ausgeführt wird, oder auf dem Host, auf dem Sie die Playbooks delegiert haben (z. B. durch Verwendung der traefik_delegate_to
-Variable). Sie können entweder
- Ihren Lieblings-Paketmanager verwenden, wenn Ihre Distribution
helm
in ihrem Repository enthält (zum Beispiel verwenden Sie für Archlinuxsudo pacman -S helm
) - oder eine der Ansible
Helm
-Rollen verwenden (z. B. helm - die auch installiert wird, wenn Sieansible-galaxy role install -vr requirements.yml
verwenden) - oder das Binary direkt von den Helm-Releases herunterladen und in das Verzeichnis
/usr/local/bin/
speichern.
Ein richtig konfiguriertes KUBECONFIG
ist ebenfalls erforderlich (standardmäßig befindet es sich unter ${HOME}/.kube/config
). Normalerweise, wenn kubectl
mit Ihrem Cluster funktioniert, sollte alles in dieser Hinsicht bereits in Ordnung sein.
Zusätzlich muss die Ansible- Sammlung kubernetes.core
installiert werden. Dies kann durch Verwendung der Datei collections.yml
, die in dieser Rolle enthalten ist, erfolgen: ansible-galaxy install -r collections.yml
.
Und natürlich benötigen Sie einen Kubernetes-Cluster ;-)
Änderungsprotokoll
siehe CHANGELOG.md
Rollenvariablen
# Helm-Chart-Version
traefik_chart_version: "23.2.0"
# Helm-Release-Name
traefik_release_name: "traefik"
# Helm-Repository-Name
traefik_repo_name: "traefik"
# Helm-Chart-Name
traefik_chart_name: "{{ traefik_repo_name }}/{{ traefik_release_name }}"
# Helm-Chart-URL
traefik_chart_url: "https://helm.traefik.io/traefik"
# Kubernetes-Namespace, in dem die Traefik-Ressourcen installiert werden sollen
traefik_namespace: "traefik"
# Verzeichnis, das die Helm-Chart-Werte-Datei enthält. Wenn Sie diese Variable angeben,
# versucht Ansible, eine Datei namens "values.yml.j2" oder
# "values.yaml.j2" im angegebenen Verzeichnis zu finden (".j2", weil Sie
# dort die üblichen Jinja2-Vorlagensachen verwenden können). Der Inhalt dieser Datei
# wird als Werte-Datei an den Befehl "helm install/template" übergeben.
# Standardmäßig ist das Verzeichnis das Benutzerverzeichnis "$HOME" plus
# "/traefik/helm". Wenn die Aufgabe eine solche Datei nicht findet,
# werden standardmäßig die Werte in "templates/traefik_values_default.yml.j2" verwendet.
traefik_chart_values_directory: "{{ '~/traefik/helm' | expanduser }}"
# Standardmäßig werden CRDs (CustomResourceDefinitions) nicht installiert. Setzen Sie dies
# auf "true", wenn CRDs installiert werden sollen. Siehe auch:
# https://github.com/traefik/traefik-helm-chart/tree/master/traefik/crds
# Die folgenden CRDs werden installiert:
# - ingressroutes.traefik.containo.us
# - ingressroutes.traefik.io
# - ingressroutetcps.traefik.containo.us
# - ingressroutetcps.traefik.io
# - ingressrouteudps.traefik.containo.us
# - ingressrouteudps.traefik.io
# - middlewares.traefik.containo.us
# - middlewares.traefik.io
# - middlewaretcps.traefik.containo.us
# - middlewaretcps.traefik.io
# - serverstransports.traefik.containo.us
# - serverstransports.traefik.io
# - tlsoptions.traefik.containo.us
# - tlsoptions.traefik.io
# - tlsstores.traefik.containo.us
# - tlsstores.traefik.io
# - traefikservices.traefik.containo.us
# - traefikservices.traefik.io
traefik_install_crds: false
# Standardmäßig werden alle Aufgaben, die mit dem Kubernetes-Cluster kommunizieren müssen,
# auf Ihrem lokalen Host (127.0.0.1) ausgeführt. Wenn dieser keine direkte Verbindung
# zu diesem Cluster hat oder andernorts ausgeführt werden soll, kann diese Variable entsprechend
# geändert werden.
traefik_delegate_to: 127.0.0.1
# Zeigt den "helm"-Befehl an, der ausgeführt wurde, wenn eine Aufgabe Helm verwendet,
# um eine Ressource zu installieren, zu aktualisieren/hochzurüsten oder zu löschen.
traefik_helm_show_commands: false
# Ohne definierte "action"-Variable rendert diese Rolle nur eine Datei
# mit allen Ressourcen, die installiert oder aktualisiert werden.
# Die gerenderte Datei mit den Ressourcen wird "template.yml" genannt
# und im unten angegebenen Verzeichnis platziert.
traefik_template_output_directory: "{{ '~/traefik/template' | expanduser }}"
Verwendung
Das erste, was zu tun ist, ist die Überprüfung von templates/traefik_values_default.yml.j2
. Diese Datei enthält die Werte/Einstellungen für das Traefik Helm-Chart, die von den Standardwerten abweichen, die hier zu finden sind. Diese sind die Standardwerte, die verwendet werden:
# Alle möglichen Helm-Chart-Werte hier können gefunden werden unter:
# https://github.com/traefik/traefik-helm-chart/blob/master/traefik/values.yaml
image:
repository: traefik
tag: "2.11.2"
pullPolicy: IfNotPresent
# Diese Argumente werden an das Traefik-Binary übergeben. Für alle Optionen siehe:
# https://doc.traefik.io/traefik/reference/static-configuration/cli/
#
# Das erste setzt das Protokollniveau entsprechend.
#
# Das zweite setzt den Wert der Annotation "kubernetes.io/ingress.class"
# fest, nach der gesucht wird. Wenn ein "standard" Kubernetes "Ingress"-
# Objekt an den Kubernetes-API-Server übergeben wird (anstatt von Traefiks eigener
# Ingress-Implementierung namens "IngressRoute"), behandelt Traefik diese Anfragen
# und leitet sie entsprechend weiter.
additionalArguments:
- "--log.level=INFO"
- "--providers.kubernetesingress.ingressclass=traefik"
# Globale Argumente, die an Traefiks Binary übergeben werden.
# https://doc.traefik.io/traefik/reference/static-configuration/cli/
#
# Das erste deaktiviert die regelmäßige Überprüfung, ob eine neue Version veröffentlicht wurde.
#
# Das zweite deaktiviert anonyme Nutzungsstatistiken.
globalArguments:
- "--global.checknewversion=false"
- "--global.sendanonymoususage=false"
# Dies erstellt das Traefik-Deployment. Da hier "DaemonSet" angegeben ist,
# wird auf allen Kubernetes-Worker-Knoten eine Traefik-Instanz erstellt. Wenn
# nur eine Teilmenge von Knoten verwendet werden soll, legen Sie "affinity", "nodeSelector"
# oder "toleration's" entsprechend fest. Siehe Link zu den Helm-Chart-Werten oben.
deployment:
enabled: true
kind: DaemonSet
dnsPolicy: ClusterFirstWithHostNet
# Weist Traefik an, auf verschiedenen Ports zu lauschen.
ports:
# Der Name davon kann nicht geändert werden, da er für die Readiness-
# und Liveness-Probe verwendet wird, aber Sie können die Konfiguration nach
# Ihren Wünschen anpassen. Um auf das Dashboard zuzugreifen, können Sie
# zum Beispiel "kubectl port-forward" verwenden:
# kubectl -n traefik port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name -A | head -1) 9000:9000
# Das Öffnen von http://localhost:9000/dashboard/ sollte das Dashboard anzeigen.
traefik:
port: 9000
expose: false
protocol: TCP
# Unsichere eingehende HTTP-Verkehr. Wenn Sie "redirectTo: websecure"
# auskommentieren, wird der gesamte Verkehr, der an diesem Port ankommt,
# auf den Eintrittspunkt "websecure" umgeleitet, was bedeutet, dass er
# den eingehenden sicherem HTTPS-Verkehr behandelt.
# Aber seien Sie vorsichtig, das könnte problematisch für cert-manager sein.
# Auch "hostPort" wird verwendet. Da das "DaemonSet" oben angegeben wurde,
# bedeutet das, dass die Traefik-Pods Anfragen auf Port 80 und 443
# an allen Kubernetes-Worker-Knoten beantworten. Wenn die Hosts eine öffentliche IP haben
# und Port 80/443 nicht durch eine Firewall geschützt ist, ist Traefik für Anfragen aus dem
# Internet verfügbar (was Sie in der Regel im Fall von Traefik wollen ;-))
# Für andere Optionen siehe den Link oben. Diese Einstellungen sind nützlich für Baremetal oder
# On-Premise-Lösungen ohne weiteren Loadbalancer.
web:
port: 30080
hostPort: 80
expose: true
protocol: TCP
# redirectTo: websecure
# Eingangspunkt für HTTPS-Verkehr.
websecure:
port: 30443
hostPort: 443
expose: true
protocol: TCP
# Diese Sicherheits Einstellungen sind im Grunde am besten geeignet, um die Angriffsfläche
# so gut wie möglich zu minimieren.
# Die Angriffsfläche kann weiter mit "seccomp" eingeschränkt werden, das seit
# Kubernetes v1.19 stabil ist und es ermöglicht, Systemaufrufe auf ein Minimum zu
# beschränken. Siehe:
# https://kubernetes.io/docs/tutorials/clusters/seccomp/
securityContext:
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsGroup: 65532
runAsNonRoot: true
runAsUser: 65532
# Alle Prozesse des Containers sind auch Teil dieser zusätzlichen Gruppen-ID.
podSecurityContext:
fsGroup: 65532
# Setzt das Protokollniveau des allgemeinen Protokolls und aktiviert das Zugriffsprotokoll.
logs:
general:
level: INFO
access:
enabled: true
# Da die Traefik-web/websecure-Ports durch "hostPort" exponiert werden, ist kein Service
# erforderlich.
service:
enabled: false
# CPU- und RAM-Ressourcenlimits. Diese Einstellungen sollten auch in
# angemessenen Werten festgelegt werden, z. B. im Falle eines Speicherlecks.
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "300m"
memory: "150Mi"
# Aktualisiert die Pods im DaemonSet nacheinander, wenn das DaemonSet aktualisiert wurde.
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
Aber nichts ist in Stein gemeißelt ;-) Um Ihre eigenen Werte zu verwenden, erstellen Sie eine Datei namens values.yml.j2
oder values.yaml.j2
und legen Sie sie in das Verzeichnis, das in traefik_chart_values_directory
angegeben ist (standardmäßig $HOME/traefik/helm
). Dann wird diese Rolle diese Datei verwenden, um die Helm-Werte zu rendern. Sie können templates/traefik_values_default.yml.j2
als Vorlage verwenden oder einfach von Grund auf neu beginnen. Wie oben erwähnt, können Sie alle Einstellungen für das Helm-Chart, die von den Standardwerten abweichen, die hier zu finden sind, anpassen.
Nachdem die Werte-Datei vorhanden ist und die Werte in defaults/main.yml
überprüft wurden, kann die Rolle installiert werden. Die meisten Aufgaben der Rolle werden lokal ausgeführt, da viele Aufgaben mit dem Kubernetes-API-Server kommunizieren oder Helm Befehle ausführen müssen.
Die Standardaktion besteht darin, einfach die YAML-Datei für die Kubernetes-Ressourcen zu rendern, nachdem alle Jinja2-Variablen und dergleichen ersetzt wurden. Im Abschnitt Beispiel-Playbook
unten gibt es ein Beispiel 2 (Tag zur Rolle zuweisen)
. Der Rolle githubixx.traefik-kubernetes
wurde ein Tag role-traefik-kubernetes
zugewiesen. Wenn angenommen wird, dass die Werte für das Helm-Chart gerendert werden sollen (nichts wird in diesem Fall installiert) und das Playbook k8s.yml
genannt wird, führen Sie den folgenden Befehl aus:
ansible-playbook --tags=role-traefik-kubernetes k8s.yml
Um die Vorlage in ein anderes Verzeichnis zu rendern, verwenden Sie die Variable traefik_template_output_directory
, z. B.:
ansible-playbook --tags=role-traefik-kubernetes --extra-vars traefik_template_output_directory="/tmp/traefik" k8s.yml
Wenn Sie die helm
-Befehle und die Parameter, die in den Protokollen ausgeführt wurden, sehen möchten, können Sie auch --extra-vars traefik_helm_show_commands=true
angeben.
Eine der letzten Aufgaben heißt TASK [githubixx.traefik_kubernetes : Schreibe Vorlagen in Datei]
. Dies rendert die Vorlage mit den Ressourcen, die erstellt werden, in das Verzeichnis, das in traefik_template_output_directory
angegeben ist. Die Datei wird template.yml
genannt. Das Verzeichnis/die Datei wird auf Ihrem lokalen Computer platziert, um sie zu überprüfen.
Wenn die gerenderte Vorlage alles enthält, was Sie benötigen, kann die Rolle installiert werden, um schließlich Traefik bereitzustellen:
ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=install k8s.yml
Um zu überprüfen, ob alles bereitgestellt wurde, verwenden Sie die üblichen kubectl
-Befehle wie kubectl -n <traefik_namespace> get pods -o wide
.
Da Traefik alle paar Wochen/Monate Updates/Upgrades herausgibt, kann die Rolle auch Updates/Upgrades durchführen. Diese Methode kann auch verwendet werden, um vorhandene Werte zu ändern, ohne die Traefik-Version zu aktualisieren. Siehe auch Traefik-Releases, bevor Sie Traefik aktualisieren. Änderungen am Helm-Chart finden Sie in der Commit-Historie.
Wenn Sie Traefik/das Helm-Chart aktualisieren möchten, müssen Sie im Grunde nur die Variable traefik_chart_version
ändern, z. B. von 10.21.1
auf 10.24.2
. Möglicherweise müssen Sie auch den image.tag
-Wert in templates/traefik_values_default.yml.j2
ändern. Wenn nur Parameter geändert werden sollen, aktualisieren Sie die Werte entsprechend.
Um das Traefik-Update oder die Bereitstellung der neuen Werte durchzuführen, führen Sie aus:
ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=upgrade k8s.yml
Und schließlich, wenn Sie Traefik loswerden möchten, können Sie alle Ressourcen wieder löschen:
ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=delete k8s.yml
Beispiel-Playbook
Beispiel 1 (ohne Rollentag):
- hosts: traefik
roles:
- githubixx.traefik_kubernetes
Beispiel 2 (Tag zur Rolle zuweisen):
-
hosts: traefik
roles:
-
role: githubixx.traefik-kubernetes
tags: role-traefik-kubernetes
Der Host traefik
im Beispiel-Playbook ist höchstwahrscheinlich einfach localhost
, der in der Ansible hosts
-Datei oder auf einem anderen Host angegeben ist, den Sie als "Ausführender" verwenden möchten. Stellen Sie nur sicher, dass dieser Host helm
installiert hat und eine gültige kubeconfig
besitzt (was normalerweise der Fall ist, wenn der kubectl
-Befehl mit dem Kubernetes-Cluster funktioniert).
Testen
Diese Rolle hat ein kleines Testsetup, das mit Molecule, libvirt (vagrant-libvirt) und QEMU/KVM erstellt wurde. Bitte sehen Sie meinen Blog-Beitrag Testing Ansible roles with Molecule, libvirt (vagrant-libvirt) and QEMU/KVM, um herauszufinden, wie Sie es einrichten. Die Testkonfiguration befindet sich hier.
Anschließend kann Molecule ausgeführt werden. Molecule wird einige VMs mit einem vollständigen Kubernetes-Cluster einrichten, was es ermöglicht, die gesamte Traefik-Funktionalität zu testen.
Der folgende Befehl führt ein grundlegendes Setup durch und erstellt eine Vorlage der Ressourcen (standardmäßige Aktion siehe oben), die erstellt werden:
molecule converge
Installation von Traefik
und den erforderlichen Ressourcen:
molecule converge -- --extra-vars action=install
Aktualisierung von Traefik
oder Ändern von Parametern:
molecule converge -- --extra-vars action=upgrade
Löschen von Traefik
und seinen Ressourcen:
molecule converge -- --extra-vars action=delete
Um einige Tests durchzuführen, verwenden Sie:
molecule verify
Um aufzuräumen, führen Sie aus:
molecule destroy
Lizenz
GNU GENERAL PUBLIC LICENSE Version 3
Autoreninformation
Ansible role to install Traefik ingress controller in a Kubernetes cluster
ansible-galaxy install githubixx.traefik_kubernetes