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

24

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

如何实现这一点呢?

我不想在Init容器内创建一个Kubernetes机密,因为我不想在那里保存凭据!


凭据是由 init 容器生成的吗?如果不是,您可以在运行应用程序之前将凭据存储在 K8s 密钥中,并通过 env 变量将其暴露给两个容器。 - Nebril
使用共享卷如何?如果你真的需要环境变量,你可以根据文件的内容在主容器中设置它们。 - ewramner
  1. 凭据是由初始化容器生成的。
  2. 我也考虑过共享卷;但在Linux Alpine容器中挂载共享卷以便在启动时获取环境变量?或者在哪个位置运行共享文件中的源命令以获取环境变量?
- vuza
1个回答

12
我看到有几种方法可以实现你想要的:
  1. 从我的角度来看,最好的方法是使用Kubernetes Secret。@Nebril已经在评论中提供了这个想法。你可以通过Init Container生成它,并通过例如PreStop钩子删除它。但是,你不想走这条路。

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

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

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

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

广告1:但是我必须在Init容器中安装kubectl并将k8s客户端密钥传递到其中。这是可能的,但可能不必要麻烦。广告2:听起来不错!这就是我已经尝试过的,但是在哪里放置“source /env/db_cred.env”命令?当在Dockerfile中编写RUN语句时,它们对于主CMD不可用。广告3:如何将Vault数据传递给应用程序?如果我没记错的话,你需要再次使用Init容器解决方案。广告4:目前我手头没有集群设置。 - vuza
Anton,请问你能否分享一下如何让 InitContainer 将数据写入 Kubernetes 的文档? - user4889345
“write data to Kubernetes” 的意思是什么? - Anton Kostenko
@vusa,你需要将它制作成应用程序并有条件地执行它... 你的 CMD/ENTRYPOINT 将会执行 app-boot.sh,其中它将会执行 source /env/db_cred.ev - Marcello DeSales
点2的某种实现方式在此处实现:https://dev59.com/sGAKtIcB2Jgan1znmczZ - Rohit Salecha
广告2:有相当多的第三方容器镜像只包含实际的二进制文件,也就是说无法在任何东西上调用“source”,因为里面没有实际的shell。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接