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 utilisezsudo pacman -S helm
). - ou utiliser l'un des rôles Ansible
Helm
(par exemple, helm - qui sera également installé si vous utilisezansible-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
Ansible role to install Traefik ingress controller in a Kubernetes cluster
ansible-galaxy install githubixx.traefik_kubernetes