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内部信任库的问题路径

如何将自定义注释中的参数传递给库中的 WebSecurityConfigurer

译:零信任对 Kubernetes 意味着什么

受信任的证书条目不受密码保护 java

受信任的证书条目不受密码保护 java

Kubernetes:如何将 Promtail 设置为 sidecar 以读取自定义日志路径