CloudFoundry 应用开放两个端口

CloudFoundry application opening two ports

我有一个打开两个端口的 CF 应用程序。 AFAIK CF 只能为其中之一创建路由 - 到位于 VCAP_APP_PORTPORT 中的路由。如何创建到第二个端口的路由?我不介意使用单独的名称指向其他端口。

Cloud Foundry 会将来自 80/443 的 TCP/WebSocket 流量路由到一个分配的端口。您的应用程序无法侦听任何其他端口。

https://docs.cloudfoundry.org/devguide/deploy-apps/prepare-to-deploy.html#ports

您可以创建多个 url 映射,或者让两个应用程序使用消息传递或数据库服务相互通信。

目前,Cloud Foundry 上的应用程序无法将两个端口映射到其容器环境中。作为新 Diego 运行时的一部分,多个端口映射已公开,但目前无法通过 API.

根据你的需要,你可以看看Lattice, which uses the Diego runtime. Some documentation can be found here

复活一个老问题,但现在 Cloud Foundry 支持这个问题。 2019 年 4 月左右添加了支持。请检查您的版本以查看是否支持此功能。

大致流程是:

  • 使用 cf cli 更新您的应用程序以列出它侦听的所有端口
  • 使用路由应使用的特定端口更新应用程序的每个路由。如果你有两个端口,你将需要两条或多条路线,每条路线一个端口。
  • 重启应用程序

现在您必须使用 cf curl 手动更新这些记录。说明可在此处找到:https://docs.cloudfoundry.org/devguide/custom-ports.html。希望未来的 cf cli 版本能让这更容易。

如其他一些评论所述,现在可以在 CF 中为您的应用程序使用多个端口。 CF 文档中有一个 chapter 描述了如何做。 我按照说明进行操作,但仍然难以完全理解它,这就是为什么我在这里提供了一步一步的指导和一些解释(将 [] 中的所有变量替换为实际值):

  1. 将您的应用程序配置为侦听多个端口。在我的例子中,我配置了一个 spring 引导应用程序来侦听端口 8080 上的 HTTPS 请求和端口 8081 上的 HTTP 请求(用于调用执行器端点,如 health/prometheus 所述,如 here 所述)。这意味着我已经在 CF 中配置了一个 TCP 路由和一个 HTTP 路由,并将这些路由映射到 CF 应用程序。
  2. 获取应该可以在多个端口上访问的 CF 应用程序的 [APP_GUID]: cf app [APP_NAME] --guid
  3. 将端口(例如 8080、8081)添加到 CF 应用程序:cf curl /v2/apps/[APP_GUID] -X PUT -d '{"ports": [8080, 8081]}'
  4. 现在还必须调整指向 CF 应用程序的路由(例如,在本例中为 HTTP 路由),以使其指向正确的 CF 应用程序端口。首先你需要获取路线信息,你可以用 cf curl /v2/routes?q=host:[HOST_NAME]cf curl /v2/apps/[APP_GUID]/routes 并保存指向您的应用程序的路线的 guid ([ROUTE_GUID])。
  5. 对于这条特定的路线,您必须调整路线映射。每个 CF 路由可以有多个路由映射。您可以使用此命令显示路由的当前路由映射:cf curl /v2/routes/[ROUTE_GUID]/route_mappings。使用 cf curl /v2/route_mappings -X POST -d '{"app_guid": "[APP_GUID]", "route_guid": "[ROUTE_GUID]", "app_port": 8081}' 您可以添加到路由的映射(例如,此处为 8081)。
  6. 该路由现在有两个映射,一个指向 8080,一个指向 8081。如果您希望该路由仅指向其中一个端口(例如 8081),则必须删除与您做的端口的映射不想拥有。 运行 cf curl /v2/routes/[ROUTE_GUID]/route_mappings 显示所有路由映射。然后提取应删除的路由映射的 guid(例如到端口 8080 的那个)。最后运行cf curl /v2/route_mappings/[GUID_ROUTE_MAPPING] -X DELETE删除不需要的路由映射

现在,当使用新配置的路由时,您的 CF 应用应该可以通过 8080 以外的其他端口访问。