No es ningún secreto que K8S tiene una excelente comunidad y, en general, una buena documentación. En él puedes encontrar fácilmente la respuesta a muchas preguntas. Pero como cualquier otra documentación, no puede cubrir absolutamente todo. En este artículo intentaré proporcionar instrucciones detalladas sobre cómo implementar y configurar Traefik para usarlo como un controlador Ingress.

¿Qué es el ingreso?
Ingress es un objeto API que controla el acceso externo a los servicios en un clúster, principalmente a través de HTTP / HTTPS. Para que el recurso Ingress funcione, necesita un controlador Ingress. Si usa GCE, el controlador Ingress ya está implementado en el asistente. Sin embargo, si usted mismo descargó el clúster, por ejemplo, desde kops
a AWS, debe implementar el controlador Ingress usted mismo. En minikube, esto se resuelve al incluir el complemento Ingress.
Controladores de entrada
NGINX Ingress Controller, Kong, Octavia Ingress Controller, etc. pueden desempeñar el papel del controlador Ingress, etc. En este artículo consideraremos una herramienta como Traefik y veremos cómo puede usarlo como un controlador Ingress para servicios en un clúster.
Por qué
¿Por qué usar un controlador Ingress si puede proporcionar acceso a cada servicio a través de NodePort
o LoadBalancer
? En resumen, esto permite que un punto central represente todo el tráfico. Es decir, con el controlador Ingress, solo necesita un LoadBalancer para Traefik y nada más. Este paquete resolverá todo el tráfico.
Componentes Traefik
Traefik anunció soporte para Kubernetes Ingress en la versión 1.4. Sin embargo, el Traefik 1.7 recientemente lanzado tiene la opción de servicio publishedService,
que puede actualizar el campo de status
en Ingress, que no estaba en versiones anteriores. La siguiente es una lista de componentes que se requerirán para operar.
Crear:
- espacio de nombres
- cuenta de servicio
- Secreto TLS
- rol de clúster
- enlace de rol de clúster
- mapa de configuración
- despliegue
- servicio para http y https
- servicio para el tablero de Traefik
- Entrada
Espacio de nombres
Crea un espacio de nombres:
kubectl create namespace traefik
TLS Secret
(aprox. por. - en el siguiente ejemplo, por alguna razón el autor duplica la misma configuración, vea la configuración actual en el archivo README provisto por el enlace a continuación)
Primero cree un certificado:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com"
Crear un certificado TLS:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=*.example.com"
Crear secreto:
kubectl create secret tls traefik-ui-tls-cert --key ./tls.key --cert ./tls.crt
Por conveniencia, hice un archivo README con estos comandos y lo subí a mi GitHub .
ConfigMap
--- apiVersion: v1 kind: ConfigMap metadata: name: traefik-configmap namespace: traefik data: traefik.toml: | defaultEntryPoints = ["http","https"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] CertFile = "/ssl/tls.crt" KeyFile = "/ssl/tls.key" [entryPoints.traefik] address = ":8080" [entryPoints.traefik.auth.basic] users = ["admin:$apr1$zjjGWKW4$W2JIcu4m26WzOzzESDF0W/"] [kubernetes] [kubernetes.ingressEndpoint] publishedService = "traefik/traefik" [ping] entryPoint = "http" [api] entryPoint = "traefik"
Por defecto, EntryPoints son los puertos 80
y 443
.
EntryPoint http
escucha :80
y no tiene reglas adicionales
EntryPoint https
escucha en :443
y contiene una regla para conectar certificados TLS.
EntryPoint traefik
escucha :8080
y usa autenticación básica. El nombre de usuario es admin
, la contraseña es admin
.
La definición del punto final Ingress correspondiente en Kubernetes se realiza especificando publishService
y debe consistir en el valor del namespace
de namespace
y el nombre del service
para Traefik. En este caso, es traefik / traefik
.
ping
o chequeo de salud usará entryPoint http
.
api
o dashboard / ui usarán entryPoint traefik
.
Tenga en cuenta que puede definir puntos de entrada adicionales con un puerto. Este puerto puede proxy de tráfico a cualquier puerto, en lugar de puertos dinámicos y NodePort
.
Clusterrole
La cuenta de servicio para Traefik debe tener permiso para actualizar el campo de Ingress status
. Este es un parámetro importante, y aún no se presenta en la documentación oficial de Traefik :
--- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller rules: - apiGroups: - "" resources: - services - endpoints - secrets verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses/status verbs: - update
Las últimas 6 líneas son muy importantes para el correcto funcionamiento.
Despliegue
La implementación es bastante sencilla. Veamos brevemente los bloques principales:
volumes: - name: traefik-ui-tls-cert secret: secretName: traefik-ui-tls-cert - name: traefik-configmap configMap: name: traefik-configmap
Defina volumes
para ConfigMap y Secret, que luego se pueden usar en volumeMounts
.
volumeMounts: - mountPath: "/ssl" name: "traefik-ui-tls-cert" - mountPath: "/config" name: "traefik-configmap"
Las comprobaciones de estado se realizan en el puerto 80, como se define en ConfigMap.
Abra los puertos para todos los puntos de entrada especificados en el archivo de configuración:
ports: - name: http containerPort: 80 - name: https containerPort: 443 - name: dashboard containerPort: 8080
Le recuerdo que algunos ejemplos y documentación en Internet están desactualizados, así que no se pierda la sección de argumentos necesaria para que Traefik funcione:
args: - --logLevel=INFO - --configfile=/config/traefik.toml
No pase banderas y argumentos adicionales, como -api, -ping o -kubernetes, porque esto anulará la configuración especificada en el archivo de configuración.
Servicio
El primero de los servicios define un Loadbalancer para entryPoints http
y https
. Si observa el grupo de seguridad (Ingress) para LoadBalancer, verá los puertos 80 y 443 abiertos allí. Los K8 crearán un LoadBalancer y lo conectarán a los nodos en los que se ejecuta Traefik. Si desea crear un ELB interno, como yo, debe definir anotaciones:
--- kind: Service apiVersion: v1 metadata: name: traefik namespace: traefik annotations: # service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0 spec: selector: k8s-app: traefik-ingress ports: - protocol: TCP port: 80 name: http - protocol: TCP port: 443 name: https type: LoadBalancer
Servicio (para Tablero)
Ahora la parte divertida! Como Dashboard usa autenticación básica, necesitaba https
. Para usar SSL, debemos redirigir el tráfico al puerto :8080
, en el que funciona el Tablero. Como puede ver, es muy simple. Toda la magia sucede en Ingress.
--- kind: Service apiVersion: v1 metadata: name: traefik-dashboard namespace: traefik spec: selector: k8s-app: traefik-ingress ports: - port: 8080 name: dashboard
Ingress (para el tablero de instrumentos)
La magia es que el tráfico seguro proxy a Dashboard se realiza a través de Traefik. La gestión de Traefik in Ingress se realiza mediante anotaciones de Traefik :
--- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-dashboard-ingress namespace: traefik annotations: kubernetes.io/ingress.class: traefik traefik.ingress.kubernetes.io/frontend-entry-points: http,https traefik.ingress.kubernetes.io/redirect-entry-point: https traefik.ingress.kubernetes.io/redirect-permanent: "true" spec: rules: - host: traefik-ui.example.com http: paths: - path: / backend: serviceName: traefik-dashboard servicePort: 8080
Solo tomó 4 anotaciones simples y claras.
Por supuesto, para garantizar la plena funcionalidad, debe crear un registro DNS traefik-ui.example.com
, que apuntará a su ELB.
¿Sería bueno si esto se hiciera automáticamente? No hay problema, escribiré sobre la creación automática de registros DNS en el próximo artículo.
Referencias
El archivo deploy.yaml terminado se puede descargar desde mi repositorio de Github . Si tiene alguna dificultad durante el proceso de configuración, no dude en preguntar.
Palabras de despedida del traductor
Lea otros artículos en nuestro blog:
Copias de seguridad con estado en Kubernetes
Copia de seguridad de una gran cantidad de proyectos web heterogéneos
Telegram bot para Redmine. Cómo simplificar la vida para ti y para las personas