В настоящее время я пишу диаграмму Хелма для мультиконтейнерного приложения.У нас есть набор микросервисных контейнеров (мы называем их «приложениями»), которые очень похожи в том, как они могут обрабатываться через 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, но это просто не подходит.