githubixx.traefik_kubernetes

traefik-kubernetes

Ce rôle Ansible installe le routeur de edge Traefik pour Kubernetes en tant que contrôleur d'entrée. En coulisses, il utilise le Helm chart officiel. Actuellement, des procédures comme l'installation, la mise à jour / l'upgrade et la suppression du déploiement Traefik sont supportées.

Les paramètres par défaut fournis sont optimisés pour un cluster Kubernetes bare-metal / sur site où Traefik est le point d'entrée public pour les services Kubernetes. Bien sûr, la configuration peut être personnalisée comme pour n'importe quel Helm chart, mais les paramètres par défaut configureront Traefik avec la configuration suivante :

  • Les instances de Traefik seront déployées comme DaemonSet.
  • Les pods Traefik utilisent hostPort.
  • Traefik écoute sur le port 80 sur toutes les interfaces de l'hôte pour les requêtes HTTP entrantes.
  • Traefik écoute sur le port 443 sur toutes les interfaces de l'hôte pour les requêtes HTTPS entrantes.
  • Le tableau de bord de Traefik est activé et n'est pas exposé à Internet.
  • Les certificats TLS sont fournis par cert-manager (Mon rôle Ansible cert-manager-kubernetes peut être utilisé pour installer cert-manager).

Pour plus d'informations sur les paramètres du Helm chart, voir ci-dessous.

Versions

Je tague chaque version et essaie de rester avec semantic versioning. Si vous souhaitez utiliser le rôle, je recommande de vérifier le dernier tag. La branche master est essentiellement en développement tandis que les tags marquent des versions stables. Mais en général, j'essaie aussi de garder master en bon état. Un tag 5.0.0+23.0.1 signifie que c'est la version 5.0.0 de ce rôle et qu'il utilise la version du Helm chart 23.0.1 (la version de Traefik utilisée est spécifiée dans le fichier de valeurs [voir ci-dessous]). Si le rôle lui-même change, X.Y.Z avant le + augmentera. Si la version du chart Traefik change, X.Y.Z après le + augmentera également. Cela permet de taguer les corrections de bugs et les nouvelles versions majeures du rôle tout en continuant le développement pour une version spécifique de Traefik.

Conditions requises

Vous devez avoir le binaire Helm 3 installé sur l'hôte où ansible-playbook est exécuté ou sur l'hôte où vous avez délégué les playbooks (par exemple en utilisant la variable traefik_delegate_to). Vous pouvez soit

  • utiliser votre gestionnaire de paquets préféré si votre distribution inclut helm dans son dépôt (par exemple, pour Archlinux utilisez sudo pacman -S helm).
  • ou utiliser l'un des rôles Ansible Helm (par exemple, helm - qui sera également installé si vous utilisez ansible-galaxy role install -vr requirements.yml).
  • ou télécharger directement le binaire depuis Helm releases et le placer dans le répertoire /usr/local/bin/.

Un KUBECONFIG correctement configuré est également nécessaire (qui se trouve par défaut à ${HOME}/.kube/config). Normalement, si kubectl fonctionne avec votre cluster, tout devrait déjà être bon à ce niveau.

De plus, la collection kubernetes.core d'Ansible doit être installée. Cela peut être fait en utilisant le fichier collections.yml inclus dans ce rôle : ansible-galaxy install -r collections.yml.

Et bien sûr, vous avez besoin d'un cluster Kubernetes ;-)

Changelog

voir CHANGELOG.md

Variables du rôle

# Version du Helm chart
traefik_chart_version: "23.2.0"

# Nom de la release Helm
traefik_release_name: "traefik"

# Nom du dépôt Helm
traefik_repo_name: "traefik"

# Nom du chart Helm
traefik_chart_name: "{{ traefik_repo_name }}/{{ traefik_release_name }}"

# URL du chart Helm
traefik_chart_url: "https://helm.traefik.io/traefik"

# Espace de noms Kubernetes où les ressources Traefik doivent être installées
traefik_namespace: "traefik"

# Répertoire qui contient le fichier de valeurs du chart Helm. Si vous spécifiez cette
# variable, Ansible essaiera de localiser un fichier appelé "values.yml.j2" ou
# "values.yaml.j2" dans le répertoire spécifié (".j2" parce que vous pouvez
# utiliser les éléments habituels de modèle Jinja2 là-dedans). Le contenu de ce fichier
# sera fourni à la commande "helm install/template" en tant que fichier de valeurs.
# Par défaut, le répertoire est le répertoire "$HOME" de l'utilisateur plus
# "/traefik/helm". Si la tâche ne trouve pas un tel fichier, elle utilise
# les valeurs dans "templates/traefik_values_default.yml.j2" par défaut.
traefik_chart_values_directory: "{{ '~/traefik/helm' | expanduser }}"

# Par défaut, les CRDs (CustomResourceDefinitions) ne sont pas installés. Définissez sur
# "true" si les CRDs doivent être installés. Voir aussi :
# https://github.com/traefik/traefik-helm-chart/tree/master/traefik/crds
# Les CRDs suivants seront installés :
#   - 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

# Par défaut, toutes les tâches qui nécessitent de communiquer avec le cluster Kubernetes
# sont exécutées sur votre hôte local (127.0.0.1). Mais si celui-ci
# n'a pas de connexion directe à ce cluster ou doit être exécuté
# ailleurs, cette variable peut être changée en conséquence.
traefik_delegate_to: 127.0.0.1

# Affiche la commande "helm" qui a été exécutée si une tâche utilise Helm pour
# installer, mettre à jour/upgrade ou supprimer une telle ressource.
traefik_helm_show_commands: false

# Sans la variable "action" définie, ce rôle ne fera que rendre un fichier
# avec toutes les ressources qui seront installées ou mises à jour. Le fichier rendu
# avec les ressources sera appelé "template.yml" et sera
# placé dans le répertoire spécifié ci-dessous.
traefik_template_output_directory: "{{ '~/traefik/template' | expanduser }}"

Utilisation

La première chose à faire est de vérifier templates/traefik_values_default.yml.j2. Ce fichier contient les valeurs/settings pour le Helm chart Traefik qui sont différents des paramètres par défaut qui se trouvent ici. Voici les paramètres par défaut utilisés :

# Toutes les valeurs possibles du Helm chart ici peuvent être trouvées à :
# https://github.com/traefik/traefik-helm-chart/blob/master/traefik/values.yaml

image:
  repository: traefik
  tag: "2.11.2"
  pullPolicy: IfNotPresent

# Ces arguments sont passés au binaire de Traefik. Pour toutes les options, voir :
# https://doc.traefik.io/traefik/reference/static-configuration/cli/
#
# Le premier définit le niveau de log en conséquence.
#
# Le second définit la valeur de l'annotation "kubernetes.io/ingress.class"
# à surveiller. Si un objet "Ingress" Kubernetes "standard" est soumis au serveur API
# de Kubernetes (au lieu de l'implémentation d'entrée propre de Traefik appelée "IngressRoute"),
# Traefik gérera ces demandes et les routage en conséquence.
additionalArguments:
  - "--log.level=INFO"
  - "--providers.kubernetesingress.ingressclass=traefik"

# Arguments globaux passés au binaire de Traefik.
# https://doc.traefik.io/traefik/reference/static-configuration/cli/
#
# Le premier désactive la vérification périodique si une nouvelle version a été publiée.
#
# Le second désactive les statistiques d'utilisation anonymes. 
globalArguments:
  - "--global.checknewversion=false"
  - "--global.sendanonymoususage=false"

# Cela crée le déploiement de Traefik. Comme "DaemonSet" est spécifié ici,
# cela créera une instance de Traefik sur tous les nœuds workers Kubernetes. Si
# seuls un sous-ensemble de nœuds doit être utilisé, spécifiez "affinity", "nodeSelector"
# ou "toleration's" en conséquence. Voir le lien vers les valeurs du Helm chart ci-dessus.
deployment:
  enabled: true
  kind: DaemonSet
  dnsPolicy: ClusterFirstWithHostNet

# Indique à Traefik d'écouter sur divers ports.
ports:
  # Le nom de celui-ci ne peut pas être changé car il est utilisé pour les probes de readiness
  # et de liveness, mais vous pouvez ajuster sa configuration à votre goût.
  # Pour accéder au tableau de bord, vous pouvez utiliser "kubectl port-forward" par exemple :
  # kubectl -n traefik port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name -A | head -1) 9000:9000
  # Ouvrir http://localhost:9000/dashboard/ devrait afficher le tableau de bord.
  traefik:
    port: 9000
    expose: false
    protocol: TCP
  # Le trafic HTTP non sécurisé entrant. Si vous décommentez "redirectTo: websecure",
  # tout le trafic qui arrive sur ce port sera redirigé vers le point d'entrée "websecure"
  # ce qui signifie vers le point d'entrée qui gère le trafic HTTPS sécurisé.
  # Mais attention, cela pourrait poser problème pour cert-manager.
  # De plus, "hostPort" est utilisé. Comme "DaemonSet" était spécifié ci-dessus, cela signifie que
  # les pods Traefik répondront aux requêtes sur le port 80 et 443 sur tous
  # les nœuds workers Kubernetes. Donc, si les hôtes ont une IP publique et que les ports 80/443
  # ne sont pas protégés par un pare-feu, Traefik est disponible pour des requêtes depuis l'
  # Internet (ce que vous souhaitez normalement dans le cas de Traefik ;-) ) Pour d'autres
  # options, voir le lien ci-dessus. Ces paramètres sont utiles pour des solutions baremetal ou
  # sur site sans autre loadbalancer.
  web:
    port: 30080
    hostPort: 80
    expose: true
    protocol: TCP
    # redirectTo: websecure
  # Point d'entrée pour le trafic HTTPS.
  websecure:
    port: 30443
    hostPort: 443
    expose: true
    protocol: TCP

# Ces paramètres de sécurité sont essentiellement des meilleures pratiques pour limiter la surface d'attaque
# autant que possible.
# La surface d'attaque peut être encore limitée avec "seccomp" qui est stable depuis
# Kubernetes v1.19 et permet de limiter les appels système au minimum. Voir :
# https://kubernetes.io/docs/tutorials/clusters/seccomp/"
securityContext:
  capabilities:
    drop:
      - ALL
  readOnlyRootFilesystem: true
  runAsGroup: 65532
  runAsNonRoot: true
  runAsUser: 65532

# Tous les processus du conteneur font également partie de cet ID de groupe supplémentaire.
podSecurityContext:
  fsGroup: 65532

# Définit le niveau de log du log général et active le log d'accès.
logs:
  general:
    level: INFO
  access:
    enabled: true

# Étant donné que les ports web/websecure de Traefik sont exposés par "hostPort", un service n'est
# pas nécessaire.
service:
  enabled: false

# Limites de ressources CPU et RAM. Ces paramètres doivent également être définis sur
# des valeurs raisonnables en cas de fuite de mémoire par exemple.
resources:
  requests:
    cpu: "100m"
    memory: "50Mi"
  limits:
    cpu: "300m"
    memory: "150Mi"

# Met à jour les Pods dans le DaemonSet un par un lorsque le DaemonSet a été mis à jour.
updateStrategy:
  type: RollingUpdate
  rollingUpdate:
    maxUnavailable: 1

Mais rien n'est gravé dans la pierre ;-) Pour utiliser vos propres valeurs, créez simplement un fichier appelé values.yml.j2 ou values.yaml.j2 et placez-le dans le répertoire spécifié dans traefik_chart_values_directory (qui est par défaut $HOME/traefik/helm). Ensuite, ce rôle utilisera ce fichier pour rendre les valeurs Helm. Vous pouvez utiliser templates/traefik_values_default.yml.j2 comme modèle ou simplement commencer de zéro. Comme mentionné ci-dessus, vous pouvez modifier tous les paramètres pour le Helm chart qui sont différents des paramètres par défaut qui se trouvent ici.

Après que le fichier de valeurs soit en place et les valeurs de defaults/main.yml vérifiées, le rôle peut être installé. La plupart des tâches de ce rôle sont exécutées localement afin de dire que pas mal de tâches doivent communiquer avec le serveur API Kubernetes ou exécuter des commandes Helm.

L'action par défaut est de simplement rendre le fichier YAML des ressources Kubernetes après avoir remplacé toutes les variables et éléments Jinja2. Dans la section Exemple de Playbook ci-dessous, il y a un Exemple 2 (attribuer un tag au rôle). Le rôle githubixx.traefik-kubernetes a un tag role-traefik-kubernetes attribué. En supposant que les valeurs pour le Helm chart doivent être rendues (rien ne sera installé dans ce cas) et que le playbook s'appelle k8s.yml, exécutez la commande suivante :

ansible-playbook --tags=role-traefik-kubernetes k8s.yml

Pour rendre le modèle dans un répertoire différent, utilisez la variable traefik_template_output_directory par exemple :

ansible-playbook --tags=role-traefik-kubernetes --extra-vars traefik_template_output_directory="/tmp/traefik" k8s.yml

Si vous voulez voir les commandes helm et les paramètres qui ont été exécutés dans les logs, vous pouvez également spécifier --extra-vars traefik_helm_show_commands=true.

Une des tâches finales s'appelle TASK [githubixx.traefik_kubernetes : Write templates to file]. Cela rend le modèle avec les ressources qui seront créées dans le répertoire spécifié dans traefik_template_output_directory. Le fichier sera appelé template.yml. Le répertoire / fichier sera placé sur votre machine locale pour vous permettre de l'inspecter.

Si le modèle rendu contient tout ce dont vous avez besoin, le rôle peut être installé, ce qui déploie enfin Traefik :

ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=install k8s.yml

Pour vérifier si tout a été déployé, utilisez les commandes habituelles kubectl comme kubectl -n <traefik_namespace> get pods -o wide.

Comme Traefik émet des mises à jour / upgrades tous les quelques semaines / mois, le rôle peut également faire des mises à jour / upgrades. Cette méthode peut également être utilisée pour changer des valeurs existantes sans mettre à jour la version de Traefik, par exemple. Voir également Traefik releases avant de mettre à jour Traefik. Les modifications du Helm chart peuvent être trouvées dans l' historique des commits.

Si vous souhaitez mettre à niveau Traefik / Helm chart, vous devez essentiellement changer la variable traefik_chart_version, par exemple de 10.21.1 à 10.24.2. Vous devrez peut-être également changer la valeur image.tag dans templates/traefik_values_default.yml.j2. Si seuls des paramètres doivent être modifiés, mettez à jour les valeurs en conséquence.

Ainsi, pour effectuer la mise à jour de Traefik ou déployer les nouvelles valeurs, exécutez

ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=upgrade k8s.yml

Et enfin, si vous souhaitez vous débarrasser de Traefik, vous pouvez supprimer toutes les ressources :

ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=delete k8s.yml

Exemple de Playbook

Exemple 1 (sans tag de rôle) :

- hôtes : traefik
  rôles :
    - githubixx.traefik_kubernetes

Exemple 2 (attribuer un tag au rôle) :

-
  hôtes : traefik
  rôles :
    -
      rôle : githubixx.traefik-kubernetes
      tags : role-traefik-kubernetes

L'hôte traefik dans l'exemple de playbook est probablement simplement localhost spécifié dans le fichier hosts d'Ansible ou quel que soit l'hôte que vous souhaitez utiliser comme "exécutant". Assurez-vous que cet hôte a helm installé et a un kubeconfig valide (ce qui est normalement le cas si la commande kubectl fonctionne avec le cluster Kubernetes).

Tests

Ce rôle a une petite configuration de test qui est créée en utilisant Molecule, libvirt (vagrant-libvirt) et QEMU/KVM. Veuillez consulter mon article de blog Testing Ansible roles with Molecule, libvirt (vagrant-libvirt) and QEMU/KVM sur la façon de le configurer. La configuration de test est ici.

Ensuite, molecule peut être exécuté. Molecule va configurer quelques VM avec un cluster Kubernetes complet, ce qui rend possible le test de toutes les fonctionnalités de Traefik.

La commande suivante effectuera une configuration de base et créera un modèle des ressources (action par défaut vue ci-dessus) qui seront créées :

molecule converge

Installer Traefik et les ressources requises :

molecule converge -- --extra-vars action=install

Mettre à niveau Traefik ou modifier des paramètres :

molecule converge -- --extra-vars action=upgrade

Supprimer Traefik et ses ressources :

molecule converge -- --extra-vars action=delete

Pour exécuter quelques tests, utilisez

molecule verify

Pour nettoyer, exécutez

molecule destroy

Licence

LICENCE PUBLIQUE GÉNÉRALE GNU Version 3

Informations sur l'auteur

http://www.tauceti.blog

À propos du projet

Ansible role to install Traefik ingress controller in a Kubernetes cluster

Installer
ansible-galaxy install githubixx.traefik_kubernetes
Licence
gpl-3.0
Téléchargements
1.5k
Propriétaire
Senior System Engineer - Python, Go, Cloud, Kubernetes, Commodore, Retro, 80's ;-)