定义引用容器[kubernetes]的变量环境的环境变量



我有一个用于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

最新更新