跳转到内容

Traefik 面试题

30 道题
分类
Kubernetes
子分类
ingress
题目数
30 道
已阅读 0 / 30 题
1 Traefik 的核心架构由哪些组件构成?

答案:

Traefik 采用反向代理 + Provider 的架构设计,核心组件包括 EntryPoint、Router、Service 和 Middleware。

  • EntryPoint(入口点):网络端口监听器(如 80/443),定义 Traefik 接收流量的网络接口和协议
  • Router(路由器):将请求与规则匹配(Host/Path/Headers),分发到对应 Service
  • Service(服务):定义流量的后端目标(K8s Service、容器、IP 地址等),支持负载均衡
  • Middleware(中间件):请求/响应处理链(如认证、限流、重定向、添加头),以管道方式串联

Provider 架构: Traefik 通过 Provider 从不同来源自动发现配置,无需手动重启。

K8s Provider ← Watch Ingress/CRD 资源 → Traefik 动态配置
Docker Provider ← Watch 容器 Labels
File Provider ← 监听配置文件变更
Consul/etcd Provider ← Watch KV 存储
2 Traefik 自动服务发现(Service Discovery)的原理是什么?

答案:

Traefik 的自动服务发现通过 Provider 实时监听后端变化实现。

K8s Provider 服务发现:

# Traefik 监听到 Pod/Service 变更后自动更新路由
providers:
  kubernetesCRD: true
  kubernetesIngress:
    enabled: true
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: api-route
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`api.example.com`) && PathPrefix(`/v1`)
    kind: Rule
    services:
    - name: api-svc
      port: 8080

服务发现流程:

K8s 创建 Service + Pod → Traefik 通过 K8s API Watch
  → 自动生成路由配置 → 热加载到路由表
  → 外部请求 → Traefik → 新后端 Pod
  → Pod 删除时自动摘除

Docker Provider:

# Docker Compose Labels 自动注册
services:
  web:
    image: nginx
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.web.rule=Host(`app.localhost`)"
      - "traefik.http.services.web.loadbalancer.server.port=80"
3 Traefik 的 Middleware 机制是如何工作的?

答案:

Middleware 是 Traefik 的核心扩展机制,以链式管道处理请求/响应。

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: security-headers
spec:
  headers:
    customFrameOptionsValue: "DENY"
    contentTypeNosniff: true
    browserXssFilter: true
    referrerPolicy: "strict-origin-when-cross-origin"
    permissionsPolicy: "camera=(), microphone=()"
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: secure-api
spec:
  entryPoints:
  - websecure
  routes:
  - match: Host(`api.example.com`)
    kind: Rule
    middlewares:
    - name: security-headers    # 中间件串联
    - name: rate-limit
    - name: auth
    services:
    - name: api-svc
      port: 8080

内置 Middleware 类别:

类别Middleware用途
安全headers, basicAuth, digestAuth, forwardAuth, ipWhiteList安全加固
流量rateLimit, circuitBreaker, inFlightReq流量控制
路由redirectScheme, redirectRegex, replacePath, stripPrefix路径处理
协议buffering缓冲配置
错误errorPage自定义错误页
压缩compress压缩

链式执行顺序:

请求 → Middleware-1 → Middleware-2 → Middleware-3 → Service
4 Traefik 如何实现自动 HTTPS 和 Let's Encrypt 集成?

答案:

Traefik 内置 ACME 协议支持,自动从 Let’s Encrypt 申请和续期证书。

# 静态配置
certificatesResolvers:
  letsencrypt:
    acme:
      email: admin@example.com
      storage: /acme/acme.json
      httpChallenge:
        entryPoint: web  # 使用 HTTP-01 挑战
# IngressRoute 引用证书解析器
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: tls-app
spec:
  entryPoints:
  - websecure
  routes:
  - match: Host(`app.example.com`)
    kind: Rule
    services:
    - name: app-svc
      port: 80
  tls:
    certResolver: letsencrypt

证书类型:

类型说明适用场景
HTTP-01HTTP 挑战,暴露文件默认,兼容性好
TLS-ALPN-01TLS 层挑战仅 443 端口
DNS-01DNS TXT 记录通配符证书
5 Traefik 如何支持 TCP/UDP 的四层负载均衡?

答案:

Traefik 通过 TCPService 和 UDPService 支持非 HTTP 的流量代理。

TCP 路由:

apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: mysql-tcp
spec:
  entryPoints:
  - mysql
  routes:
  - match: HostSNI(`*`)
    services:
    - name: mysql-svc
      port: 3306
# EntryPoint 需要事先定义
entryPoints:
  mysql:
    address: ":3306"

UDP 路由:

apiVersion: traefik.io/v1alpha1
kind: IngressRouteUDP
metadata:
  name: dns-udp
spec:
  entryPoints:
  - dns
  routes:
  - services:
    - name: coredns-svc
      port: 53
entryPoints:
  dns:
    address: ":53/udp"
6 Traefik 如何实现蓝绿部署和灰度发布?

答案:

Traefik 通过权重 Service 分发实现蓝绿部署和灰度。

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: app-routing
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`app.example.com`)
    kind: Rule
    services:
    - name: app-blue-svc
      port: 80
      weight: 90    # 90% 流量到蓝
    - name: app-green-svc
      port: 80
      weight: 10    # 10% 流量到绿

基于请求头的灰度:

spec:
  routes:
  - match: Host(`app.example.com`) && Headers(`X-Canary`, `true`)
    services:
    - name: app-canary-svc
      port: 80
  - match: Host(`app.example.com`)
    services:
    - name: app-stable-svc
      port: 80
7 Traefik 的 Dashboard 和监控功能?

答案:

Traefik 内置 Web Dashboard,提供实时路由和后端状态展示。

# 启用 Dashboard
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: dashboard
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`traefik.example.com`)
    kind: Rule
    services:
    - name: api@internal  # 内置 API
      kind: TraefikService
# 静态配置启用
api:
  dashboard: true
  debug: true

Prometheus 集成:

metrics:
  prometheus:
    addEntryPointsLabels: true
    addServicesLabels: true
    addRoutersLabels: true
# ServiceMonitor
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
spec:
  endpoints:
  - port: metrics
    path: /metrics
8 Traefik v2 和 v3 的核心区别是什么?

答案:

维度Traefik v2Traefik v3
Kubernetes CRDtraefik.containo.us/v1alpha1traefik.io/v1alpha1
Gateway API不支持原生支持
HTTP/3不支持原生支持
插件引擎Yaegi(Go)Wasm
配置格式混合 TOML/YAMLTOML/YAML
TLSACME v2ACME v2 + 自定义 CA
Middleware内置 + 插件内置 + 插件 + Wasm
9 Traefik 如何配置熔断(Circuit Breaker)?

答案:

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: cb-config
spec:
  circuitBreaker:
    expression: "NetworkErrorRatio() > 0.5 || LatencyAtQuantileMS(50) > 100"
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: resilient-api
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`api.example.com`)
    middlewares:
    - name: cb-config
    services:
    - name: api-svc
      port: 8080

可用表达式:

表达式说明
NetworkErrorRatio()网络错误率
LatencyAtQuantileMS(50)P50 延迟
ResponseCodeRatio(500, 600, 0, 600)500 错误比例
10 Traefik 与 ingress-nginx 的核心差异是什么?

答案:

维度Traefikingress-nginx
核心引擎Go(自定义)Nginx
配置热更新原生动态,无需 reload生成配置后 reload
服务发现Provider 原生Watch 后生成 nginx.conf
证书自动ACME 内置cert-manager 配合
中间件CRD 定义Annotation
Dashboard内置需部署
性能
生态容器原生Nginx 生态兼容
插件Wasm/YaegiLua
学习曲线低(熟悉 Nginx)

选型建议:

  • 需要自动服务发现和动态配置,选 Traefik
  • 团队熟悉 Nginx 运维,选 ingress-nginx
  • 需要内置 Dashboard 和 ACME,选 Traefik
11 Traefik 如何配置 Rate Limiting(速率限制)?

答案:

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: rate-limit
spec:
  rateLimit:
    period: "1m"         # 时间窗口
    average: 100         # 平均速率
    burst: 50            # 突发允许
    sourceCriterion:
      ipStrategy:
        depth: 1         # 使用 X-Forwarded-For 深度
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: limited-api
spec:
  entryPoints:
  - web
  routes:
  - kind: Rule
    match: Host(`api.example.com`)
    middlewares:
    - name: rate-limit
    services:
    - name: api-svc
      port: 8080

多维度限速: 支持基于 IP、请求头、Cookie 等的来源识别。

12 Traefik 如何处理跨域(CORS)?

答案:

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: cors
spec:
  headers:
    accessControlAllowOriginList:
    - "https://app.example.com"
    - "https://admin.example.com"
    accessControlAllowHeaders:
    - "Authorization"
    - "Content-Type"
    accessControlAllowMethods:
    - "GET"
    - "POST"
    - "PUT"
    - "DELETE"
    accessControlAllowCredentials: true
    accessControlMaxAge: 86400
13 Traefik 如何配置 Basic/Digest 认证?

答案:

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: basic-auth
spec:
  basicAuth:
    secret: auth-secret  # 包含 users 字段的 Secret
apiVersion: v1
kind: Secret
metadata:
  name: auth-secret
data:
  users: |
    $(echo -n "admin:$apr1$xxxxx" | base64)    
14 Traefik 如何实现 Forward Auth(外部认证)?

答案:

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: forward-auth
spec:
  forwardAuth:
    address: "https://auth.example.com/verify"
    trustForwardHeader: true
    authResponseHeaders:
    - X-Auth-User
    - X-Auth-Role
    tls:
      ca: "/certs/ca.pem"
    authRequestHeaders:
    - "Authorization"
15 Traefik 如何实现 IP 白名单?

答案:

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: ip-whitelist
spec:
  ipWhiteList:
    sourceRange:
    - "10.0.0.0/8"
    - "192.168.0.0/16"
    ipStrategy:
      depth: 2
      excludedIPs:
      - "10.0.0.1"
16 Traefik 如何处理重定向和路径重写?

答案:

# HTTP → HTTPS 重定向
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: redirect-https
spec:
  redirectScheme:
    scheme: https
    port: 443
# 路径前缀重写
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: strip-prefix
spec:
  stripPrefix:
    prefixes:
    - "/api"
# 正则重写
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: replace-path
spec:
  replacePathRegex:
    regex: "^/api/v1/(.*)"
    replacement: "/v1/$1"
17 Traefik 如何配置 WebSocket 支持?

答案:

Traefik 原生支持 WebSocket,无需额外配置。

# 直接路由到 WebSocket 后端
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: ws-route
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`ws.example.com`)
    services:
    - name: websocket-svc
      port: 8080
    serversTransport: websocket-transport
apiVersion: traefik.io/v1alpha1
kind: ServersTransport
metadata:
  name: websocket-transport
spec:
  forwardHeaders: true
  insecureSkipVerify: false

WebSocket 连接参数:

# 静态或动态配置
serversTransports:
  websocket:
    forwardHeaders: true
    maxIdleConnsPerHost: 200
    disableHTTP2: false
18 Traefik 如何处理 gRPC 流量?

答案:

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: grpc-route
spec:
  entryPoints:
  - websecure
  routes:
  - kind: Rule
    match: Host(`grpc.example.com`)
    services:
    - name: grpc-svc
      port: 50051
      scheme: h2c  # HTTP/2 Cleartext
  tls:
    certResolver: letsencrypt
19 Traefik 如何配置自定义错误页面?

答案:

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: custom-errors
spec:
  errors:
    status:
    - "404"
    - "503"
    service:
      name: error-pages-svc
      port: 80
    query: "/{status}.html"
20 Traefik 如何配置 Buffering(缓冲)?

答案:

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: buffer
spec:
  buffering:
    maxRequestBodyBytes: 10485760     # 10MB
    memRequestBodyBytes: 2097152      # 2MB 内存缓冲
    maxResponseBodyBytes: 10485760
    memResponseBodyBytes: 2097152
21 Traefik 如何实现请求镜像(Traffic Mirroring)?

答案:

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: mirror-api
spec:
  entryPoints:
  - web
  routes:
  - kind: Rule
    match: Host(`api.example.com`)
    services:
    - name: api-prod
      port: 8080
    mirroring:
      name: api-mirror
      percent: 10
      mirrors:
      - name: api-staging
        port: 8080
22 Traefik 的插件生态和开发方式?

答案:

Traefik 插件基于 Go 语言开发,通过 Yaegi 解释器或 Wasm 运行。

// plugin 开发示例
package middleware

import (
    "net/http"
)

type CustomMiddleware struct {
    next http.Handler
    name string
}

func New(ctx context.Context, next http.Handler, config *Config) (http.Handler, error) {
    return &CustomMiddleware{next: next, name: config.Name}, nil
}

func (a *CustomMiddleware) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
    req.Header.Set("X-Custom", a.name)
    a.next.ServeHTTP(rw, req)
}

插件部署:

# 静态配置
experimental:
  plugins:
    my-custom:
      moduleName: github.com/example/my-custom
      version: v0.1.0
23 Traefik 如何实现 Session Affinity(会话保持)?

答案:

apiVersion: traefik.io/v1alpha1
kind: TraefikService
metadata:
  name: sticky-api
spec:
  weighted:
    services:
    - name: api-svc
      port: 8080
      sticky:
        cookie:
          name: _affinity
          secure: true
          httpOnly: true
          sameSite: lax
24 Traefik 如何处理大文件上传?

答案:

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: upload-buffer
spec:
  buffering:
    maxRequestBodyBytes: 0             # 不限制
    memRequestBodyBytes: 4194304       # 4MB 内存缓冲
  headers:
    customRequestHeaders:
      X-Upload-Size: "10000000000"
25 Traefik 如何配置健康检查?

答案:

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: health-api
spec:
  entryPoints:
  - web
  routes:
  - kind: Rule
    match: Host(`api.example.com`)
    services:
    - name: api-svc
      port: 8080
      healthCheck:
        path: "/healthz"
        interval: "10s"
        timeout: "3s"
        healthyThreshold: 2
        unhealthyThreshold: 3
26 Traefik 如何处理多 TLS 证书 SNI 匹配?

答案:

Traefik 根据客户端 TLS 握手时的 SNI 自动匹配证书。

# 动态自动匹配
tls:
  stores:
    default:
      defaultCertificate:
        secretName: wildcard-example
  certificates:
  - secretName: app-example
  - secretName: admin-example
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: sni-route
spec:
  entryPoints:
  - websecure
  routes:
  - match: Host(`app.example.com`)
    services:
    - name: app-svc
      port: 80
  tls:
    domains:
    - main: example.com
      sans:
      - "*.example.com"
27 Traefik 和 Istio 的关系?

答案:

维度Traefik + Istio独立 Traefik
服务网格作为 Ingress Gateway独立反向代理
配置需配合 IstioIngressRoute CRD
东西向Istio Sidecar不支持
可观测性Istio + TraefikTraefik 内置
运维复杂度

建议:使用 Istio 时,Traefik 作为 Ingress Gateway 提供服务

28 Traefik 的配置类型(静态 vs 动态)的区别?

答案:

维度静态配置动态配置
配置方式CLI 参数 / 配置文件Provider / CRD
修改生效重启 Traefik实时热加载
配置内容EntryPoints、证书解析器、ProviderRouters、Services、Middleware
存储位置traefik.yaml 或 K8s ConfigMapK8s CRD / Consul / 文件
优先级最低(基础)覆盖静态默认值

静态配置示例:

# traefik.yaml
entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"
providers:
  kubernetesCRD:
    enabled: true
  kubernetesIngress:
    enabled: true
29 Traefik 如何配置多 Provider 共存?

答案:

providers:
  # K8s Provider(主配置来源)
  kubernetesCRD:
    enabled: true
    namespaces:
    - default
    - production
  
  # 文件 Provider(补充配置)
  file:
    filename: /dynamic/traefik-dynamic.yaml
    watch: true
  
  # Consul Provider
  consul:
    rootKey: traefik
    endpoints:
    - consul:8500
  
  # Docker Provider
  docker:
    endpoint: unix:///var/run/docker.sock
    exposedByDefault: false

多 Provider 合并规则: 所有 Provider 的配置合并后求最终集,同优先级下较早加载的 Provider 优先。

30 Traefik 的故障排查命令?

答案:

# 检查 Traefik 进程
kubectl logs -l app=traefik --tail=100

# 查看动态配置
traefik health --ping
traefik api --insecure --server localhost:8080/api/rawdata

# 查看路由表
curl -s http://localhost:8080/api/http/routers | jq .
curl -s http://localhost:8080/api/http/services | jq .

# 查看证书
curl -s http://localhost:8080/api/tls/certificates | jq .

# 配置 dump
traefik debug --dump

# 调试日志
# 静态配置开启
log:
  level: DEBUG
  filePath: /var/log/traefik/traefik.log