Skip to content

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标准 Ingressnetworking.k8s.io/v1
特殊 Middleware / 复杂 TLS / ServersTransportIngressRoutetraefik.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 处理该 Ingress
  • router.entrypoints: web,websecure:同时暴露 80 和 443
  • cert-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@kubernetescrd

redirectScheme 只在当前 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

基于 VitePress 构建