Я пытаюсь отправить свой список спецификаций kubernetes. Мой ямл выглядит так:
---
apiVersion: v1
kind: Application
metadata:
name: my-app
spec:
env:
- name: ENV1
value: http://someurl.com
- name: ENV2
value: val2
- name: AN_ENV_LIST
value:
- val2
- val3
Но, конечно, я получаю сообщение об ошибке:
invalid type for v1.Application.spec.env.value: got "array", expected "string"
Мой вопрос в том, возможно ли это вообще с kubernetes?
Как указать список?
И бонусный вопрос - а как насчет карт? Это возможно?
Переменные среды имеют тип string
, поэтому вы не можете передать массив в одной переменной.
Вы можете закодировать массив как строку, но приложение должно знать об этой кодировке. В качестве альтернативы можно передать несколько переменных среды, если приложение это поддерживает.
Как уже упоминалось, kubernetes поддерживает только переменные среды, которые являются строками.
Но есть способы сделать это с помощью некоторой магии загрузки Spring:
В вашем kubernetes shifter-patch.yaml:
- name: WHITELISTED_APPS
value: app1, app2, app3
Теперь в конфигурации весенней загрузки вашего приложения просто прочитайте whitelistedApps как список (или массив)
Карты также возможны:
В этом примере я размещаю заполнители в конфигурации Spring flyway.
Flyway.placeholders — это Map<String, String>
Моя обычная конфигурация приложения загрузки Spring будет выглядеть так:
spring:
flyway:
placeholders:
appuser0: user0
appuser1: user1
Но в моем kubernetes shifter-patch.yaml я могу внедрить их как:
- name: SPRING_FLYWAY_PLACEHOLDERS_APPUSER0
value: user0
- name: SPRING_FLYWAY_PLACEHOLDERS_APPUSER1
value: user1
Надеюсь, это будет полезно другим, использующим загрузочные приложения Kubenetes и Spring.
нет Нельзя, он принимает строку. если вы хотите сделать что-то подобное, просто передайте его как строку и в своем контейнере обработайте его в своем коде или с помощью внешнего инструмента, такого как
yq
. так что ставьтеvalue: '[ "val2", "val3"]'
и в контейнере делайтеecho "${AN_ENV_LIST}" | yq