中间件¶
调整请求
中间件被附件到路由上,是一种在请求发送到你的 服务 之前(或者在服务的响应发送到客户端之前)调整请求的一种方法。
Traefik 内置了许多不同功能的中间件,其中一些可以修改请求,头信息,一些负责重定向,一些添加身份验证等等。
中间件可以通过链式组合的方式来适用各种情况。
配置示例¶
# 通过 Docker 标签
whoami:
# 暴露一个 API 来显示他的 IP 地址的一个容器
image: containous/whoami
labels:
# 创建一个名为 `foo-add-prefix` 的中间件
- "traefik.http.middlewares.foo-add-prefix.addprefix.prefix=/foo"
# 将上面的`foo-add-prefix`中间件添加到名为`router1`的路由上
- "traefik.http.routers.router1.middlewares=foo-add-prefix@docker"
# 通过 Kubernetes IngressRoute 对象
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: middlewares.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: Middleware
plural: middlewares
singular: middleware
scope: Namespaced
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: stripprefix
spec:
stripPrefix:
prefixes:
- /stripit
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ingressroute
spec:
# 更多属性...
routes:
# 更多属性...
middlewares:
- name: stripprefix
# 通过 TOML 配置文件配置
[http.routers]
[http.routers.router1]
service = "myService"
middlewares = ["foo-add-prefix"]
rule = "Host(`example.com`)"
[http.middlewares]
[http.middlewares.foo-add-prefix.addPrefix]
prefix = "/foo"
[http.services]
[http.services.service1]
[http.services.service1.loadBalancer]
[[http.services.service1.loadBalancer.servers]]
url = "http://127.0.0.1:80"
# 通过 YAML 配置文件配置
http:
routers:
router1:
service: myService
middlewares:
- "foo-add-prefix"
rule: "Host(`example.com`)"
middlewares:
foo-add-prefix:
addPrefix:
prefix: "/foo"
services:
service1:
loadBalancer:
servers:
- url: "http://127.0.0.1:80"
Provider 命名空间¶
当你声明一个中间件时,它位于其 provider 的命名空间下面。例如,如果你适用 Docker 标签来声明中间件,那么该中间件将位于 docker provider 的命名空间下面。
如果你使用多个 providers,并且希望引用在另一个 provider 中声明的中间件(又称为跨 provider 的中间件),则必须在中间件名称后加上 @
分隔符,然后再加上 provider 的名称。
<resource-name>@<provider-name>
Kubernetes 命名空间
由于 Kubernetes 也有其自己的命名空间的概念,但是和这里的 provider 命名空间
是不一样的,因此不要混淆了。
在跨 provider 使用的上下文中使用带有 Kubernetes 命名空间
的资源,这种情况下,由于中间件的定义不在 Kubernetes 中,所以在引用资源时指定 Kubernetes 命名空间
是没有任何意义的,所以即使存在该规范也会忽略的。
引用其他 Provider 的中间件
在 file provider 下面声明 add-foo-prefix。
[http.middlewares]
[http.middlewares.add-foo-prefix.addPrefix]
prefix = "/foo"
http:
middlewares:
add-foo-prefix:
addPrefix:
prefix: "/foo"
从其他 providers 下面使用 add-foo-prefix 中间件:
your-container: #
image: your-docker-image
labels:
# 添加 add-foo-prefix@file 中间件 (在上面 file provider 中声明的)
- "traefik.http.routers.my-container.middlewares=add-foo-prefix@file"
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ingressroutestripprefix
spec:
entryPoints:
- web
routes:
- match: Host(`bar.com`)
kind: Rule
services:
- name: whoami
port: 80
middlewares:
- name: add-foo-prefix@file
# namespace: bar
# 当使用跨 proivider 这种语法的时候,类似于上面这里使用的 bar 这个命名空间将被忽略
可用中间件列表¶
中间件 | 用途 | 范围 |
---|---|---|
AddPrefix | 添加一个 Path 前缀 | Path 修改器 |
BasicAuth | Basic auth 认证机制 | 安全, 认证 |
Buffering | 缓冲 request/response | 请求生命周期 |
Chain | 结合多个中间件 | 中间件工具 |
CircuitBreaker | 停止调用不健康的服务 | 请求生命周期 |
Compress | 压缩 response 响应 | 内容修改器 |
DigestAuth | 添加 Digest 身份验证 | 安全, 认证 |
Errors | 自定义错误页面 | 请求生命周期 |
ForwardAuth | 认证委托 | 安全, 认证 |
Headers | 添加/更新 头信息 | 安全 |
IPWhiteList | 现在允许的客户端 IP | 安全, 请求生命周期 |
InFlightReq | 限制同时连接的数量 | 安全, 请求生命周期 |
PassTLSClientCert | 在 Header 里面添加客户端证书 | 安全 |
RateLimit | 限制调用频率 | 安全, 请求生命周期 |
RedirectScheme | 客户端重定向 | 请求生命周期 |
RedirectRegex | 客户端重定向 | 请求生命周期 |
ReplacePath | 更改请求的 path 路径 | Path 修改器 |
ReplacePathRegex | 更改请求的 path 路径 | Path 修改器 |
Retry | 出现错误时自动重试请求 | 请求生命周期 |
StripPrefix | 更改请求的 path 路径 | Path 修改器 |
StripPrefixRegex | 更改请求的 path 路径 | Path 修改器 |