API & Dashboard
Traefik 通过 API 端点提供多种信息,例如路由器、服务、中间件等的配置。
仪表板集中展示 Traefik 当前处理的活动路由,并从此 API 获取数据。
安全性¶
不建议在生产环境中启用 API 和仪表板,因为这会暴露所有配置元素, 包括应仅限管理员访问的敏感数据。
在生产环境中,至少应通过认证和授权来保护它们。
提示
建议不要公开暴露 API 端口,将其限制在内部网络中 (即将最小权限原则应用到网络)。
配置示例¶
启用仪表板:
api: {}[api]--api=true暴露仪表板:
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard
spec:
routes:
- match: Host(`traefik.example.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))
kind: Rule
services:
- name: api@internal
kind: TraefikService
middlewares:
- name: auth
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: auth
spec:
basicAuth:
secret: secretName # Kubernetes secret named "secretName"# Create an IngressRoute for the dashboard
ingressRoute:
dashboard:
enabled: true
# Custom match rule with host domain
matchRule: Host(`traefik.example.com`)
entryPoints: ["websecure"]
# Add custom middlewares : authentication and redirection
middlewares:
- name: traefik-dashboard-auth
# Create the custom middlewares used by the IngressRoute dashboard (can also be created in another way).
# /!\ Yes, you need to replace "changeme" password with a better one. /!\
extraObjects:
- apiVersion: v1
kind: Secret
metadata:
name: traefik-dashboard-auth-secret
type: kubernetes.io/basic-auth
stringData:
username: admin
password: changeme
- apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: traefik-dashboard-auth
spec:
basicAuth:
secret: traefik-dashboard-auth-secret# Dynamic Configuration
labels:
- "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=test:$$apr1$$H6uskkkW$$IgXLP6ewTrSuBkTrqE8wj/,test2:$$apr1$$d9hr9HBB$$4HxwgUir3HP4EsggP/QNo0"# Dynamic Configuration
deploy:
labels:
- "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=test:$$apr1$$H6uskkkW$$IgXLP6ewTrSuBkTrqE8wj/,test2:$$apr1$$d9hr9HBB$$4HxwgUir3HP4EsggP/QNo0"
# Dummy service for Swarm port detection. The port can be any valid integer value.
- "traefik.http.services.dummy-svc.loadbalancer.server.port=9999"# Dynamic Configuration
- "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=test:$$apr1$$H6uskkkW$$IgXLP6ewTrSuBkTrqE8wj/,test2:$$apr1$$d9hr9HBB$$4HxwgUir3HP4EsggP/QNo0"# Dynamic Configuration
http:
routers:
dashboard:
rule: Host(`traefik.example.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))
service: api@internal
middlewares:
- auth
middlewares:
auth:
basicAuth:
users:
- "test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"
- "test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0"# Dynamic Configuration
[http.routers.my-api]
rule = "Host(`traefik.example.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
service = "api@internal"
middlewares = ["auth"]
[http.middlewares.auth.basicAuth]
users = [
"test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/",
"test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0",
]配置选项¶
可通过以下方式配置 API 和仪表板:
- 在 Helm Chart 中:可在此处找到自定义 Traefik 安装、 启用仪表板的选项。
- 在 Traefik 静态配置中,具体如下。
| 字段 | 说明 | 默认值 | 必填 |
|---|---|---|---|
api |
启用 API/仪表板。设为 true 时,其子选项 api.dashboard 也会设为 true。 |
false | 否 |
| api.basePath | 定义 API 和仪表板对外提供访问的基础路径。 请注意,此选项与不安全模式不兼容。 |
/ | 否 |
api.dashboard |
启用仪表板。 | true | 否 |
api.debug |
启用用于调试和性能分析的额外端点。 | false | 否 |
api.disableDashboardAd |
禁用仪表板中的广告。 | false | 否 |
api.insecure |
在名为 traefik 的入口点上启用 API 和仪表板。 请注意,此模式与自定义 API 基础路径选项不兼容。 |
false | 否 |
端点¶
以下所有端点都必须通过 HTTP GET 请求访问。
基础路径配置
默认情况下,Traefik 在 / 基础路径下暴露 API 和仪表板。可以通过 api.basePath 配置此路径。配置后,所有端点(api、dashboard、debug)都使用该路径。
仪表板¶
仪表板默认通过 /dashboard/ 路径访问。
说明
/dashboard/中末尾的斜杠/是必需的。可以使用 RedirectRegex 中间件缓解这一限制。- 此外,路径
/会重定向到/dashboard/,但不应依赖此行为,因为它可能发生变化,也可能使路由规则变复杂。
如上文安全性一节所述,必须保护仪表板和 API 的访问。
需要在 Traefik 中定义路由配置。
这需要设置附加到 api@internal 服务的路由器,以便:
-
使用中间件实现安全功能,例如认证(basicAuth、digestAuth、 forwardAuth)或允许列表。
-
定义通过 Traefik 访问仪表板的路由器规则。
仪表板路由器规则¶
为确保正确访问仪表板,定义的路由器规则必须匹配针对 /api 和 /dashboard 路径的请求。
建议使用基于 Host 的规则匹配目标域名上的所有请求,或显式定义同时包含两个路径前缀的规则。
以下是一些示例:
# The dashboard can be accessed on http://traefik.example.com/dashboard/
rule = "Host(`traefik.example.com`)"# The dashboard can be accessed on http://example.com/dashboard/ or http://traefik.example.com/dashboard/
rule = "PathPrefix(`/api`) || PathPrefix(`/dashboard`)"# The dashboard can be accessed on http://traefik.example.com/dashboard/
rule = "Host(`traefik.example.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"在生产环境使用 Traefik OSS?
如果你在工作中使用 Traefik,可以考虑为 Traefik OSS 增加企业级 API 网关能力或商业支持。
为 Traefik OSS 增加 API 网关能力快捷且平滑,无需推倒重来,现有配置也会完整保留。请通过这个简短视频了解实际效果。