Определите переменные среды, ссылающиеся на переменную среду для контейнера [kubernetes] - PullRequest
1 голос
/ 09 апреля 2020

У меня есть развертывание K8s для приложения весенней загрузки. Я хочу создать файл дампа .hprof с именем модуля ($ 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

В результате я получу: $HOSTNAME.hprof задается в виде строки.

Я также пробовал много комбинаций $(HOSTNAME) ${HOSTNAME}. Всегда я получал имя переменной, а не значение содержимого.

Мой вопрос: как обратиться к $HOSTNAME

Ответы [ 3 ]

1 голос
/ 10 апреля 2020

Я пытаюсь сделать это, используя 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
1 голос
/ 10 апреля 2020

Имя хоста pods в Kubernetes всегда совпадает с именем 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
1 голос
/ 09 апреля 2020

Это невозможно. Вам нужно будет определить их как-то иначе или как-то иначе обработать интерполяцию самостоятельно. Обычная опция выглядит примерно так:

command:
- sh
- -c
- |
  JAVA_OPTS="asdfasdf" java -whatever

Но для этого нужно полностью переопределить команду из нижележащего контейнера, что раздражает. Тем не менее, вы можете делать ограниченные замены в путях тома, поэтому, вероятно, обработайте это на этом уровне вместо этого для данного конкретного случая.

...