这是一个很难问的问题,所以请耐心等待。如果可以的话,我会尽量简短。
问题陈述
我正在寻找一种现代最佳实践来管理和部署 Docker 容器的受信任的根 CA 证书列表。我知道我可以通过 Dockerfile 将证书烘焙到每个容器中。但是,每次我们需要更改证书或 CRL 时,每个容器都会有一个新的 docker 映像。理想情况下,本着“云原生”的精神(参见 12 要素应用程序),我们的容器将没有证书和 CRL,这一切都将以某种方式来自环境。
提供更多背景信息。我在 Kubernetes 中运行这些容器,但它们可以在任何容器平台上运行,例如 OpenShift、AWS 等。理想情况下,我的目标是提出一个允许真正容器可移植性的单一解决方案。
潜在的解决方案
我玩过的一些想法:
1)创建另一个包含所有证书和 CRL 的容器,并将其卷安装到每个容器。- 这是一种常用方法,但每次更新新证书或 CRL 时都需要将容器保存到新映像中。不可怕,但感觉不是很“云原生”。
2) 使用 Spring Config Server 并构建一个小的 Spring Boot sidecar,在启动时安装所有证书。- 外部集中配置感觉云原生。- 可能需要对容器中可能需要这些证书的服务的启动顺序进行大量修改。- 对于容器来说感觉太复杂了。
3)使用管理所有证书的代理。- 感觉就像是通过代理强制所有流量的黑客攻击。- HTTPS 资源负载过重时可能会出现吞吐量和争用问题。- 通过直接 HTTP 路由所有内容可能不可行。
4)使用环境变量并有一个安装它们的启动脚本 - 用于部署在任何地方的任何类型的容器的简单而通用的方法。我不确定这样做是否合适。这些将是很多大的环境变量值。你能想象“printenv”会是什么样子吗?
5) 使用 Kubernetes Secrets(不确定这是否可行) - 这是一个仅限 kubernetes 的解决方案,它不利于一次写入,随处使用。
我知道这有点啰嗦。我为此道歉。我不知道如何进一步压缩它。我期待着对此进行讨论。