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 Archlinux sudo pacman -S helm)
  • oder eine der Ansible Helm-Rollen verwenden (z. B. helm - die auch installiert wird, wenn Sie ansible-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

http://www.tauceti.blog

Über das Projekt

Ansible role to install Traefik ingress controller in a Kubernetes cluster

Installieren
ansible-galaxy install githubixx.traefik_kubernetes
Lizenz
gpl-3.0
Downloads
1.5k
Besitzer
Senior System Engineer - Python, Go, Cloud, Kubernetes, Commodore, Retro, 80's ;-)