【问题标题】:How can I copy a string from a vendor app in one Kubernetes pod to a vendor app in another pod?如何将字符串从一个 Kubernetes pod 中的供应商应用程序复制到另一个 pod 中的供应商应用程序?
【发布时间】:2020-04-25 03:52:26
【问题描述】:

我有一组供应商提供的容器,它们协同工作以提供服务,我们称它们为 A、B 和 C - Kubernetes 集群在单独的 pod 中运行每个容器。

  • 容器 A 是一个前端 Nginx 容器,主要将内容转发到容器 B。前端允许您注册一个帐户,这实际上是一个转发到容器 B 的 API 调用。
  • 容器 B 是后端 - 它有一个专有的内存数据库,并将帐户存储在那里。创建帐户时,还会创建和存储安全令牌。 (用户可以通过 A 的 API 调用检索该令牌。)
  • 容器 C 是连接集群外部某些东西的桥梁。但至关重要的是,您使用环境变量对其进行配置,该变量包含来自存储在容器 B 中的用户帐户的有效安全令牌。C 使用该令牌通过 A 与 B 对话。

理想情况下,我想一次性部署所有这些 - 这意味着我需要在容器 B 中创建一个帐户(通过调用 A),然后将该值放入 C 的环境变量中。

一些想法:

  • 我无法使用初始化容器来 SQL 插入新用户,因为数据库未公开。
  • 我可以在供应商容器之上构建容器来编辑配置/脚本等,但替换二进制文件可能超出了范围。
  • 我可以差不多通过 A 到 B 编写后端 API 脚本。但是,它使用在请求之间持续存在的 XSRF 令牌等具有挑战性。对于最简单的工具/库的任何建议使用来实现这一点是受欢迎的。
  • 如果我为帐户创建编写脚本,我需要将该令牌放入容器 C 的部署中 - 我可以使用 ConfigMap,但是我需要调用 Kube API 从集群内修改 ConfigMap ,这对我来说似乎不是一个好主意。

对我来说,唯一可行的解​​决方案是在 C 上放置一个 initContainer,它将向 B(通过 A)查询安全令牌,然后将其写入共享卷。然后我将在容器 C 之上构建以从共享卷中读取,将环境变量设置为容器内部并启动供应商的进程。但是我必须管理用户帐户的机密。

这种方法有什么改进,或者我没有考虑过什么完全不同的地方吗?

【问题讨论】:

    标签: kubernetes vendor


    【解决方案1】:

    从容器内部执行 API 操作不是反模式。在 C 上阻止您的进程启动,直到 initContainer 运行并更新包含令牌的 Secret。不要使用ConfigMap 作为秘密; Secret 对象存在用于这些目的,您可以将Secret 拉入PodSpec - 作为环境变量或卷安装 - 与拉动ConfigMap 的方式相同(有一些小的语法变化)。

    我可以看到您可能遇到的唯一麻烦是您将处理多个副本,因此您可能希望随机化一些 Secret 名称。在initContainer 中创建它,在文件系统中传递随机名称,因为Pods 共享一个文件系统,然后在主容器中使用它并在设置环境变量或挂载后删除SecretSecretsConfigMaps 可以在 Pod 启动后消失,而不会影响它们在 Pod 中的存在。

    您可能还需要某种方式来清理用户帐户,因为您实际上是在每次副本启动时创建一个新用户并且没有机会删除它。 CronJob 可能是前进的方向 - 列出与您的命名约定匹配的用户帐户,然后重新启动部署并删除您在重新启动之前获取的列表中的帐户。这样您就不会在任何活动的副本上拉扯地毯。

    【讨论】:

    • 好吧,如果我的 initContainer 只是查询令牌而不是创建一个新的,我就不需要删除帐户。但要明确一点 - 我可以在 initContainer 中创建一个 Secret,但我无法在主容器的规范中引用它,对吗?因为当我写那个和 pod 启动时它不存在......所以我也需要通过 API 来使用它,不是吗?
    • 是的,你必须这样做。它确实感觉有点像叠叠乐游戏。我想知道etcd 实例是否是传递数据的更好方法。
    猜你喜欢
    • 2022-06-16
    • 2022-10-17
    • 2019-10-30
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多