将 java_opts 传递给 Kubernetes 中的 Spring Boot 应用程序

Posted

技术标签:

【中文标题】将 java_opts 传递给 Kubernetes 中的 Spring Boot 应用程序【英文标题】:Passing java_opts to spring boot applications in kubernetes 【发布时间】:2020-04-07 03:34:36 【问题描述】:

目前,我们正在构建带有入口点的 Docker 映像,并将此映像传递给 Kubernetes 部署。

有没有办法将入口点直接动态传递给 Kubernetes,以便它启动 Spring Boot 应用程序?

在 Kubernetes 中直接传递这个入口点有哪些不同的方法?

### Runtime image ###
FROM openjdk:8-jre-alpine

#Set working dir
WORKDIR /test

# Copy the executable JAR
COPY /*.jar /test/

# Run the app
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Djsversion=1.0 -D<variable>=<service-1> -D<variable>=<service-2>   -jar  *.jar

【问题讨论】:

【参考方案1】:

您可以在 k8s 部署清单中使用command

containers:
- name: mycontainer
  env:
  - name: NAME
    value: VALUE
  command: [ "java"]
  args: ["-jar", "-D..."]

【讨论】:

感谢您的输入.. 我有 100 个具有相同参数的微服务,... 是否可以使用 configmaps... 因为我很容易在一个地方进行更改,.. . 否则我需要更改每个部署 yaml 文件中的参数值 您不能将命令放入配置映射中,但您可以将环境变量值放入配置映射中。 是的,我知道了...但是我如何将配置映射与命令一起传递...以便它将与容器一起启动 java 进程。能否请您提供一个示例 yaml 文件...我是新手,请帮助 看看这个:kubernetes.io/docs/tasks/configure-pod-container/… 您可以使用 configmaps 为 pod 设置环境变量,并构建映像以使用这些环境变量, 感谢@Burak 的帮助,非常感谢!!!创建了 configmap 并按以下命令传递了 env 变量: [ "/bin/bash", "-c", "$(SPECIAL_LEVEL_KEY)" ] env: - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: javaconfig key: JAVA_OPTS 现在我能够调用并启动 java 服务。谢谢【参考方案2】:

您还可以将它与您希望传递到 docker 容器的其余环境变量一起包含在您的 kubernetes 部署 yaml 文件中:

- name: JAVA_OPTS
  value: >-
        -Djava.security.egd=file:/dev/./urandom 
        -Djsversion=1.0 -D<variable>=<service-1> -D<variable>=<service-2>
- name: SERVER_PORT
  value: 8080

【讨论】:

【参考方案3】:

您可以在 pod 的配置中将它们设置为环境变量

env:
      - name: MY_POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP
      - name: profile
        value: "dev"

然后像这样在 Dockerfile 中使用它们

CMD ["sh", "-c", "java -jar -Dspring.profiles.active=$profile rest.war"]

【讨论】:

感谢 cmets...我不想将 CMD/Entrypoint 放在 Dockerfile 中...我希望通过 kubernetes 部署动态传递,这样我就不需要构建 docker 映像对于 JAVA_OPTS 参数的任何更改【参考方案4】:

如果您使用的是 JAVA 版本 9+,请注意环境变量 JAVA_OPTS 的名称已更改。

更多内容在这个帖子https://***.com/a/52989562/8918153

【讨论】:

以上是关于将 java_opts 传递给 Kubernetes 中的 Spring Boot 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

将主机的环境变量传递给 dockerfile

是否可以构建使用SSL / TLS JAVA_OPTS作为其SSLContext的Java 11 HttpClient?

ELK调优篇1

kubernete的证书总结

kubernete的证书总结

#yyds干货盘点# 剖析 Kubernete 业务副本及水平扩展底层原理(06)