I. Resumen
Traefik es un enrutador de borde de código abierto que puede hacer que la publicación de servicios sea fácil y divertida. Es responsable de recibir solicitudes de su sistema y luego utilizar los componentes apropiados para procesar estas solicitudes.
Además de las numerosas funciones, Traefik es único porque descubrirá automáticamente la configuración que se adapta a su servicio. Cuando Traefik esté verificando su servicio, encontrará información sobre el servicio y encontrará el servicio adecuado para satisfacer la solicitud correspondiente.
Traefik es compatible con todas las tecnologías de clúster convencionales, como Kubernetes, Docker, Docker Swarm, AWS, Mesos, Marathon, etc .; y puede manejar múltiples métodos al mismo tiempo. (Incluso se puede usar para software antiguo que se ejecuta en bare metal).
Con Traefik, no es necesario mantener y sincronizar un archivo de configuración separado: todo sucede automáticamente y en tiempo real (sin reiniciar, sin interrupción de la conexión). Con Traefik, puede dedicar tiempo a desarrollar e implementar nuevas funciones en el sistema en lugar de configurar y mantener su estado de funcionamiento.
<! - más ->
2. Concepto
Enrutador de borde
Traefik es un enrutador de borde, la puerta a toda su plataforma, que intercepta y enruta cada solicitud entrante: conoce toda la lógica y las reglas, y estas reglas determinan qué servicios manejan qué solicitudes; el proxy inverso tradicional requiere un archivo de configuración, Contiene todas las rutas posibles a su servicio, y Traefik detectará el servicio en tiempo real y actualizará automáticamente las reglas de enrutamiento, que se pueden descubrir automáticamente.
Descubrimiento de servicio automático
Un enrutador de borde tradicional (o proxy inverso) requiere un archivo de configuración que contiene todas las rutas posibles al servicio, y Traefik las obtiene del propio servicio.
Al implementar su servicio, debe adjuntar cierta información para decirle a Traefik las características de la solicitud que el servicio puede manejar.
Esto significa que cuando se implemente el servicio, Traefik lo detectará inmediatamente y actualizará las reglas de enrutamiento en tiempo real. Lo contrario también es cierto: cuando elimina un servicio de la infraestructura, el enrutamiento desaparecerá en consecuencia.
Ya no es necesario crear y sincronizar archivos de configuración mezclados con direcciones IP u otras reglas.
Antes de comprender Traefik, hay varios conceptos básicos que debemos comprender:
Providers
Se utiliza para descubrir automáticamente servicios en la plataforma, que pueden ser herramientas de orquestación, motores de contenedores o almacenamiento de valor clave, como Docker, Kubernetes, FileEntrypoints
Escuchar el tráfico entrante (puertos, etc.) es el punto de entrada a la red, y ellos definen el puerto (HTTP o TCP) para recibir solicitudes.Routers
Analice las solicitudes (host, ruta, encabezados, SSL,…) y conecte las solicitudes entrantes a los servicios que pueden manejar estas solicitudes.Services
Reenvíe la solicitud a su aplicación (balanceo de carga,…), responsable de configurar cómo obtener el servicio real que eventualmente manejará la solicitud entrante.Middlewares
El middleware se usa para modificar la solicitud o hacer algunos juicios basados en la solicitud (autenticación, limitación de velocidad, encabezados, ...). El middleware se adjunta a la ruta, que es una especie de antes de que la solicitud se envíe a su servicio (o en el servicio Un método para ajustar la solicitud antes de que se envíe la respuesta al cliente.
Tres, instalación
Porque la versión 2.X de Traefik no es compatible con la versión 1.X anterior y la versión 1.X ha dejado de actualizarse. Aquí elegimos la versión 2.X más potente para explicarle, la imagen que usamos aquí es traefik:2.3.2
.
Este documento utiliza KubernetesCRD
como provider
, por lo que debe crear un CRD
3.1 Crear archivo traefik-crd.yaml
traefik-crd.yaml
# All resources definition must be declared
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: ingre***outes.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: Ingre***oute
plural: ingre***outes
singular: ingre***oute
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: middlewares.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: Middleware
plural: middlewares
singular: middleware
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: ingre***outetcps.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: Ingre***outeTCP
plural: ingre***outetcps
singular: ingre***outetcp
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: ingre***outeudps.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: Ingre***outeUDP
plural: ingre***outeudps
singular: ingre***outeudp
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: tlsoptions.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: TLSOption
plural: tlsoptions
singular: tlsoption
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: tlsstores.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: TLSStore
plural: tlsstores
singular: tlsstore
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: traefikservices.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: TraefikService
plural: traefikservices
singular: traefikservice
scope: Namespaced
3.2 Crear permisos rbac
traefik-rbac.yaml
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
- networking.k8s.io
resources:
- ingresses
- ingressclasses
verbs:
- get
- list
- watch
- apiGroups:
- extensions
resources:
- ingresses/status
verbs:
- update
- apiGroups:
- traefik.containo.us
resources:
- middlewares
- ingre***outes
- traefikservices
- ingre***outetcps
- ingre***outeudps
- tlsoptions
- tlsstores
verbs:
- get
- list
- watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: traefik-ingress-controller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: traefik-ingress-controller
subjects:
- kind: ServiceAccount
name: traefik-ingress-controller
namespace: default
3.3 Crear archivo de configuración traefik
La configuración en Traefik se puede utilizar de dos formas diferentes:
- Configuración dinámica: configuración de enrutamiento completamente dinámica
- Configuración estática: configuración de inicio
静态配置
Los elementos en (estos elementos no cambian con frecuencia) se conectan a los proveedores y definen los puntos de entrada que Treafik monitoreará.
Hay tres formas de definir la configuración estática en Traefik: en el archivo de configuración, en los parámetros de la línea de comandos y pasando a través de variables de entorno
动态配置
Contiene todo el contenido de la configuración que define cómo el sistema procesa las solicitudes. Estas configuraciones se pueden cambiar y se actualizan en caliente sin interrupciones ni pérdidas de conexión.
Aquí colocamos la configuración básica general en la configuración estática y la configmap
implementamos en el formulario
traefik-config-cm.yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: traefik-config
data:
traefik.yaml: |-
serversTransport:
insecureSkipVerify: true ## Traefik 忽略验证代理服务的 TLS 证书
api:
insecure: true ## 允许 HTTP 方式访问 API
dashboard: true ## 启用 Dashboard
debug: false ## 启用 Debug 调试模式
metrics:
prometheus: metrics ## 配置 Prometheus 监控指标数据,并使用默认配置
entryPoints:
web:
address: ":80" ## 配置 80 端口,并设置入口名称为 web
websecure:
address: ":443" ## 配置 443 端口,并设置入口名称为 websecure
traefik:
address: ":8090" ## 配置 8090 端口,并设置入口名称为 dashboard
metrics:
address: ":8082" ## 配置 8082 端口,作为metrics收集入口
tcpep:
address: ":8000" ## 配置 8000 端口,作为tcp入口
udpep:
address: ":9000/udp" ## 配置 9000 端口,作为udp入口
providers:
kubernetescrd: ## 启用 Kubernetes CRD 方式来配置路由规则
ingressclass: traefik-v2.3
kubernetesingress: ## 启动 Kubernetes Ingress 方式来配置路由规则
ingressclass: traefik-v2.3
log:
filePath: "/etc/traefik/logs/traefik.log" ## 设置调试日志文件存储路径,如果为空则输出到控制台
level: error ## 设置调试日志级别
format: "" ## 设置调试日志格式
accessLog:
filePath: "/etc/traefik/logs/access.log" ## 设置访问日志文件存储路径,如果为空则输出到控制台
format: "" ## 设置访问调试日志格式
bufferingSize: 0 ## 设置访问日志缓存行数
filters:
#statusCodes: ["200"] ## 设置只保留指定状态码范围内的访问日志
retryAttempts: true ## 设置代理访问重试失败时,保留访问日志
minDuration: 20 ## 设置保留请求时间超过指定持续时间的访问日志
fields: ## 设置访问日志中的字段是否保留(keep 保留、drop 不保留)
defaultMode: keep ## 设置默认保留访问日志字段
names: ## 针对访问日志特别字段特别配置保留模式
ClientUsername: drop
headers: ## 设置 Header 中字段是否保留
defaultMode: keep ## 设置默认保留 Header 中字段
names: ## 针对 Header 中特别字段特别配置保留模式
User-Agent: redact
Authorization: drop
Content-Type: keep
3.4 implementar traefik
traefik-deploy.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: traefik-ingress-controller
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: traefik-v2
labels:
app: traefik-v2
spec:
replicas: 2
selector:
matchLabels:
app: traefik-v2
template:
metadata:
labels:
app: traefik-v2
spec:
serviceAccountName: traefik-ingress-controller
terminationGracePeriodSeconds: 1
containers:
- name: traefik-v2
image: harbor.foxchan.com/traefik/traefik:v2.3
args:
- --configfile=/config/traefik.yaml
ports:
- name: web
containerPort: 80
- name: admin
containerPort: 8090
- name: tcpep
containerPort: 8000
- name: udpep
containerPort: 9000
securityContext:
capabilities: ## 只开放网络权限
drop:
- ALL
add:
- NET_BIND_SERVICE
volumeMounts:
- mountPath: "/config"
name: "config"
- mountPath: /etc/traefik/logs
name: logdir
- mountPath: /etc/localtime
name: timezone
readOnly: true
volumes:
- name: config
configMap:
name: traefik-config
- name: logdir
hostPath:
path: /data/traefik/logs
type: "DirectoryOrCreate"
- name: timezone
hostPath:
path: /etc/localtime
type: File
tolerations:
- operator: "Exists" ## 设置容忍所有污点,防止节点被设置污点
hostNetwork: true ## 开启host网络,提高网络入口的网络性能
nodeSelector: ## 设置node筛选器,在特定label的节点上启动
IngressProxy: "traefik2.3"
---
apiVersion: v1
kind: Service
metadata:
name: traefik-v2
spec:
type: LoadBalancer
selector:
app: traefik-v2
ports:
- protocol: TCP
port: 80
name: web
targetPort: 80
- protocol: TCP
port: 8090
name: admin
targetPort: 8090
- protocol: TCP
port: 8000
name: tcpep
targetPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: traefikudp-v2
spec:
type: LoadBalancer
selector:
app: traefik-v2
ports:
- protocol: UDP
port: 9000
name: udpep
targetPort: 9000
En este momento, puede ver la dashboard
información relevante a través del nodo http: // IP: 8090
Cuatro, configuración de enrutamiento
Traefik realiza modificaciones dinámicas de archivos de configuración a través de CRD
Los recursos personalizados disponibles se pueden encontrar en la siguiente tabla
Tipo | Propósito | Concepto detrás |
---|---|---|
Ingre *** oute | Enrutamiento HTTP | Enrutador HTTP |
Middleware | Ajusta las solicitudes HTTP antes de que se envíen a su servicio | Middlewares HTTP |
TraefikService | Abstracción para el equilibrio / reflejo de carga HTTP | Servicio HTTP |
Ingre *** outeTCP | Enrutamiento TCP | Enrutador TCP |
Ingre *** outeUDP | Enrutamiento UDP | Enrutador UDP |
TLSOpciones | Permite configurar algunos parámetros de la conexión TLS | TLSOpciones |
TLSStores | Permite configurar la tienda TLS predeterminada | TLSStores |
4.1 Configurar reglas de enrutamiento HTTP
Se ha implementado Traefik, pero desea acceso externo al servicio interno de Kubernetes, también necesita configurar reglas de enrutamiento, aquí panel de control traefik y whoami
ejemplos.
Primero crea el despliegue de whoami
whoami.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: whoami
namespace: default
labels:
app: traefiklabs
name: whoami
spec:
replicas: 2
selector:
matchLabels:
app: traefiklabs
task: whoami
template:
metadata:
labels:
app: traefiklabs
task: whoami
spec:
containers:
- name: whoami
image: traefik/whoami
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: whoami
namespace: default
spec:
ports:
- name: http
port: 80
selector:
app: traefiklabs
task: whoami
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: whoamitcp
namespace: default
labels:
app: traefiklabs
name: whoamitcp
spec:
replicas: 2
selector:
matchLabels:
app: traefiklabs
task: whoamitcp
template:
metadata:
labels:
app: traefiklabs
task: whoamitcp
spec:
containers:
- name: whoamitcp
image: traefik/whoamitcp
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: whoamitcp
namespace: default
spec:
ports:
- protocol: TCP
port: 8080
selector:
app: traefiklabs
task: whoamitcp
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: whoamiudp
namespace: default
labels:
app: traefiklabs
name: whoamiudp
spec:
replicas: 2
selector:
matchLabels:
app: traefiklabs
task: whoamiudp
template:
metadata:
labels:
app: traefiklabs
task: whoamiudp
spec:
containers:
- name: whoamiudp
image: traefik/whoamiudp:latest
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: whoamiudp
namespace: default
spec:
ports:
- port: 8080
selector:
app: traefiklabs
task: whoamiudp
dashboard.yaml
Debido a que el archivo de configuración estática especifica ingressclass,
annotations
debe especificarse aquí ; de lo contrario, el acceso será 404
apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
name: traefik-dashboard
namespace: default
annotations:
kubernetes.io/ingress.class: traefik-v2.3
spec:
entryPoints:
- web
routes:
- match: Host(`traefik.foxchan.com`)
kind: Rule
services:
- name: api@internal
kind: TraefikService
whoami-ingre *** oute.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
name: myingre***oute
namespace: default
annotations:
kubernetes.io/ingress.class: traefik-v2.3
spec:
entryPoints:
- web
routes:
- match: Host(`whoami.foxchan.com`) && PathPrefix(`/`)
kind: Rule
services:
- name: whoami
port: 80
A continuación, configure los Hosts. Si el cliente desea acceder al servicio a través del nombre de dominio, debe realizar la resolución DNS. Aquí, la resolución del nombre de dominio se puede realizar a través del servidor DNS. También puede modificar el archivo de hosts para vincular la IP del nodo designado por Traefik a un host personalizado.
4.2 Configurar reglas de enrutamiento HTTPS
Si necesitamos usar HTTPS para acceder a nuestra aplicación, entonces es necesario escuchar websecure
este punto de entrada, al cual se accede a través del puerto 443, lo mismo con el acceso HTTPS a aplicaciones que necesariamente requiere un certificado, aquí usamos openssl
para crear un certificado autofirmado:
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=whoami.foxchan.com"
Luego, consulte el archivo de certificado a través del objeto secreto:
# 要注意证书文件名称必须是 tls.crt 和 tls.key
$ kubectl create secret tls who-tls --cert=tls.crt --key=tls.key
secret/who-tls created
En este momento, podemos crear un objeto Ingre *** oute para aplicaciones de acceso HTTPS:
apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
name: ingre***outetls
annotations:
kubernetes.io/ingress.class: traefik-v2.3
spec:
entryPoints:
- websecure
routes:
- match: Host(`whoami.foxchan.com`)
kind: Rule
services:
- name: whoami
port: 80
tls:
secretName: who-tls
4.3 Configurar reglas de enrutamiento TCP
whoami-tcp.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***outeTCP
metadata:
name: ingre***outetcpwho
annotations:
kubernetes.io/ingress.class: traefik-v2.3
spec:
entryPoints:
- tcpep
routes:
- match: HostSNI(`*`)
services:
- name: whoamitcp
port: 8080
4.4 Configurar las reglas de enrutamiento de udp
whoami-udp.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***outeUDP
metadata:
name: ingre***outeudpwho
annotations:
kubernetes.io/ingress.class: traefik-v2.3
spec:
entryPoints:
- udpep
routes:
- services:
- name: whoamiudp
port: 8080
Cinco, middleware
El middleware es una característica muy distintiva en Traefik 2.0. Podemos elegir diferentes middleware para satisfacer nuestras necesidades de acuerdo con nuestras diversas necesidades. Traefik oficialmente tiene un middleware integrado con muchas funciones diferentes, algunas de las cuales pueden modificarse. Información de encabezado, algunos son responsables de la redirección, algunos agregan autenticación, etc., y el middleware también se puede aplicar a varias situaciones a través de la combinación de cadenas.
Ejemplo de lista blanca
El tablero de arriba es información importante, podemos configurar la IP a la que solo se puede acceder mediante la lista blanca
Crear middleware de lista blanca
middleware-ipwhitelist.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: gs-ipwhitelist
spec:
ipWhiteList:
sourceRange:
- 127.0.0.1
- 10.244.0.0/16
- 10.96.0.0/12
- 192.168.0.0/24
Luego, adjunte este middleware al servicio del panel
apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
name: traefik-dashboard
namespace: default
annotations:
kubernetes.io/ingress.class: traefik-v2.3
spec:
entryPoints:
- web
routes:
- match: Host(`traefik.foxchan.com`)
kind: Rule
services:
- name: api@internal
kind: TraefikService
middlewares: #这里添加中间件的名字
- name: gs-ipwhitelist
En este momento, visitaremos el panel nuevamente, y aquellos que no están en la lista blanca informarán 403. Para más uso de middleware, consulte Traefik Docs .
6. Configuración de enrutamiento (avanzado)
En el entorno de producción real, además del negocio en línea, existen requisitos de uso más complejos.
Antes de comenzar el uso avanzado de traefik, debe comprender uno más TraefikService
, que es TraefikService
realizar configuraciones de solicitud más complicadas registrándose en el CRD.
TraefikService
Actualmente se puede utilizar para las siguientes funciones
- Equilibrio de carga de los servidores (equilibrio de carga)
- servicios Equilibrio de carga Round Robin ponderado (Round Robin ponderado )
- servicios de duplicación ( duplicación )
6.1 Equilibrio de carga
Crear servicio k8s
apiVersion: v1
kind: Service
metadata:
name: svc1
namespace: default
spec:
ports:
- name: http
port: 80
selector:
app: v1
---
apiVersion: v1
kind: Service
metadata:
name: svc2
namespace: default
spec:
ports:
- name: http
port: 80
selector:
app: v2
Crear Ingre *** oute
apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
name: ingre***outelb
namespace: default
spec:
entryPoints:
- web
routes:
- match: Host(`whoami.foxchan.com`)
kind: Rule
services:
- name: svc1
namespace: default
- name: svc2
namespace: default
6.2 Sondeo de peso
Crear TraefikService
apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
name: wrr
namespace: default
spec:
weighted:
services:
- name: svc1
port: 80
weight: 3 # 定义权重
kind: Service # 可选,默认就是 Service
- name: svc2
port: 80
weight: 1
Crear Ingre *** oute
Cabe señalar que el servicio que configuramos ya no es un objeto directo de Kubernetes, sino el objeto TraefikService que definimos anteriormente
apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
name: ingre***outewrr
namespace: default
spec:
entryPoints:
- web
routes:
- match: Host(`who.foxchan.com`)
kind: Rule
services:
- name: wrr
namespace: default
kind: TraefikService
6.3 Espejo
Aquí hay dos tipos de demostraciones de replicación de tráfico
El tráfico se copia al servicio k8s
# Mirroring from a k8s Service
apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
name: mirror-k8s
namespace: default
spec:
mirroring:
name: svc1 # 发送 100% 的请求到 K8S 的 Service "v1"
port: 80
mirrors:
- name: svc2 # 然后复制 20% 的请求到 v2
port: 80
percent: 20
El tráfico se importa desde Traefik Service
# Mirroring from a Traefik Service
apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
name: mirror-ts
namespace: default
spec:
mirroring:
name: mirror-k8s #流量入口从TraefikService 来
kind: TraefikService
mirrors:
- name: svc2
port: 80
percent: 20
Crear Ingre *** oute
apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
name: ingre***oute-mirror
namespace: default
spec:
entryPoints:
- web
routes:
- match: Host(`who.foxchan.com`)
kind: Rule
services:
- name: mirror-k8s
namespace: default
kind: TraefikService