高级教程
在 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: letsencryptLet'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 的商业支持。