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 usa sudo pacman -S helm).
  • o usar uno de los roles de Ansible Helm (por ejemplo, helm - que también se instalará si usas ansible-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

http://www.tauceti.blog

Acerca del proyecto

Ansible role to install Traefik ingress controller in a Kubernetes cluster

Instalar
ansible-galaxy install githubixx.traefik_kubernetes
Licencia
gpl-3.0
Descargas
1.5k
Propietario
Senior System Engineer - Python, Go, Cloud, Kubernetes, Commodore, Retro, 80's ;-)