можно ли использовать глобальные переменные в значениях.ямл внутренней диаграммы руля

#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. Вам удалось заставить его работать?