Введение
Создание ApplicationSets
является отличным инструментом для сушки шаблонов приложений в ArgoCD. Вы можете генерировать похожие приложения, где единственным различием будет пространство имен для staging
и production
, или маркировка для таких путей, как canary
и stable
. Рассмотрим этот вариант использования:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: example-application
namespace: argocd
spec:
syncPolicy:
preserveResourcesOnDeletion: true
generators:
- clusters:
selector:
matchLabels: #...
values:
env: staging
track: stable
- clusters:
selector:
matchLabels: #...
values:
env: production
track: stable
- clusters:
selector:
matchLabels: #...
values:
env: production
track: canary
template:
#...
Эти значения легко установить, так как они являются простыми строками. Вы можете использовать простую интерполяцию для их использования. В нашем случае мы используем несколько различных файлов значений, основанных на этих значениях в спецификациях шаблона.
valueFiles:
- values.yaml
- 'values.{{values.env}}.yaml'
- 'values.{{values.track}}.yaml'
- 'secrets.{{values.env}}.yaml'
Проблема
Все это хорошо и замечательно, пока вам не понадобится что-то более сложное. Представьте себе случай, когда вы хотите настроить автоматическую синхронизацию только одного из этих кластеров. В нашем случае, когда бы мы ни меняли версию в таблице helm, мы бы хотели, чтобы staging сразу же синхронизировался. Мы можем установить syncPolicy
, но его интерфейс является объектом, и вы не можете интерполировать его специфическим для кластера образом. Чтобы включить это, нам нужно использовать следующее:
syncPolicy:
automated: {}
Где установить эти переопределения, если вы хотите, чтобы они объединялись только для staging, например?
Решение
Вы можете установить переопределения шаблона в объекте cluster
. Он будет объединен с шаблоном, определенным в этой диаграмме.
- clusters:
selector:
matchLabels: #...
values:
env: staging
track: stable
template:
spec:
syncPolicy:
automated: {}
Но нельзя просто установить переопределение шаблона, по какой-то причине есть обязательные ключи, которые должны быть установлены, даже если это просто заполнители. Это означает, что есть минимальная форма, которую нужно установить, чтобы задать что-либо для данного кластера. Это выглядит следующим образом:
template:
+ metadata: {}
spec:
+ project: app
+ destination: {}
+ source:
+ repoURL: http://github.com/example/helm-charts
syncPolicy:
automated: {}
Таким образом, чтобы кластер в режиме постановки выглядел правильно, он должен выглядеть следующим образом:
- clusters:
selector:
matchLabels: #...
values:
env: staging
track: stable
template:
metadata: {}
spec:
project: web
destination: {}
source:
repoURL: http://github.com/example/helm-charts
syncPolicy:
automated: {}
Вот так, если вы используете генераторы кластеров и хотите переопределить политику синхронизации для конкретного кластера, теперь вы знаете, как это сделать.