Traefik[1] 是一个现代的 HTTP 反向代理和负载均衡器,使部署微服务变得容易。
Traefik 可以与现有的多种基础设施组件(Docker、Swarm 模式、Kubernetes、Marathon、Consul、Etcd、Rancher、Amazon ECS...)集成,并自动和动态地配置自己。
系列文章:
•《Traefik 系列文章》[2]
实践中, 往往会有这样的需求, 用户输入的url是https://ewhisper.cn/alert-manager/#/alerts
, 但是转发到后端要变成http://alertmanager:9093/#/alerts
, 如何基于 Traefik on K8S 实现?
答案是: 使用 StripPrefixRegex MiddleWare.
直接创建如下的一个 MiddleWare:
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: strip-prefix-1
spec:
stripPrefixRegex:
regex:
- /[^/]+/
以上实现的功能就是去掉一层/<xxx>/
前缀.
去掉两层前缀也很简单:
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: strip-prefix-2
spec:
stripPrefixRegex:
regex:
- /[^/]+/[^/]+/
直接这样使用:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: alertmanager
spec:
routes:
- kind: Rule
match: Host(`ewhisper.cn`) && PathPrefix(`/alertmanager/`)
middlewares:
- name: strip-prefix-1
services:
- name: alertmanager
port: 9093
🎉🎉🎉 完成!
实践中,一个很常见的需求,用户输入的 url 是 ewhisper.cn/alert-manager, 如果什么都不做会返回 404, 需要自动加斜杠变成 ewhisper.cn/alert-manager/, 如何基于 Traefik on K8S 实现?
答案是:用 redirectRegex MiddleWare + 正则。
直接创建如下的 MiddleWare:
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: auto-add-slash
spec:
redirectRegex:
permanent: true
regex: ^(https?://[^/]+/[-a-z0-9_]+)$
replacement: ${1}/
📝说明如下:
正则匹配的内容为:
•^(https?
: 以 https 或 http 开头的内容;?
表示匹配前一个字符 0 或 1 次•[^/]+/
: 匹配 URL 第一个 /
之前的内容•[-a-z0-9_]+
: 匹配第一个 /
之后的内容,往往为字母数字和中划线及下划线
最终,^(https?://[^/]+/[-a-z0-9_]+) 该 group 匹配的内容示例如:https://ewhisper.cn/monitor-alertmanager, 并将其替换为:{1}/, 即将匹配的 group 后面加上 /, 示例如:https://ewhisper.cn/monitor-alertmanager
🐾 注意: 上面的 MiddleWare 可能无法适应所有的情况, 读者可以领会其要点, 并根据自己的需求做适当调整.
直接这样使用:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: alertmanager
spec:
routes:
- kind: Rule
match: Host(`ewhisper.cn`) && PathPrefix(`/alertmanager`)
middlewares:
- name: auto-add-slash
services:
- name: alertmanager
port: 9093
🎉🎉🎉 完成!
EOF
[1]
Traefik: https://traefik.io/
[2]
《Traefik 系列文章》: https://ewhisper.cn/tags/Traefik/