如何将字符串从一个 Kubernetes pod 中的供应商应用程序复制到另一个 pod 中的供应商应用程序?
How can I copy a string from a vendor app in one Kubernetes pod to a vendor app in another pod?
我有一组供应商提供的容器,它们协同工作以提供服务,我们称它们为 A、B 和 C - Kubernetes 集群分别运行每个容器中的一个,pods。
- 容器 A 是一个前端 Nginx 容器,主要将内容转发到容器 B。前端允许您注册一个帐户,这实际上是一个 API 调用转发到容器 B。
- 容器 B 是后端 - 它有一个专有的内存数据库,并将帐户存储在那里。创建帐户时,也会创建并存储安全令牌。 (用户可以通过 A 调用 API 来检索该令牌。)
- 容器 C 是通往集群外部某些东西的桥梁。但至关重要的是,您使用包含容器 B 中存储的用户帐户的有效安全令牌的环境变量对其进行配置。C 使用该令牌通过 A 与 B 通信。
理想情况下,我想一次性部署所有这些——这意味着我需要以某种方式在容器 B 中创建一个帐户(通过调用 A),然后将该值放入 C 的环境变量中。
一些想法:
- 我无法使用初始化容器 SQL 插入新用户,因为数据库未公开。
- 我可以在供应商容器之上构建容器以编辑 config/scripts 等,但替换二进制文件可能超出范围。
- 我可以几乎通过A到B编写后端API脚本。但是,它具有挑战性,因为它使用在请求之间持续存在的XSRF令牌等。欢迎使用最简单的 tools/libraries 来实现这一点。
- 如果我编写帐户创建脚本,那么我需要将该令牌放入容器 C 的部署中 - 我可以使用 ConfigMap,但随后我需要调用 Kube API 进行修改集群中的 ConfigMap,这对我来说似乎不是个好主意。
对我来说,唯一可行的解决方案是在 C 上放置一个 initContainer,它将向 B(通过 A)查询安全令牌,然后将其写入共享卷。然后我将在容器 C 之上构建以从共享卷中读取,将环境变量设置为容器内部并启动供应商的进程。但是我必须管理用户帐户的秘密。
该方法是否有任何改进,或者我没有考虑过的完全不同的地方?
从容器内部执行 API 操作不是反模式。阻止在 C 上启动进程,直到 initContainer
运行并更新包含令牌的 Secret
。不要使用 ConfigMap
作为机密; Secret
对象的存在就是为了这些目的,您可以将 Secret
拉入 PodSpec
- 作为环境变量或卷安装 - 与拉动 ConfigMap
的方式相同(有一些小的语法变化)。
我认为您可能 运行 遇到的唯一麻烦是您将处理多个副本,因此您可能希望随机化某些 Secret
名称。在 initContainer
中创建它,在文件系统中传递随机名称,因为 Pods
共享一个文件系统,然后在主容器中使用它并在 env var 或 mount 获取后删除 Secret
设置。 Secrets
和 ConfigMaps
可以在 Pod
启动后消失,而不影响它们在 Pod
.
中的存在
您可能还需要一些清理用户帐户的方法,因为每次副本启动时您实际上都在创建一个新用户,并且没有机会删除它。 CronJob
可能是前进的方向 - 列出符合您的命名约定的用户帐户,然后重新启动部署并删除您在重新启动之前获取的列表中的帐户。这样你就不会在任何活跃的副本上拉扯地毯。
我有一组供应商提供的容器,它们协同工作以提供服务,我们称它们为 A、B 和 C - Kubernetes 集群分别运行每个容器中的一个,pods。
- 容器 A 是一个前端 Nginx 容器,主要将内容转发到容器 B。前端允许您注册一个帐户,这实际上是一个 API 调用转发到容器 B。
- 容器 B 是后端 - 它有一个专有的内存数据库,并将帐户存储在那里。创建帐户时,也会创建并存储安全令牌。 (用户可以通过 A 调用 API 来检索该令牌。)
- 容器 C 是通往集群外部某些东西的桥梁。但至关重要的是,您使用包含容器 B 中存储的用户帐户的有效安全令牌的环境变量对其进行配置。C 使用该令牌通过 A 与 B 通信。
理想情况下,我想一次性部署所有这些——这意味着我需要以某种方式在容器 B 中创建一个帐户(通过调用 A),然后将该值放入 C 的环境变量中。
一些想法:
- 我无法使用初始化容器 SQL 插入新用户,因为数据库未公开。
- 我可以在供应商容器之上构建容器以编辑 config/scripts 等,但替换二进制文件可能超出范围。
- 我可以几乎通过A到B编写后端API脚本。但是,它具有挑战性,因为它使用在请求之间持续存在的XSRF令牌等。欢迎使用最简单的 tools/libraries 来实现这一点。
- 如果我编写帐户创建脚本,那么我需要将该令牌放入容器 C 的部署中 - 我可以使用 ConfigMap,但随后我需要调用 Kube API 进行修改集群中的 ConfigMap,这对我来说似乎不是个好主意。
对我来说,唯一可行的解决方案是在 C 上放置一个 initContainer,它将向 B(通过 A)查询安全令牌,然后将其写入共享卷。然后我将在容器 C 之上构建以从共享卷中读取,将环境变量设置为容器内部并启动供应商的进程。但是我必须管理用户帐户的秘密。
该方法是否有任何改进,或者我没有考虑过的完全不同的地方?
从容器内部执行 API 操作不是反模式。阻止在 C 上启动进程,直到 initContainer
运行并更新包含令牌的 Secret
。不要使用 ConfigMap
作为机密; Secret
对象的存在就是为了这些目的,您可以将 Secret
拉入 PodSpec
- 作为环境变量或卷安装 - 与拉动 ConfigMap
的方式相同(有一些小的语法变化)。
我认为您可能 运行 遇到的唯一麻烦是您将处理多个副本,因此您可能希望随机化某些 Secret
名称。在 initContainer
中创建它,在文件系统中传递随机名称,因为 Pods
共享一个文件系统,然后在主容器中使用它并在 env var 或 mount 获取后删除 Secret
设置。 Secrets
和 ConfigMaps
可以在 Pod
启动后消失,而不影响它们在 Pod
.
您可能还需要一些清理用户帐户的方法,因为每次副本启动时您实际上都在创建一个新用户,并且没有机会删除它。 CronJob
可能是前进的方向 - 列出符合您的命名约定的用户帐户,然后重新启动部署并删除您在重新启动之前获取的列表中的帐户。这样你就不会在任何活跃的副本上拉扯地毯。