实现此目的的一种方法是使用文件提供程序并创建指向 API 服务器节点的静态设置;像这样的东西(未经测试)
[file]
[backends]
[backends.backend1]
[backends.backend1.servers]
[backends.backend1.servers.server1]
url = "http://apiserver1:80"
weight = 1
[backends.backend1.servers.server2]
url = "http://apiserver2:80"
weight = 1
[backends.backend1.servers.server3]
url = "http://apiserver3:80"
weight = 1
[frontends]
[frontends.frontend1]
entryPoints = ["http"]
backend = "backend1"
passHostHeader = true
[frontends.frontend1.routes]
[frontends.frontend1.routes.route1]
rule = "Host:apiserver"
(这假设一个简单的仅 HTTP 设置;HTTPS 需要一些额外的设置。)
当 Traefik 被赋予这条配置(以及您需要通过 TOML 文件或 CLI 参数执行的任何其他操作)时,它将在三个节点上使用apiserver Host 标头循环请求。
另一个至少潜在的选择是创建一个服务对象来捕获您的 API 服务器节点和另一个引用该服务的 Ingress 对象并将所需的 URL 路径和主机映射到您的 API 服务器。这将为您提供更大的灵活性,因为服务应自动调整您的 API 服务器的更改,当滚动升级之类的事情开始发挥作用时,这可能会很有趣。一个令人恼火的地方可能是 Traefik 需要与 API 服务器对话以处理入口和服务(以及端点,就此而言),如果 API 服务器不可用,它就不能这样做。您可能需要某种 HA 设置或愿意维持某种不可用状态。(FWIW,Traefik 应该自己从临时停机中恢复。)
是否要在集群内或集群外运行 Traefik 取决于您。如果您想处理 API 对象,则前者肯定更容易设置,因为您不必传递 API 服务器配置参数,但如果您想沿着 Ingress/Service 路线走,则需要应用关于 API 服务器连接性的相同限制。使用文件提供程序方法,您无需担心这一点——完全可以在 Kubernetes 内部运行 Traefik,而无需使用 Kubernetes 提供程序。