k8s 配置 POD 环境变量 JAVA_TOOL_OPTIONS 报错问题

362 天前
 dunhanson

shell 运行时正常的,我手动写入 /etc/profile 运行也是正常的。

但是放在 yml 里面就报错,不想写死在 dockerfile 里面,用 yml 配置灵活些。

shell 命令

java -XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/logs/moose-job/gc-$(date +'%Y-%m-%d').log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/moose-job/dump-$(date +'%Y-%m-%d').hprof -jar moose-job.jar

Invalid file name for use with -Xloggc: Filename can only contain the characters [A-Z][a-z][0-9]-_.%[p|t] but it has been /data/logs/moose-job/gc-$(date
Note %p or %t can only be used once
Picked up JAVA_TOOL_OPTIONS: -XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/logs/moose-job/gc-$(date +'%Y-%m-%d').log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/moose-job/dump-$(date +'%Y-%m-%d').hprof
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
1594 次点击
所在节点    Kubernetes
16 条回复
dropdatabase
362 天前
1.name: JAVA_OPTS
value: -Xms1024m -Xmx1024m -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap

2.java -jar $JAVA_OPTS $APP_JAR -Dfile.encoding=UTF-8 --spring.profiles.active=$1
aru
362 天前
$(date +'%Y-%m-%d')
这种方式是不行的
perfectlife
362 天前
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: JAVA_TOOL_OPTIONS
value: "-XX:MaxRAMPercentage=85.0 -XX:InitialRAMPercentage=85.0 -XX:MinRAMPercentage=85.0 -XX:MetaspaceSize=200m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dump/${POD_NAME}-$(POD_IP).hprof
可以参考下这个
perfectlife
362 天前
@dunhanson 格式问题自己调整一下
julyclyde
362 天前
$()是 shell 的功能。你这里连 shell 都没有
dunhanson
362 天前
@aru
@dropdatabase 有其他方式吗
dunhanson
362 天前
@perfectlife 哈哈 这个感觉可以
dunhanson
362 天前
@dropdatabase
@aru
@perfectlife
@julyclyde
我发现 gc 日志不能用动态名称,dump 可以
julyclyde
362 天前
@dunhanson
你进去 ps 一下看看 java 的命令行完整内容是咋写的,是替换之前的表达式,还是之后的值
perfectlife
362 天前
@dunhanson 实际上 dump 没啥用,首先要挂载一个共享存储比如 nfs 来存储 dump 文件,其次我对 oomkill 时候几个 g 的 dump 文件能否正常保存下来还是有点怀疑的 ,真排查 拿阿里的阿尔萨斯取容器里排查好点
xx6412223
362 天前
command:
- /bin/sh
- -c
- xxxxxx

直接把完整的启动命令以 shell 写道 pod command 里
tudou1514
362 天前
目前测试好几种后,最好的就是传脚本进容器,然后用 entrypoint 启动
dunhanson
362 天前
@julyclyde
@perfectlife
@xx6412223
@tudou1514
我还是用固定名称了
ofblyt
362 天前
从你的报错信息来看,主要问题在于`-Xloggc`和`-XX:HeapDumpPath`参数中的文件名,你尝试在其中使用了`$(date +'%Y-%m-%d')`这样的 Shell 变量,但这种变量并不能被 Java 虚拟机( JVM )正确地解析。

在 Kubernetes 中,环境变量在 pod 启动时被解析,而不是在运行命令时。这就意味着,你的`$(date +'%Y-%m-%d')`并没有被替换成实际的日期,而是被原样包含在了字符串中。这就导致了你看到的“Invalid file name for use with -Xloggc”的错误。

一种解决方法是,你可以创建一个启动脚本,这个脚本会在运行 Java 程序之前,计算出需要的日期,并将其设置为环境变量。然后,你可以在`JAVA_TOOL_OPTIONS`中使用这个环境变量。

例如,你的启动脚本可能看起来像这样:

```bash
#!/bin/sh

export LOG_DATE=$(date +'%Y-%m-%d')
java $JAVA_TOOL_OPTIONS -jar moose-job.jar
```

然后在你的`JAVA_TOOL_OPTIONS`中,你可以使用`$LOG_DATE`,例如:

```bash
-XX:HeapDumpPath=/data/logs/moose-job/dump-$LOG_DATE.hprof
```

这样,`$LOG_DATE`就会在运行 Java 程序时被替换为实际的日期。

然后,在你的 Kubernetes 配置中,你需要将启动命令更改为运行这个脚本,而不是直接运行 Java 程序。
julyclyde
362 天前
@dunhanson 其实之前你选择用 shell 替换功能给 jvm 传递文件名,存在一个认知问题,就是:loggc 是否自己就支持 logrotate 功能

如果支持,那它自己会决定文件名变更,它需要一个符号化的文件名模板,而不需要你给它传递一个(已经替换为明文的)明文文件名
如果不支持,那你给一个明文文件名,会导致不同时刻启动的各容器内的日志文件名不同,对统一处理造成不便
无论那种,其实都是错的做法
julyclyde
362 天前
另外,不要在 profile/shell rc 里放环境变量
我敢说绝大多数正常人都没仔细学过,这俩文件到底在什么情况下生效

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/952414

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX