Traefik 路由与 Middleware
Traefik 是 K3s 内置的 Ingress Controller,负责将公网流量按域名和路径路由到后端服务。
核心概念
| 概念 | 作用 | 说明 |
|---|---|---|
| EntryPoint | 监听端口 | web = :80,websecure = :443 |
| Router | 路由规则 | 按 Host / Path / Headers 匹配请求 |
| Service | 后端目标 | K8s Service 或外部服务 |
| Middleware | 中间处理 | 跳转、鉴权、限流、改请求头等 |
数据流:请求 → EntryPoint → Router → Middleware → Service → 后端
Ingress vs IngressRoute
Traefik 支持两种路由定义方式,按需求选型:
| 场景 | 使用方式 |
|---|---|
| 普通 HTTP / HTTPS | 标准 Ingress(networking.k8s.io/v1) |
| 特殊 Middleware / 复杂 TLS / ServersTransport | IngressRoute(traefik.io/v1alpha1) |
约定:默认使用标准 Ingress,只有高级需求才用 IngressRoute,避免两套混用。
标准 Ingress 示例
以 docs.ljdou.cn 为例:
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ljdou-docs
namespace: default
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web,websecure
traefik.ingress.kubernetes.io/router.middlewares: default-https-redirect@kubernetescrd
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: traefik
rules:
- host: docs.ljdou.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ljdou-docs
port:
number: 3001
tls:
- hosts:
- docs.ljdou.cn
secretName: docs-ljdou-cn-tls关键点:
ingressClassName: traefik:指定由 Traefik 处理该 Ingressrouter.entrypoints: web,websecure:同时暴露 80 和 443cert-manager.io/cluster-issuer:触发证书自动签发(见 cert-manager 篇)
常用注解
| 注解 | 作用 |
|---|---|
router.entrypoints | 指定入口(web / websecure / 逗号分隔) |
router.middlewares | 引用 Middleware,格式 <ns>-<name>@kubernetescrd |
router.tls | 强制 TLS |
router.priority | 路由优先级(多个规则冲突时) |
Middleware:HTTP → HTTPS 跳转
创建全局跳转中间件:
yaml
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: https-redirect
namespace: default
spec:
redirectScheme:
scheme: https
permanent: true引用方式(注解里):
traefik.ingress.kubernetes.io/router.middlewares: default-https-redirect@kubernetescrdredirectScheme 只在当前 scheme 与目标不一致时才跳转,因此挂到 web,websecure 两个入口也不会造成 HTTPS 死循环。
路由优先级
当多个 Ingress 匹配同一 Host 时,Traefik 按「路径长度」决定优先级:
- 精确路径 > 长前缀路径 > 短前缀路径
- cert-manager 的 HTTP-01 挑战会临时创建
/.well-known/acme-challenge/的独立 Ingress,其路径更长,自动优先于/规则,因此不会与业务路由冲突。
验证与排障
bash
# 查看所有路由规则
kubectl get ingress,ingressroute -A
# 查看 Traefik 日志(路由错误、TLS 配置错误都在这里)
kubectl logs -n kube-system deploy/traefik --tail=100
# 验证跳转
curl -I http://docs.ljdou.cn/ # 期望 301 → https
curl -I https://docs.ljdou.cn/ # 期望 200