githubixx.traefik_kubernetes
traefik-kubernetes
Este rol de Ansible instala Traefik como un enrutador de borde para Kubernetes, actuando como controlador de ingreso. Internamente utiliza el chart de Helm oficial. Actualmente, se admiten procedimientos como la instalación, actualización/mejora y eliminación de la implementación de Traefik.
La configuración predeterminada está optimizada para un clúster de Kubernetes en metal desnudo o en las instalaciones, donde Traefik es el punto de entrada público para los servicios de Kubernetes. Aunque la configuración se puede personalizar como cualquier chart de Helm, los ajustes predeterminados configurarán Traefik con la siguiente configuración:
- Las instancias de Traefik se desplegarán como
DaemonSet
. - Los pods de Traefik utilizan
hostPort
. - Traefik escucha en el puerto
80
en todas las interfaces del host para solicitudes HTTP entrantes. - Traefik escucha en el puerto
443
en todas las interfaces del host para solicitudes HTTPS entrantes. - El panel de control de Traefik está habilitado y no está expuesto a Internet público.
- Los certificados TLS son proporcionados por cert-manager (mi rol de Ansible cert-manager-kubernetes se puede usar para instalar cert-manager).
Para más información sobre la configuración del chart de Helm, consulta abajo.
Versiones
Etiqueto cada lanzamiento y trato de seguir con versionado semántico. Si quieres usar el rol, te recomiendo revisar la última etiqueta. La rama maestra es básicamente para desarrollo, mientras que las etiquetas marcan lanzamientos estables. Pero en general, trato de mantener la rama maestra en buen estado también. Una etiqueta 5.0.0+23.0.1
significa que este es el lanzamiento 5.0.0
de este rol y usa la versión de chart de Helm 23.0.1
(la versión de Traefik
utilizada está especificada en el archivo de valores [ver abajo]). Si el propio rol cambia, X.Y.Z
antes del +
aumentará. Si cambia la versión del chart de Traefik, X.Y.Z
después del +
también aumentará. Esto permite etiquetar correcciones de errores y nuevas versiones principales del rol mientras se desarrolla para un lanzamiento específico de Traefik.
Requisitos
Necesitas tener el binario de Helm 3 instalado en el host donde se ejecuta ansible-playbook
o en el host al que delegaste los playbooks (por ejemplo, usando la variable traefik_delegate_to
). Puedes:
- usar tu gestor de paquetes favorito si tu distribución incluye
helm
en su repositorio (por ejemplo, para Archlinux usasudo pacman -S helm
). - o usar uno de los roles de Ansible
Helm
(por ejemplo, helm - que también se instalará si usasansible-galaxy role install -vr requirements.yml
). - o descargar directamente el binario de lanzamientos de Helm y colocarlo en el directorio
/usr/local/bin/
.
También se necesita un KUBECONFIG
correctamente configurado (que se encuentra en ${HOME}/.kube/config
por defecto). Normalmente, si kubectl
funciona con tu clúster, entonces todo debería estar bien en este sentido.
Adicionalmente, se necesita tener instalada la colección de Ansible kubernetes.core
. Esto se puede hacer usando el archivo collections.yml
incluido en este rol: ansible-galaxy install -r collections.yml
.
Y, por supuesto, necesitas un clúster de Kubernetes ;-)
Registro de cambios
ver CHANGELOG.md
Variables del rol
# Versión del chart de Helm
traefik_chart_version: "23.2.0"
# Nombre de la liberación de Helm
traefik_release_name: "traefik"
# Nombre del repositorio de Helm
traefik_repo_name: "traefik"
# Nombre del chart de Helm
traefik_chart_name: "{{ traefik_repo_name }}/{{ traefik_release_name }}"
# URL del chart de Helm
traefik_chart_url: "https://helm.traefik.io/traefik"
# Espacio de nombres de Kubernetes donde se instalarán los recursos de Traefik
traefik_namespace: "traefik"
# Directorio que contiene el archivo de valores del chart de Helm. Si especificas esta
# variable, Ansible intentará localizar un archivo llamado "values.yml.j2" o
# "values.yaml.j2" en el directorio especificado (".j2" porque puedes
# usar las plantillas Jinja2 aquí). El contenido de este archivo
# se proporcionará al comando "helm install/template" como archivo de valores.
# Por defecto, el directorio es el directorio "$HOME" del usuario más
# "/traefik/helm". Si la tarea no encuentra tal archivo, utiliza
# los valores en "templates/traefik_values_default.yml.j2" por defecto.
traefik_chart_values_directory: "{{ '~/traefik/helm' | expanduser }}"
# Por defecto, los CRDs (CustomResourceDefinitions) no se instalan. Establece en
# "true" si los CRDs deben instalarse. También consulta:
# https://github.com/traefik/traefik-helm-chart/tree/master/traefik/crds
# Se instalarán los siguientes CRDs:
# - 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
# Por defecto, todas las tareas que necesitan comunicarse con el clúster de Kubernetes
# se ejecutan en tu host local (127.0.0.1). Pero si ése no tiene conexión directa
# a este clúster o debería ejecutarse en otro lugar, esta variable puede cambiarse.
traefik_delegate_to: 127.0.0.1
# Muestra el comando "helm" que se ejecutó si una tarea utiliza Helm para
# instalar, actualizar/mejorar o eliminar dicho recurso.
traefik_helm_show_commands: false
# Sin una variable "action" definida, este rol solo renderizará un archivo
# con todos los recursos que se instalarán o actualizarán. El archivo renderizado
# con los recursos se llamará "template.yml" y se colocará en el directorio
# especificado a continuación.
traefik_template_output_directory: "{{ '~/traefik/template' | expanduser }}"
Uso
Lo primero que debes hacer es revisar templates/traefik_values_default.yml.j2
. Este archivo contiene los valores/configuraciones para el chart de Helm de Traefik que son diferentes a los predeterminados, que se encuentran aquí. Estos son los ajustes predeterminados utilizados:
# Todos los posibles valores del chart de Helm se pueden encontrar en:
# https://github.com/traefik/traefik-helm-chart/blob/master/traefik/values.yaml
image:
repository: traefik
tag: "2.11.2"
pullPolicy: IfNotPresent
# Estos argumentos se pasan al binario de Traefik. Para todas las opciones ver:
# https://doc.traefik.io/traefik/reference/static-configuration/cli/
#
# El primero establece el nivel de registro correspondiente.
#
# El segundo establece el valor de la anotación "kubernetes.io/ingress.class"
# a observar. Si se envía un objeto "Ingress" de Kubernetes "estándar"
# al servidor API de Kubernetes (en lugar de la propia implementación de ingreso
# de Traefik llamada "IngressRoute"), Traefik manejará estas solicitudes
# y las enruta en consecuencia.
additionalArguments:
- "--log.level=INFO"
- "--providers.kubernetesingress.ingressclass=traefik"
# Argumentos globales pasados al binario de Traefik.
# https://doc.traefik.io/traefik/reference/static-configuration/cli/
#
# El primero desactiva la verificación periódica si se ha lanzado una nueva versión.
#
# El segundo desactiva estadísticas de uso anónimas.
globalArguments:
- "--global.checknewversion=false"
- "--global.sendanonymoususage=false"
# Esto crea la implementación de Traefik. Como aquí se especifica "DaemonSet",
# esto creará una instancia de Traefik en todos los nodos trabajadores de Kubernetes. Si
# solo se debe usar un subconjunto de nodos, especifica "affinity", "nodeSelector"
# o "toleration" adecuadamente. Consulta el enlace a los valores del chart de Helm arriba.
deployment:
enabled: true
kind: DaemonSet
dnsPolicy: ClusterFirstWithHostNet
# Indica a Traefik que escuche en varios puertos.
ports:
# El nombre de este no se puede cambiar, ya que se usa para las comprobaciones de
# disponibilidad y estado, pero puedes ajustar su configuración a tu gusto.
# Para acceder al panel de control, puedes usar "kubectl port-forward", por ejemplo:
# kubectl -n traefik port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name -A | head -1) 9000:9000
# Abrir http://localhost:9000/dashboard/ debería mostrar el panel.
traefik:
port: 9000
expose: false
protocol: TCP
# Tráfico HTTP entrante no asegurado. Si descomentas "redirectTo: websecure",
# todo el tráfico que llegue a este puerto será redirigido al
# punto de entrada "websecure", que maneja el tráfico seguro HTTPS.
# Pero ten en cuenta que esto podría ser problemático para cert-manager.
# También se usa "hostPort". Dado que se especificó "DaemonSet" arriba,
# eso significa que los pods de Traefik responderán solicitudes en el
# puerto 80 y 443 en todos los nodos trabajadores de Kubernetes.
# Por lo tanto, si los hosts tienen una IP pública y el puerto 80/443
# no está protegido por un cortafuegos, Traefik estará disponible para solicitudes
# desde Internet (lo que normalmente deseas en caso de Traefik ;-) ). Para
# otras opciones, consulta el enlace de arriba. Estos ajustes son útiles para soluciones
# en metal desnudo o en las instalaciones sin ningún balanceador de carga adicional.
web:
port: 30080
hostPort: 80
expose: true
protocol: TCP
# redirectTo: websecure
# Punto de entrada para tráfico HTTPS.
websecure:
port: 30443
hostPort: 443
expose: true
protocol: TCP
# Estas configuraciones de seguridad son básicamente mejores prácticas para limitar
# la superficie de ataque tanto como sea posible.
# La superficie de ataque se puede limitar aún más con "seccomp", que es estable desde
# Kubernetes v1.19 y permite limitar las llamadas al sistema a un mínimo absoluto. Consulta:
# https://kubernetes.io/docs/tutorials/clusters/seccomp/
securityContext:
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsGroup: 65532
runAsNonRoot: true
runAsUser: 65532
# Todos los procesos del contenedor también son parte de este ID de grupo suplementario.
podSecurityContext:
fsGroup: 65532
# Establece el nivel de registro del registro general y habilita el registro de acceso.
logs:
general:
level: INFO
access:
enabled: true
# Dado que los puertos web/websecure de Traefik están expuestos por "hostPort", no se
# necesita un servicio.
service:
enabled: false
# Límites de recursos de CPU y RAM. Estos ajustes también deben establecerse a
# valores razonables en caso de una fuga de memoria, por ejemplo.
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "300m"
memory: "150Mi"
# Actualiza los Pods en el DaemonSet uno por uno cuando se actualiza el DaemonSet.
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
Pero nada está escrito en piedra ;-) Para usar tus propios valores, simplemente crea un archivo llamado values.yml.j2
o values.yaml.j2
y colócalo en el directorio especificado en traefik_chart_values_directory
(que por defecto es $HOME/traefik/helm
). Luego, este rol usará ese archivo para renderizar los valores de Helm. Puedes usar templates/traefik_values_default.yml.j2
como plantilla o simplemente comenzar desde cero. Como se mencionó anteriormente, puedes modificar todas las configuraciones para el chart de Helm que son diferentes a las que se encuentran aquí.
Después de que el archivo de valores esté en su lugar y se verifiquen los valores en defaults/main.yml
, se puede instalar el rol. La mayoría de las tareas del rol se ejecutan localmente, ya que muchas tareas necesitan comunicarse con el servidor API de Kubernetes o ejecutar comandos de Helm.
La acción predeterminada es simplemente renderizar el archivo YAML de recursos de Kubernetes después de reemplazar todas las variables y cosas de Jinja2. En la sección Ejemplo de Playbook
a continuación hay un Ejemplo 2 (asignar etiqueta al rol)
. El rol githubixx.traefik-kubernetes
tiene una etiqueta role-traefik-kubernetes
asignada. Suponiendo que se deben renderizar los valores para el chart de Helm (no se instalará nada en este caso) y el playbook se llama k8s.yml
, ejecuta el siguiente comando:
ansible-playbook --tags=role-traefik-kubernetes k8s.yml
Para renderizar la plantilla en un directorio diferente, usa la variable traefik_template_output_directory
, por ejemplo:
ansible-playbook --tags=role-traefik-kubernetes --extra-vars traefik_template_output_directory="/tmp/traefik" k8s.yml
Si quieres ver los comandos y los parámetros de helm
que se ejecutaron en los registros, también puedes especificar --extra-vars traefik_helm_show_commands=true
.
Una de las tareas finales se llama TAREA [githubixx.traefik_kubernetes : Escribir plantillas a archivo]
. Esta renderiza la plantilla con los recursos que se crearán en el directorio especificado en traefik_template_output_directory
. El archivo se llamará template.yml
. El directorio/archivo se colocará en tu máquina local para que puedas inspeccionarlo.
Si la plantilla renderizada contiene todo lo que necesitas, se puede instalar el rol, lo que finalmente despliega Traefik:
ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=install k8s.yml
Para verificar si todo se desplegó, usa los comandos habituales de kubectl
, como kubectl -n <traefik_namespace> get pods -o wide
.
Dado que Traefik lanza actualizaciones/mejoras cada pocas semanas/meses, el rol también puede hacer actualizaciones/mejoras. Este método también se puede usar para cambiar valores existentes sin actualizar la versión de Traefik, consulta también lanzamientos de Traefik antes de actualizar Traefik. Los cambios en el chart de Helm se pueden encontrar en el historial de commits.
Si deseas actualizar Traefik/chart de Helm, solo necesitas cambiar la variable traefik_chart_version
, por ejemplo, de 10.21.1
a 10.24.2
. También es posible que necesites cambiar el valor de image.tag
en templates/traefik_values_default.yml.j2
. Si solo se deben cambiar parámetros, actualiza los valores en consecuencia.
Para realizar la actualización de Traefik o implementar los nuevos valores, ejecuta:
ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=upgrade k8s.yml
Y, finalmente, si deseas deshacerte de Traefik, puedes eliminar todos los recursos nuevamente:
ansible-playbook --tags=role-traefik-kubernetes --extra-vars action=delete k8s.yml
Ejemplo de Playbook
Ejemplo 1 (sin etiqueta de rol):
- hosts: traefik
roles:
- githubixx.traefik_kubernetes
Ejemplo 2 (asignar etiqueta al rol):
-
hosts: traefik
roles:
-
role: githubixx.traefik-kubernetes
tags: role-traefik-kubernetes
El host traefik
en el ejemplo de playbook probablemente sea solo localhost
especificado en el archivo de hosts de Ansible o cualquier otro host que desees usar como "ejecutor". Asegúrate de que este host tenga helm
instalado y tenga un kubeconfig
válido (que normalmente es el caso si el comando kubectl
funciona con el clúster de Kubernetes).
Pruebas
Este rol tiene una pequeña configuración de prueba que se crea usando Molecule, libvirt (vagrant-libvirt) y QEMU/KVM. Consulta mi publicación en el blog Probando roles de Ansible con Molecule, libvirt (vagrant-libvirt) y QEMU/KVM para saber cómo configurar. La configuración de prueba está aquí.
Posteriormente, se puede ejecutar molécula. Molecule configurará algunas VMs con un clúster de Kubernetes completo, lo que hace posible probar toda la funcionalidad de Traefik.
El siguiente comando realizará una configuración básica y creará una plantilla de los recursos (acción predeterminada, consulta arriba) que se crearán:
molecule converge
Instalando Traefik
y los recursos requeridos:
molecule converge -- --extra-vars action=install
Actualizando Traefik
o cambiando parámetros:
molecule converge -- --extra-vars action=upgrade
Eliminando Traefik
y sus recursos:
molecule converge -- --extra-vars action=delete
Para ejecutar algunas pruebas, usa:
molecule verify
Para limpiar, ejecuta:
molecule destroy
Licencia
Licencia PÚBLICA GENERAL GNU Versión 3
Información del autor
Ansible role to install Traefik ingress controller in a Kubernetes cluster
ansible-galaxy install githubixx.traefik_kubernetes