Динамический доступ к значениям в зависимости от значений переменных в диаграмме Хелма - PullRequest
0 голосов
/ 10 октября 2018

В настоящее время я пишу диаграмму Хелма для мультиконтейнерного приложения.У нас есть набор микросервисных контейнеров (мы называем их «приложениями»), которые очень похожи в том, как они могут обрабатываться через K8, и могут (и, следовательно, должны) обрабатываться одним и тем же шаблоном Helm, чтобы избежать дублирования.С другой стороны, имеет смысл иметь возможность настраивать определенные параметры индивидуально для разных приложений (например, запросы ресурсов).В настоящее время я делаю что-то вроде этого:

{{- $applications:= <obtain list of applications> }}
{{ range $app:= $applications }}
apiVersion: apps/v1
kind: StatefulSet
spec:
[...]
    spec:
      containers:
      - name: {{ $app }}
        image: {{ $.Values.image.registry }}mycompany/myproduct-{{ $app }}:{{ $.Values.image.version }}
[...]

То, что я хотел бы сейчас сделать, - это установить некоторые специфические для приложения значения (например, ресурсы K8s resources.requests.memory или количество реплик),может быть установлен индивидуально внутри values.yaml для каждого приложения, но возвращается к значению по умолчанию, если они не установлены.Идея состояла в том, чтобы иметь такой раздел в values.yaml:

applications:
  default:
    replicas: 1
    resources:
      requests:
        memory: 512Mi
        cpu: 250m
  applicationA:
    resources:
      requests:
        memory: 7Gi
  applicationB:
    resources:
      requests:
        cpu: 500m
[...]

Идея состоит в том, что я использую значение из раздела «по умолчанию» для приложений, если в приложении не указано значение, специфичное для приложения.раздел для соответствующего приложения.В моем примере у меня есть пользовательское значение для запроса памяти приложения A и одно для запроса ЦП приложения B, но все остальные значения должны исходить из раздела по умолчанию.Также могут быть приложения, в которых никакие специфичные для приложения настройки не определены вообще (в этом случае все идет из раздела значений по умолчанию values.yaml).Функция «index», казалось, позволяла мне делать то, что я хочу, поэтому в моем шаблоне я попробовал это (разрыв строки для удобства чтения):

resources:
  requests:
    memory: {{ default \
(index $.Values "applications" "default" "resources" "requests" "memory") \
(index $.Values "applications" $app "resources" "requests" "memory") }}  

Поскольку индекс позволяет мне использовать значение моегопеременная цикла "$ app" для "разыменования" значения из values.yaml, это на самом деле работает ... увы, происходит сбой индекса с ошибкой вызова index: индекс указателя nil в тех случаях, когда я не указываю специфическое для приложения значение дляодин из параметров, и, следовательно, разыменование не выполняется.То, что мне нужно, это индекс, чтобы НЕ дать сбой в этой ситуации, а просто вернуть пустое значение, чтобы сработало значение по умолчанию. К сожалению, я не могу найти способ сделать это.

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

1 Ответ

0 голосов
/ 03 декабря 2018

Я делаю что-то похожее с моими диаграммами, но на основе среды вместо приложения.

В моем values.yaml:

env: dev

replicaCount:
  _default: 1
  staging: 2
  prod: 4

В моем шаблоне:

  replicas: {{ pluck .Values.env .Values.replicaCount | first | default .Values.replicaCount._default }}

Команда pluck возвращает список, а first выбирает первый элемент из этого списка.Если ничего не возвращается, оно возвращается к значению _default.Поэтому, когда я запускаю helm template --set env=staging, я получаю конфигурацию, которую я установил для своей промежуточной среды.

Ваш файл values.yaml будет выглядеть так:

replicas:
  _default: 1
resources:
  requests:
    memory:
      _default: 512Mi
      applicationA: 7Gi
    cpu:
      _default: 250m
      applicationB: 500m

И ваш шаблон будет иметь что-тонапример:

memory: {{ pluck .Values.app .Values.resources.requests.memory | first | default .Values.resources.requests.memory._default }}

Тогда вам просто нужно добавить --set app=applicationA к вашей команде Helm.

Я думаю, что это делает values.yaml более или менее читабельным, ношаблон становится немного уродливым.

Вы можете использовать комбинацию pluck с вашим исходным файлом значений для чего-то вроде этого:

{{ pluck .Values.app .Values.applications | default .Values.applications.default | toYaml | indent N }}

Я не пробовал, поэтомуYMMV.(Вам определенно придется изменить N, чтобы соответствовать уровню отступа, где вы вставляете блок.) Просто идея.Похоже, высокий потенциал для хрупкой конфигурации.

...