我有一个用于spring-boot应用程序的K8s部署我想创建一个转储文件.hprof
,其中包含pod的名称($hostname(
我的JAVA_OPTIONS
参数是一个可变环境我想引用父JAVA_Options
中的另一个变量
containers:
- env:
- name: SPRING_PROFILES_ACTIVE
value: prod,swagger
- name: JAVA_OPTS
value: ' -XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/$HOSTNAME.hprof'
我所期望的是有一个包含主机名的变量:
$ echo $JAVA_OPTS -XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/myPodNameStaging.hprof
结果是:CCD_ 4被设置为字符串。
我还尝试了许多组合$(HOSTNAME)
${HOSTNAME}
。我总是得到变量的名称,而不是内容值。
我的问题是:如何参考$HOSTNAME
我正在使用nginx进行尝试,但是变量替换正在工作,也许你可以尝试一下:
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
env:
- name: POD_HOSTNAME
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: SPRING_PROFILES_ACTIVE
value: prod,swagger
- name: JAVA_OPTS
value: -XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/$(POD_HOSTNAME).hprof
然后我可以看到JAVA_OPTS
:的内容
root@nginx-deployment-5bc5fcdc8b-f4ldx:/# echo $JAVA_OPTS
-XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/10.32.17.138.hprof
这是不可能的。您需要以其他方式定义这些,或者自己处理插值。一个常见的选项是这样的:
command:
- sh
- -c
- |
JAVA_OPTS="asdfasdf" java -whatever
但这确实需要完全覆盖底层容器中的命令,这很烦人。也就是说,可以在卷路径中进行有限的替换,因此在这种特定情况下,可能会在该级别处理它。
Kubernetes中pod的主机名始终与pod名称相同,在Linux上我们有一个env变量$hostname。所以你可以用它来实现你需要的:
以下是一个适合您需求的示例:
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- name: busybox
image: k8s.gcr.io/busybox:1.24
env:
- name: SPRING_PROFILES_ACTIVE
value: prod,swagger
command: [ "sh", "-c"]
args:
- while true; do
export JAVA_OPTS="-XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/$HOSTNAME.hprof";
printenv JAVA_OPTS;
printenv SPRING_PROFILES_ACTIVE;
sleep 10;
done;
imagePullPolicy: IfNotPresent
restartPolicy: Always
如果运行kubectl get logs busybox
,您可以看到以下输出:
-XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/busybox.hprof
prod,swagger
-XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/busybox.hprof
prod,swagger
-XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/busybox.hprof
prod,swagger
-XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/busybox.hprof
prod,swagger
-XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/busybox.hprof
prod,swagger
-XX:MaxRAMPercentage=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/jvm-data/busybox.hprof
prod,swagger