使用 Google Jib 和 Kubernetes 时添加 SSL 证书

Adding SSL certificate when using Google Jib and Kubernetes

因此,我正在尝试为我的项目添加一个 ssl 证书,在我的本地计算机上,我可以通过简单地遵循 keytool 命令来添加它,然后它就起作用了。但是当我尝试在拥有我的 k8s 集群的机器上做同样的事情时,它似乎没有任何作用。

我看到一些人在他们的 docker 文件中将 cer 添加到 cacerts,但我没有,因为我正在使用 google 的 Jib,所以我不确定它应该如何从这里开始,或者它是我应该添加到我的 k8s 部署文件中的配置?

背景

这里我假设您部署到 Kubernetes 的应用程序正在连接到受 Kubernetes 外部服务器证书保护的外部服务器。例如,像 this article.

中的情况

从上面的link可以看出,确实有多种方法可以解决这个问题。但是,请注意文章中解释的方法并不真正适用于 Java 原样,因为 Java doesn't make use of the system CA cert store from the OS but uses its own truststore:

Instead of using the windows certificate store it uses its own implementation. Java certificates are stored in a file called cacerts located at C:\Program Files (x86)\Java\jre1.x.x_xxx\lib\security\

因为您说您在本地成功使用了 keytool,所以我假设您已经知道这种 Java 行为以及您的服务器证书应该导入到的位置——即导入到 JRE 的默认 cacerts JRE 目录下的文件(除非您使用某些系统 属性 告诉 JVM 在不同的位置查找 CA 信任库)。既然你说你让它在本地工作,理论上你可以按照同样的方式进行操作,它也应该在 Kubernetes 上工作。


在构建时嵌入 cacerts

一种直接的方法是在镜像构建时将证书烘焙到镜像中(正如您在 Dockerfile 方法中暗示的那样)。为此,您可以使用 Jib 的 <extraDirectories> 功能将任意文件复制到图像中(用法:Maven / Gradle)。只需准备一个新的 cacerts 文件并将其放入图像中 JRE 的默认位置即可。

在运行时提供 cacerts

如果你不喜欢将证书烘焙到镜像中的想法,而是想在运行时提供它,我相信你基本上可以按照我 link 上面的文章中描述的最后一种方法(当然,对于 Java,您应该改为 cacerts)。我不是这个领域的 Kubernetes 专家,不确定 Kubrenetes 是否提供了另一种专门的解决方案,但文章中的方法似乎合理并且应该有效。

对于 Kubernetes 以外的容器运行时,它们都有自己的运行时提供文件或附加卷的方式,因此您应该能够实现相同的目标。


更新:在许多 Linux 发行版中,通常 <JRE>/lib/security/cacerts 是 link 到 /etc/ssl/certs/java/cacerts 的符号,因此您可能选择更新后者而不是前者。

# ls -l /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts
lrwxrwxrwx    1 root     root            27 Jan  1  1970 /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts -> /etc/ssl/certs/java/cacerts