我的大多数回答都会是
"Hashicorp的Vault"。
您可以在您的环境中启动一个Vault集群,并让您的容器在启动和运行时连接到Vault并获取密钥。最简单的实现方式是在容器启动时将密钥读入容器并推送到容器的ENV中。
如果您进一步进行,可以使用语言级别的Vault客户端库来检索和刷新密钥,从而在应用程序运行时删除重新启动容器以检索新密钥的必要性。
这与您所问的有什么关系呢?
我会说Vault。如果需要,您可以使用Puppet和Hiera将密钥写入文件或文件夹,但这意味着将密钥写入磁盘,这不是理想的。据我所知,K8s在休息时存储未加密的密钥,这也不是理想的。在这里,我更喜欢Vault。每个环境都有自己的Vault集群,因此有了您的“特定于环境的配置”。
配置文件可能包含敏感数据,例如API密钥和秘密信息。我该如何在构建Docker映像时加密、存储和解密?
请参考上面的内容。Vault可以加密保存机密信息。使用您的Vault令牌(如果需要,您可以通过卷将其挂载到容器中)来访问并解密这些机密信息。然后,在启动容器的主进程之前,您可以将它们推送到您的环境变量中,或者进行更紧密的集成,并使Vault成为应用程序逻辑的一部分。
如果我想更改某些配置,我需要触发构建,因为我的配置文件放置在Docker映像内部。我是否可以将配置文件作为卷放置在Docker容器外部,以便我可以替换配置文件并重新启动容器,以便代码读取更新的配置?如果我想将它放在Docker容器外部,我是否仍然可以使用任何容器编排/管理的集群管理工具(如Kubernetes/ECS)?
对此的答案高度依赖于配置文件中包含的内容。如果它与代码版本有关,则强烈建议将其与代码捆绑在一起,以防止代码和配置不匹配。
如果它与代码(例如:调整值或密码)有效地独立,我会把它们放在Vault中——既然可以将它们存储在加密的秘密管理系统中,为什么要把它们放在一个文件中呢?
不过,如果你一心想要使用文件,你可以很容易地从已知的卷挂载到已知的路径,所有的调度系统(包括现在的Nomad)都允许在部署的容器中挂载卷。
有一个问题是:如何使运行在Docker容器中的应用程序只需重新启动容器即可读取更新后的配置,而无需构建新的docker镜像和部署新的容器?
使用Vault:如果您希望仅在启动时更改密码,则
envconsul是您的好帮手。
请参见上文对于我的关于运行时更改配置值的意见。
实际执行的tl;dr是创建一个“启动”脚本,该脚本是容器的入口点。启动脚本将从您选择的任何管理系统(卷挂载、Vault、文件等)检索密码,并准备好供您的应用程序读取。
启动脚本然后启动您的主应用程序的运行过程。
希望这可以帮助您!
PS:我不是Hashicorp的员工,但我喜欢他们用于处理容器的软件。通过购买Hashicorp的不同软件可以获得很多东西,但你也可以通过K8s作为单一解决方案来获得这些功能。单个应用程序(Hashicorp)允许您选择并混合所需的解决方案,但也需要更高的维护成本。K8s是一个相当沉重的锁定,但大多数情况下,您可能想要的功能都能够满足,而无需学习其他任何内容。
祝好运