#kubernetes #charts #yaml #kubernetes-helm
Вопрос:
У меня есть две диаграммы руля, вторая вложена в вывод первого дерева:
.
└── outerChart
├── charts
│ └── innerChart
│ ├── charts
│ ├── Chart.yaml
│ ├── templates
│ │ ├── deployment.yaml
│ │ ├── _helpers.tpl
│ │ ├── ingress.yaml
│ │ ├── NOTES.txt
│ │ ├── serviceaccount.yaml
│ │ └── service.yaml
│ └── values.yaml
├── Chart.yaml
├── templates
└── values.yaml
У меня есть глобальная переменная во внешнем values.yaml
:
global:
myreplicacount: 4
Во вложенной диаграмме есть файл значений с
replicaCount: 1
и развертывание, которое его использует:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "foo.fullname" . }}
labels:
{{ include "foo.labels" . | indent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
Самый простой способ использовать глобальный var — заменить:
replicas: {{ .Values.replicaCount }}
с:
replicas: {{ .Values.global.myreplicacount }}
в. deployment.yaml
Но можно ли использовать это во вложенных values.yaml
? Я хотел бы сохранить внутреннюю диаграмму нетронутой. Я застрял в ситуации, когда одна команда разработчиков предоставляет мне внутреннюю диаграмму, а другая обеспечивает необходимую конфигурацию с помощью глобальных переменных. replicaCount
это всего лишь пример, у них есть много переменных, которые необходимо изменить, и если я отредактирую внутреннюю диаграмму, это затруднит обновление внутренней диаграммы.
Просто добавляю:
replicaCount: {{ .Values.global.myreplicacount }}
на внешней диаграмме/диаграммах/внутренней диаграмме/значения.yaml
возвращает
): error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{".Values.global.myreplicacount":interface {}(nil)}
Комментарии:
1. Не могли бы вы поделиться текущим каталогом дерева (выполнив
tree
команду) в главном каталоге, где у вас есть диаграммы управления, и пометить файлы, которые вы упомянули в вопросе?
Ответ №1:
Внутри вложенной диаграммы .Values
отображается содержимое .Values.nested
(используя любое имя для зависимости в requirements.yaml
или Chart.yaml
), объединенное с ключом верхнего уровня global:
.
# requirements.yaml
- name: nested # <-- this name will be used in values.yaml
version: "^1"
repository: ...
Вы можете указать конкретные параметры для этой зависимости, используя ее имя в качестве ключа values.yaml
. Для этого не требуется global:
никаких изменений в диаграмме зависимостей.
# outer chart values.yaml, or `helm install -f` YAML file
nested: # <-- matches name: in requirements.yaml above
replicaCount: 1
В частности, для количества реплик развертывания я бы предпочел этот вариант возможным альтернативам. Вполне вероятно, что для каждого развертывания и набора состояний потребуется разное количество реплик, особенно на нескольких диаграммах, и нет смысла глобально говорить «абсолютно все будет иметь ровно 4 реплики».
Если вы можете отредактировать вложенную диаграмму и хотите, чтобы она при необходимости принимала global:
значение, вы можете выполнить это, если локальное значение не задано
# charts/nested/deployment.yaml
replicas: {{ .Values.replicaCount | default .Values.global.replicaCount | default 1 }}
Комментарии:
1. Спасибо вам за ваш ответ. Я знаю об этой опции, и это самый чистый вариант, но я застрял в ситуации, когда одна команда разработчиков предоставляет мне внутреннюю диаграмму, а другая обеспечивает необходимую конфигурацию с помощью глобальных переменных. replicaCount-это всего лишь пример, у них есть много переменных, которые необходимо изменить, и если я отредактирую внутреннюю диаграмму, это затруднит обновление внутренней диаграммы .
Ответ №2:
Как правило, то, чего вы хотите достичь, на самом деле не поддерживается. Тем не менее, я думаю о простом обходном пути, который может вам помочь.
Перед запуском helm install
команды или чего бы вы ни использовали, вы можете заменить значения во вложенном values.yaml
из внешнего values.yaml
с помощью yq
утилиты (при условии, что вы находитесь в том же каталоге, откуда вы запустили tree
команду).:
yq e -i ".replicaCount = $(yq e '.global.myreplicacount' ./outerChart/values.yaml)" ./outerChart/charts/innerChart/values.yaml
Мы устанавливаем replicaCount
значение во внутреннем values.yaml
на значение, заданное во global.myreplicacount
внешнем values.yaml
, только с помощью yq
утилиты, вам не нужно редактировать вручную.
Вы можете вставить несколько yq
команд в сценарий и просто запускать его перед каждым развертыванием руля, чтобы у вас values.yaml
всегда были актуальные значения во вложенных.
Комментарии:
1. Привет @sotiris. Вам удалось заставить его работать?