【问题标题】:How to mount a file via CloudFoundry manifest similar to Kubernetes?如何通过类似于 Kubernetes 的 CloudFoundry 清单挂载文件?
【发布时间】:2021-11-11 00:18:06
【问题描述】:

使用 Kubernetes,我曾经挂载一个包含特征标志作为键/值对的文件。然后,我们的 UI 将简单地获取文件并读取值。

像这样:What's the best way to share/mount one file into a pod?

现在我想对 CloudFoundry 的清单文件做同样的事情。如何挂载文件以便在部署时在/dist 文件夹中可用?

添加更多信息,当我们挂载文件时,UI 稍后可以下载文件并读取内容。我们使用的是React,任何对服务器的调用都必须经过Apigee层。

【问题讨论】:

    标签: cloud-foundry mounted-volumes


    【解决方案1】:

    将文件挂载到 CloudFoundry 应用程序的典型方法称为Volume Services。这需要一个远程文件系统(如 NFS 或 SMB)并将其挂载到您的应用程序容器中。

    我认为这不是你想要的。挂载在单个文件中可能会过大。不过你完全可以走这条路。

    也就是说,CloudFoundry 没有类似于 Kubernetes 的内置概念,您可以在其中获取配置并将其挂载为文件。使用 CloudFoundry,您确实有一些类似的选择。但它们并不完全相同,因此您必须确定一个是否适合您的需求。

    1. 您可以通过环境变量传递配置(或通过用户提供的服务绑定,但也可以通过环境变量VCAP_SERVICES)。这不会是一个文件,但也许您可以让您的 UI 读取它(您没有提到 UI 如何获取该文件,所以我无法进一步评论。如果您详细说明这一点,例如它是 HTTP 还是从磁盘读取,我也许可以扩展这个选项)。

      如果它绝对需要是一个文件,您的应用程序可以在启动时读取环境变量内容并将其写入磁盘。如果您的应用程序无法像使用 Nginx 那样执行此操作,则可以在应用程序的根目录中包含一个 .profile 脚本,该脚本读取并生成文件。例如:echo "$CFG_VAR" > /dist/file 或生成该文件所需的任何操作。

      使用环境变量时的一些注意事项。它们中可以包含多少信息是有限制的(抱歉,我不知道我脑海中的确切值,但我认为它大约是 128K)。它也不适用于二进制配置,在这种情况下,您需要先对数据进行 base64 编码。

    2. 您可以从配置服务器中提取配置文件并将其缓存在本地。这可以很简单。您的应用程序启动时要做的第一件事就是伸出手并下载文件,将其放在磁盘上,该文件将在您的应用程序生命周期内一直存在。

      如果您没有运行 Nginx 的服务器端应用程序,您可以在应用程序的根目录中包含一个 .profile 脚本(可以是任何可执行脚本),该脚本可以使用 curl 或另一个用于下载和设置该配置的工具。

      您可以将“配置服务器”替换为 HTTP 服务器、Git 存储库、Vault 服务器、CredHub、数据库或任何可以持久存储数据的地方。

    3. 不推荐,但您也可以使用应用程序推送您的配置文件。这就像将它包含在您推送的目录或存档中一样简单。这具有将您的配置耦合到您推送的应用程序位的明显缺点。取决于您的工作地点、您必须遵守的政策以及您使用的工具可能很重要,也可能无关紧要。

    您可能还可以使用其他变体。在应用程序启动时或通过.profile 脚本在应用程序中加载文件非常灵活。

    【讨论】:

    • 感谢您的详尽回答。我已经用更多细节更新了我的问题。我们可以下载文件并使用 Javascript 读取内容。您能否详细说明.profile。这是否意味着如果我在由 Web 服务器提供服务的 /dist 文件夹中有一个名为 .profile 的脚本,它将在启动时运行该脚本?在这种情况下,这不是安全风险吗?除非您的意思是 .profile 在容器中的其他位置,在这种情况下,我的问题是,我们如何使用 CloudFoundry 做到这一点?
    • .profile 是您放在应用程序根目录中的脚本,即您使用cf push 的目录或您使用cf push -p some/dir 引用的目录。如果此文件存在,它将在您的应用程序启动之前执行。它在应用程序容器中运行,并且作为应用程序的用户,它没有提升/root 权限。因为它不能做超出您的应用程序可以做的任何事情,所以它不被视为安全责任。它通常用于执行动态设置。它需要快速运行,因为它会阻止您的应用程序启动。如果时间过长,应用程序将失败。
    • 非常感谢!
    猜你喜欢
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2020-06-14
    • 2019-01-15
    • 2017-11-26
    • 1970-01-01
    • 2019-03-06
    相关资源
    最近更新 更多