在单个服务器上使用 Kamal 部署多个项目时,每个项目都会启动一个独立的 Traefik 实例?能不能让多个项目共享一个 Traefik 实例?有没有过来人分享一下。
单个服务器本来就一个 Traefik 容器,你只要将你的 App Containers 的一些 LABEL 配置好,Traefik 就能自动依据规则做反向代理
Container 1
traefik.http.routers.web.rule: Host(`a.com`) && PathPrefix(`/`)
traefik.http.routers.web.entrypoints: websecure
Container 2
traefik.http.routers.web.rule: Host(`b.com`) && PathPrefix(`/`)
traefik.http.routers.web.entrypoints: websecure
其实你实操一下,看看源代码就很清楚了 https://github.com/basecamp/kamal/blob/main/lib/kamal/cli/traefik.rb#L7,代码还蛮清晰的。
挺简单的,官网有式例
labels:
traefik.http.routers.hey-web.rule: Host(`app.hey.com`)
第一个项目可以执行 kamal setup
第二个项目要自己推送 kamal env push && kamal deploy
第二个项目里怎么关闭 traefik 呢?每次kamal deploy
的时候不得重新部署一遍 traefik 吗?另外这样写的话后面的项目配置是不都得写到第一个项目里?
首先同一台服务器只会启动一个 traefik 容器,所以第二个项目kamal deploy
的时候会发现已经有了,不会去触碰它。而且因为只会有一个实例,所以两个项目上的 traefik 配置应该是一致的,如果不一致那说明你的部署方案是欠考虑的。
至于 App Containers,则是通过 App Container 本身的 label 去配置中间件,路由规则等,Traefik 会自动发现 (detect) 这些信息,然后正确地做反向代理和负载均衡。