【问题标题】:Passing java_opts to spring boot applications in kubernetes将 java_opts 传递给 Kubernetes 中的 Spring Boot 应用程序
【发布时间】: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

【问题讨论】:

    标签: spring-boot docker kubernetes kubernetes-pod kubernetes-deployment


    【解决方案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://stackoverflow.com/a/52989562/8918153

      【讨论】:

        猜你喜欢
        • 2019-05-16
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 2021-03-21
        • 2018-09-07
        • 2022-12-17
        • 2020-12-15
        • 2020-12-30
        相关资源
        最近更新 更多