Kubernetes - 如何将信任库路径和密码传递给 JVM 参数
Posted
技术标签:
【中文标题】Kubernetes - 如何将信任库路径和密码传递给 JVM 参数【英文标题】:Kubernetes - how to pass truststore path and password to JVM arguments 【发布时间】:2020-10-22 06:16:57 【问题描述】:我需要将 jks 文件添加到我的 JVM 以与服务器进行 SSL 握手。 JKS 安装在卷中并可供 docker 容器使用。如何在启动期间将 JKS 信任库路径和密码传递给 Springboot(JVM)。 我认为一种选择是作为环境变量 (-Djavax.net.ssl.trustStore, -Djavax.net.ssl.trustStorePassword) 。对于 Openshift,下面的 url 中描述了以下工作。
选项 1:
env:
- name: JAVA_OPTIONS
value: -Djavax.net.ssl.trustStore=/var/run/secrets/java.io/keystores/truststore.jks -Djavax.net.ssl.trustStorePassword=changeit
https://developers.redhat.com/blog/2017/11/22/dynamically-creating-java-keystores-openshift/
但是,我似乎没有为 Kubernetes 找到类似的 JAVA_OPTIONS 环境变量。
选项2:
我的 Docker 文件是:
FROM openjdk:8-jre-apline
..........
........
ENTRYPOINT ["java", "-jar", "xxx.jar"]
是否可以如下更改,并且可以通过 configmap 将 $JAVA_OPTS 设置为 JVM 的 env 变量?
FROM openjdk:8-jre-apline
..........
........
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -jar xxx.jar" ]
配置图:
JAVA_OPTS: "-Djavax.net.ssl.trustStore=/var/run/secrets/java.io/keystores/truststore.jks -Djavax.net.ssl.trustStorePassword=changeit"
请建议这是否可行或任何其他更好的解决方案。如果我们可以秘密存储密码,则更优选。
【问题讨论】:
【参考方案1】:几个选项:
1:您可以将其全部分解并使用secrets 将您的凭据仅存储为环境变量,秘密存储可以作为文件安装在容器中的磁盘上的密钥库,和一个 ConfigMap 来保存其他 java 选项作为 env 变量,然后使用容器中的入口点脚本来验证并将它们混合在一起以形成 JAVA_OPTS 字符串。
2:您可以将整个字符串放入您在运行时使用的 JAVA_OPTS 密钥中。
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: myimage
env:
- name: JAVA_OPTS
valueFrom:
secretKeyRef:
name: mysecret
key: JAVA_OPTS
restartPolicy: Never
【讨论】:
【参考方案2】:我可以在 K8s 部署中使用 _JAVA_OPTION
环境变量在运行 Java 8 的 Docker 容器中的 Spring Boot 2.3.x 应用程序中执行此操作(从这个 SO 答案 https://***.com/a/11615960/309261 获得这个 envvar 的提示)。
env:
- name: _JAVA_OPTIONS
value: >
-Djavax.net.ssl.trustStore=/path/to/truststore.jks
-Djavax.net.ssl.trustStorePassword=changeit
【讨论】:
以上是关于Kubernetes - 如何将信任库路径和密码传递给 JVM 参数的主要内容,如果未能解决你的问题,请参考以下文章
带有spring boot和kafka的docker内部信任库的问题路径