在 Kubernetes Init 容器中为 Kubernetes 主容器创建环境变量

Posted

技术标签:

【中文标题】在 Kubernetes Init 容器中为 Kubernetes 主容器创建环境变量【英文标题】:Create environment variables for Kubernetes main container in Kubernetes Init container 【发布时间】:2018-09-09 08:05:28 【问题描述】:

我使用 Kubernetes Init 容器来配置应用程序的数据库。完成此操作后,我想通过环境变量将数据库的凭据提供给主容器。

如何做到这一点?

我不想在 Init 容器中创建 Kubernetes Secret,因为我不想在那里保存凭据!

【问题讨论】:

凭证是init容器生成的吗?如果没有,您可以在运行应用程序之前将凭据存储在 K8s 机密中,并通过 env vars 将其公开给两个容器。 使用共享卷怎么样?如果你真的需要环境变量,你可以根据文件的内容将它们设置在主容器中。 1.Credentials由Init Container生成 2.我也想过共享卷;但是在哪里安装共享卷到 Linux Alpine 容器中以便在启动时获取 env 变量? ...或者在什么时候为共享文件中的环境变量运行源命令? 【参考方案1】:

我看到了几种实现你想要的方法:

    在我看来,最好的方法是使用 Kubernetes Secret。 @Nebril 已经在 cmets 中提供了这个想法。例如,您可以通过 Init Container 生成它并通过 PreStop 钩子将其删除。但是,你不想走那条路。

    您可以使用 InitConatainer 和您的主 pod 将使用的共享卷。 InitContainer 将在您可以挂载的卷中生成环境变量文件db_cred.env,例如/env 路径。之后,您可以通过在 Pod 规范中修改容器的 command 来加载它,并在将启动您的应用程序的主脚本之前添加命令 source /env/db_cred.env。 @user2612030 已经给了你这个想法。

    另一种替代方式是 Hashicorp 的 Vault,您可以将其用作所有凭据的存储。

    您可以使用一些自定义解决方案从 Kubernetes 应用程序直接写入和读取 Etcd。这是一个库示例 - k8s-kv。

但无论如何,在 Kubernetes 中存储凭据的最佳和最合适的方式是 Secrets。它比几乎任何其他方式都更安全、更容易。

【讨论】:

广告。 1.:但是我必须在 Init 容器中安装 kubectl 并在其中传递 k8s 客户端机密。可能但可能不必要的麻烦。广告。 2. 好听!这就是我已经尝试过的,但是在哪里放置 source /env/db_cred.env 命令?在我的 Dockerfile 中编写 RUN 语句时,它们不适用于主 CMD。广告。 3. 如何将 Vault 数据传递给应用程序?如果我没记错的话,你又需要一个 Init 容器解决方案。广告。 4. 我手头没有集群设置(目前)。 Anton,您能否分享一下如何让 InitContainer 将数据写入 Kubenrtes 的文档? “向 Kubernetes 写入数据”是什么意思? @vusa 你必须让它进入应用程序并有条件地执行它......你的CMD/ENTRYPOINT 将执行app-boot.sh,它将在其中执行source /env/db_cred.ev 第 2 点以某种方式在这里实现 ***.com/questions/67111483/…

以上是关于在 Kubernetes Init 容器中为 Kubernetes 主容器创建环境变量的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes中Pod的生命周期

Kubernetes pod 中的 Docker 容器无法通信

Kubernetes入门至精通 | Kubernetes生命周期

Kubernetes 中 Init 容器使用介绍

Kubernetes 中 Init 容器使用介绍

资深架构师谈云原生生态的基石Kubernetes