Traefik 可以(也应该)在 Service Fabric 集群中以 "file" 模式使用吗?
Can (and should) Traefik be used in "file" mode in a Service Fabric cluster?
我正在研究在 Service Fabric 集群 运行 Docker 化的微服务中使用 Traefik 作为反向代理。 official way of running Traefik within Service Fabric is to use the Service Fabric provider. Running Traefik within a Docker container is not recommended according to the Github readme 因为您无法通过 localhost:19080 访问 Service Fabric API,而是必须通过其 public IP 访问它。这要求您安装 SSL 证书以安全地与 API 通信,这有点麻烦。
我很好奇使用 Traefix Service Fabric 提供程序(这需要复杂的设置)而不是仅 运行 容器中的 Traefix 运行 文件提供程序是否有任何优势。如果您的服务在 ApplicationManifest 中具有 ServiceDnsName
属性,从而允许 Service Fabric DNS 找到它们,这似乎是一种 更 更简单的方法。 Traefik 配置看起来像:
[frontends]
[frontends.api]
backend = "api"
passHostHeader = true
[frontends.api.routes.forwarder]
rule = "PathPrefixStrip: /api/"
[frontends.someservice]
backend = "someservice"
passHostHeader = true
[frontends.someservice.routes.forwarder]
rule = "PathPrefixStrip: /SomeService/"
[backends]
[backends.api]
[backends.api.servers.endpoint]
url = "http://Api:11080"
[backends.someservice]
[backends.someservice.servers.endpoint]
url = "http://SomeService:12080"
您将端口 80 映射到您的 Traefix 服务,然后它将根据 URL 前缀将 HTTP 调用分派到适当的内部服务。
优点:
- 无需与 Service Fabric API 对话,这在容器内完成 hacky。
- 可能更安全;一切都在内部,无需担心安装证书
缺点:
- 您的服务路由现在绑定到 Docker 容器中的 TOML 文件,而不是集成到服务和应用程序清单文件中。如果不重新部署该容器就无法修改它。
- 除非所有服务都 运行 在容器中,否则我认为这不会起作用(尽管我相信如果您启用了保留代理,您可以使用
http://localhost:19081/AppName/ServiceName
按名称解析服务)
对我来说,如果您不一直更改和添加服务,这似乎是一种更简洁的方法。通常,这些东西会保持相当静态。
有没有我没有考虑到的陷阱,或者有任何强烈反对这样做的理由?
我会把我的两分钱加到你的考虑中:
是动态和静态配置之间的偏好。
好处是每次服务出现 Traefik 配置时,它都会重新加载所有新配置。今天你说 "it won't change",但几个月、几周或几天后,你可能会面临一个新的需求,你必须更新文件,如果系统发展很快,比如微服务解决方案,你很快就会面临一个手动更新此文件的辛苦工作。
如果你确定它几乎不会改变,不要被Service Fabric配置或文件所限制,Traefik可以从REST , ETCD, DynamoDB and many other configuration providers获取配置来加载规则。
对于File方法,可以在Azure FileShare中创建文件,然后作为卷挂载到容器中,这样就不需要重建容器来生效了。
然后您只需更新文件即可:
- 重新启动容器以重新加载文件,或者。
- 更好的方法是使用
file.watch
设置,您不需要重新启动容器,它会监视文件中的任何更改。
我正在研究在 Service Fabric 集群 运行 Docker 化的微服务中使用 Traefik 作为反向代理。 official way of running Traefik within Service Fabric is to use the Service Fabric provider. Running Traefik within a Docker container is not recommended according to the Github readme 因为您无法通过 localhost:19080 访问 Service Fabric API,而是必须通过其 public IP 访问它。这要求您安装 SSL 证书以安全地与 API 通信,这有点麻烦。
我很好奇使用 Traefix Service Fabric 提供程序(这需要复杂的设置)而不是仅 运行 容器中的 Traefix 运行 文件提供程序是否有任何优势。如果您的服务在 ApplicationManifest 中具有 ServiceDnsName
属性,从而允许 Service Fabric DNS 找到它们,这似乎是一种 更 更简单的方法。 Traefik 配置看起来像:
[frontends]
[frontends.api]
backend = "api"
passHostHeader = true
[frontends.api.routes.forwarder]
rule = "PathPrefixStrip: /api/"
[frontends.someservice]
backend = "someservice"
passHostHeader = true
[frontends.someservice.routes.forwarder]
rule = "PathPrefixStrip: /SomeService/"
[backends]
[backends.api]
[backends.api.servers.endpoint]
url = "http://Api:11080"
[backends.someservice]
[backends.someservice.servers.endpoint]
url = "http://SomeService:12080"
您将端口 80 映射到您的 Traefix 服务,然后它将根据 URL 前缀将 HTTP 调用分派到适当的内部服务。
优点:
- 无需与 Service Fabric API 对话,这在容器内完成 hacky。
- 可能更安全;一切都在内部,无需担心安装证书
缺点:
- 您的服务路由现在绑定到 Docker 容器中的 TOML 文件,而不是集成到服务和应用程序清单文件中。如果不重新部署该容器就无法修改它。
- 除非所有服务都 运行 在容器中,否则我认为这不会起作用(尽管我相信如果您启用了保留代理,您可以使用
http://localhost:19081/AppName/ServiceName
按名称解析服务)
对我来说,如果您不一直更改和添加服务,这似乎是一种更简洁的方法。通常,这些东西会保持相当静态。
有没有我没有考虑到的陷阱,或者有任何强烈反对这样做的理由?
我会把我的两分钱加到你的考虑中:
是动态和静态配置之间的偏好。
好处是每次服务出现 Traefik 配置时,它都会重新加载所有新配置。今天你说 "it won't change",但几个月、几周或几天后,你可能会面临一个新的需求,你必须更新文件,如果系统发展很快,比如微服务解决方案,你很快就会面临一个手动更新此文件的辛苦工作。
如果你确定它几乎不会改变,不要被Service Fabric配置或文件所限制,Traefik可以从REST , ETCD, DynamoDB and many other configuration providers获取配置来加载规则。
对于File方法,可以在Azure FileShare中创建文件,然后作为卷挂载到容器中,这样就不需要重建容器来生效了。
然后您只需更新文件即可:
- 重新启动容器以重新加载文件,或者。
- 更好的方法是使用
file.watch
设置,您不需要重新启动容器,它会监视文件中的任何更改。