Helm, оценить переменную linux env в значениях.yaml

#spring-boot #kubernetes #kubernetes-helm

#spring-загрузка #kubernetes #kubernetes-helm

Вопрос:

У меня есть следующая переменная JVM_ARGS

базовые значения.yaml

 app:
  env:
    PORT: 8080
    ...
    JVM_ARGS: >
      -Dspring.profiles.active=$(SPRING_PROFILE),test
      -Dspring.config.additional-location=/shared
      -javaagent:/app/dd-java-agent.jar
  

service-x-values.yaml

 app:
  env:
    SPRING_PROFILE: my-local-profile
  

Значения файла оцениваются в порядке:

  • базовые значения.yaml
  • service-x-values.yaml

Мне нужно, чтобы JVM_ARGS оценивался по SPRING_PROFILE, и пока я не могу заставить его работать. Каков наилучший способ сделать что-то подобное?

Я новичок в helm и Kubernetes и чувствую, что мне не хватает чего-то основного.

Что я пробовал: определение JVM_ARGS, заключенное в двойные кавычки и без них.

UPD: Проблема заключалась в том, что у меня было несколько пользовательских диаграмм Helm, созданных другими разработчиками, и я мало знал, как работают эти диаграммы. Я работал только с файлами значений, которые были применены к шаблонам диаграмм.

Я хотел, чтобы свойство было разрешено helm для

 -Dspring.profiles.active=my-local-profile,vault
  

В конце я решил посмотреть, как сама Spring Boot разрешает свойства, и придумал следующее:

 -Dspring.profiles.active=${SPRING_PROFILE},vault
  

Поскольку spring.profiles.active является обычным свойством, там разрешены переменные env, и Spring разрешит свойство во время выполнения, что сработало для меня.

Ответ №1:

  1. Я немного в замешательстве: вы имеете в виду переменную среды (как в названии вопроса) или значение helm?
  2. Helm не оценивает переменные среды в файлах значений. $(SPRING_PROFILE) обрабатывается как литеральная строка, она не выравнивается.
  3. На самом деле Helm ничего не оценивает в файлах значений. Они являются источником данных, а не шаблонов. Заполнители (фактически шаблоны GO) оцениваются только внутри файлов шаблонов.
  4. Как следствие пункта 3., вы не можете ссылаться на одну переменную helm из другой.

Если вам действительно нужно получить профили Spring из переменной среды Linux, вы можете добиться этого, установив переменную Helm при вызове helm install и тому подобное (хотя использование —set считается плохой практикой):

 helm install --set app.env.spring_profile=$SPRING_PROFILE ...
  

Хотя даже чем, app.env.spring_profile не удалось оценить внутри base-values.yaml . Вам нужно будет переместить его непосредственно в ваш файл шаблона, например:

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  ...
  template:
    ...
    spec:
      containers:
        - name: my-app
          ...
          env:
            SPRING_PROFILES_ACTIVE: {{- .Values.app.env.spring_profile }},test

  

Комментарии:

1. Спасибо, в конце я придумал решение, не связанное с Helm, хотя я знаю, что мне нужно изучить его лучше 🙂 потому что я не понимал некоторые базовые концепции, которые заставили меня потратить несколько часов на эту проблему.

2. У вас есть источник, объясняющий, почему —set считается плохой практикой?