Skip to content

高级教程

在 Kubernetes 上使用 Traefik 暴露服务 — 高级

本指南基于基础指南中的概念和设置。确保你在继续之前已经完成了基础指南,并有可工作的 Traefik Kubernetes 设置。

在高级指南中,你将学习如何增强你的 Traefik 部署,包括:

  • 中间件:用于安全头和访问控制
  • Let's Encrypt(用于 IngressRoute):用于自动化证书管理
  • cert-manager(用于 Gateway API):用于自动化证书管理
  • 粘性会话:用于有状态应用程序
  • 多层路由(仅 IngressRoute):用于基于复杂认证的层级路由
  • 服务中间件:在服务级别应用中间件

前置条件

  • 已完成 基础指南
  • 已安装 Traefik Proxy 的 Kubernetes 集群
  • kubectl 配置为与你的集群交互
  • 基础指南中的工作 Traefik 设置

添加中间件

创建中间件

yaml
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: secure-headers
  namespace: default
spec:
  headers:
    frameDeny: true
    sslRedirect: true
    browserXssFilter: true
    contentTypeNosniff: true
    stsIncludeSubdomains: true
    stsPreload: true
    stsSeconds: 31536000
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: ip-allowlist
  namespace: default
spec:
  ipAllowList:
    sourceRange:
      - "127.0.0.1/32"
      - "192.168.0.0/16"
      - "10.0.0.0/8"

将中间件附加到路由

更新 IngressRoute:

yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: whoami
  namespace: default
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`whoami.example.com`)
      kind: Rule
      services:
        - name: whoami
          port: 80
      middlewares:
        - name: secure-headers
        - name: ip-allowlist
  tls:
    certResolver: letsencrypt

Let's Encrypt 自动化证书

要使用 Let's Encrypt 自动获取证书,添加 ACME 证书解析器(仅适用于 IngressRoute):

yaml
# values.yaml
additionalArguments:
  - "[email protected]"
  - "--certificatesresolvers.letsencrypt.acme.storage=/data/acme.json"
  - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"

cert-manager 自动化证书(Gateway API)

Traefik Hub 的内置 ACME 不支持 Gateway API。使用 cert-manager:

bash
# 安装 cert-manager
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.2/cert-manager.yaml

创建 ClusterIssuer:

yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: [email protected]
    privateKeySecretRef:
      name: letsencrypt-account-key
    solvers:
      - http01:
          ingress:
            class: traefik

粘性会话

更新 IngressRoute:

yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: whoami
  namespace: default
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`whoami.example.com`)
      kind: Rule
      services:
        - name: whoami
          port: 80
          sticky:
            cookie:
              name: session_id
              httpOnly: true
              secure: true

多层路由

多层路由允许多层级的路由和中间件。父路由器处理认证和添加用户上下文,子路由器基于用户上下文路由到不同的服务:

yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: api-parent
  namespace: default
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`api.example.com`)
      kind: Rule
      services: []  # 父路由器不需要服务
      middlewares:
        - name: auth-middleware
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: api-admin
  namespace: default
spec:
  routes:
    - match: Host(`api.example.com`) && HeadersRegexp(`X-User-Role`, `admin`)
      kind: Rule
      parentRefs:
        - name: api-parent
        - namespace: default
      services:
        - name: admin-service
          port: 80

服务中间件

服务中间件应用于该服务处理的所有请求:

yaml
apiVersion: traefik.io/v1alpha1
kind: ServersTransport
metadata:
  name: mytransport
  namespace: default
spec:
  forwardingTimeouts:
    dialTimeout: 30s
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: whoami
  namespace: default
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`whoami.example.com`)
      kind: Rule
      services:
        - name: whoami
          port: 80
          serversTransport: mytransport

适用场景

  • 生产环境配置:完整的安全、认证、限流
  • HTTPS 自动管理:使用 Let's Encrypt 或 cert-manager
  • 有状态应用:购物车、登录会话
  • 基于角色的访问:多层路由

在生产环境使用 Traefik OSS?

如果你在工作中使用 Traefik,可以考虑为其添加企业级 API 网关能力或获取 Traefik OSS 的商业支持。

基于 MIT 协议发布