kubernetes - 如何将字符串从一个 Kubernetes pod 中的供应商应用程序复制到另一个 pod 中的供应商应用程序?
问题描述
我有一组供应商提供的容器,它们协同工作以提供服务,我们称它们为 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 之上构建以从共享卷中读取,设置容器内部的环境变量并启动供应商的进程。但是我必须管理用户帐户的秘密。
这种方法有什么改进,或者我没有考虑过什么完全不同的地方吗?
解决方案
从容器内部执行 API 操作不是反模式。阻止在C上启动进程,直到initContainer
运行并更新Secret
包含令牌。不要将 aConfigMap
用于秘密;该Secret
对象的存在是为了这些目的,您可以将 a 拉Secret
入 a PodSpec
- 作为环境变量或卷安装 - 与拉入 a 的方式相同ConfigMap
(有一些小的语法变化)。
我可以看到您可能遇到的唯一麻烦是您将处理多个副本,因此您可能希望随机化一些Secret
名称。在 中创建它,initContainer
在文件系统中传递随机名称,因为Pods
共享一个文件系统,然后在主容器中使用它,并Secret
在设置 env var 或 mount 后删除它。Secrets
并且ConfigMaps
可以在启动后消失Pod
而不影响它们在Pod
.
您可能还需要某种方式来清理用户帐户,因为您实际上是在每次副本启动时创建一个新用户并且没有机会删除它。ACronJob
可能是前进的方向 - 列出与您的命名约定匹配的用户帐户,然后重新启动部署并删除您在重新启动之前获取的列表中的帐户。这样你就不会在任何活动的副本上拉出地毯。
推荐阅读
- django - 如何更新一个 PostgreSQL 数据库并将更改/更新同步到另一台服务器上的另一个 PostgreSQL 数据库
- python - 同时更新 theta0 和 theta1 以在 python 中计算梯度下降
- javascript - 材质 ui 具有相同定义的多个类名
- docker - Docker缓存存储位置
- javascript - 使用 2 步对数组进行排序
- python - 从第二个数据帧有效地映射熊猫中的值
- c++ - 如何插入一个额外的 QTableWidget
- javascript - Node js将文件下载到服务器到特定文件夹中
- azure - SharePoint 作为 Azure SQL 和 Blob 的表示层
- c++ - main.cpp 如何知道包含头文件的源文件?