зависимости Helm с разными пространствами имен
Прямо сейчас мне нужно установить несколько Helm-диаграмм в разных пространствах имен, чтобы мой продукт работал. Я пытаюсь создать супер-диаграмму руля, в которую я планирую добавить диаграммы руля (моих инструментов, как упоминалось выше) и установить их одним выстрелом. Моя проблема в том, что, поскольку эти инструменты находятся в разных пространствах имен, я не уверен, где указать ключ пространства имен, в котором я хочу установить эту конкретную зависимость (диаграмму). Например, если ниже приведен Charts.yaml моей диаграммы супер-руля
dependencies:
- name: first_chart
version: 1.2.3
repository: https://firstchart.repo
- name: second_chart
version: 1.5.6
repository: https://secondchart.repo
Я хочу, чтобы моя первая диаграмма была установлена в пространстве имен foo, а вторая диаграмма была установлена в панели пространства имен.
Я рассматривал использование условий, но я считаю, что условия будут принимать только логическое значение в качестве значения.
Я наткнулся на эту ссылку (https://github.com/helm/helm/issues/2060), в которой говорится, что мы можем сделать это в Helm 3, но в основном о том, как сохранять выпуски между разными пространствами имен. Это не отвечает конкретно на мой вопрос.
2 ответа
То, как я решил это для своих кластеров с моделью кластера ArgoCD App of Apps .Конечно, для этого требуется, чтобы ArgoCD установил кластер. Однако по многим причинам, не относящимся к этому ответу, я настоятельно рекомендую установить ArgoCD, несмотря на простоту загрузки.начальной загрузки
Предполагая, что ArgoCD установлен, структура представляет собой единую диаграмму Helm, содержащую шаблоны для каждой из дочерних диаграмм, которые она будет развертывать и управлять с помощью CRD приложений Argo . Вы заметите, что в CRD есть определение,spec.destination.namespace
, который определяет, где будет развернута диаграмма.
Пример шаблона приложения, который управляет развертыванием моей диаграммы диспетчера сертификатов вcert-manager
пространство имен выглядит так:
{{- if .Values.certManager.enabled }}
# ref: https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#applications
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: cert-manager
# You'll usually want to add your resources to the argocd namespace.
namespace: argocd
# Add a this finalizer ONLY if you want these to cascade delete.
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
# The project the application belongs to.
project: cluster-configs
# Source of the application manifests
source:
repoURL: https://github.com/yourOrg/Helm
targetRevision: {{ .Values.targetRevision }}
path: charts/cert-manager-chart
# helm specific config
helm:
# Helm values files for overriding values in the helm chart
# The path is relative to the spec.source.path directory defined above
valueFiles:
{{- range .Values.certManager.valueFiles }}
- {{ . }}
{{- end }}
# Optional Helm version to template with. If omitted it will fall back to look at the 'apiVersion' in Chart.yaml
# and decide which Helm binary to use automatically. This field can be either 'v2' or 'v3'.
version: v3
# Destination cluster and namespace to deploy the application
destination:
server: https://kubernetes.default.svc
namespace: cert-manager
{{- end }}
С соответствующимvalues.yaml
файл для этой родительской диаграммы, который может выглядеть примерно так, как показано ниже, с указанием пути к нужным файлам значений в каталоге этой дочерней диаграммы.
targetRevision: v1.11.0
certManager:
enabled: true
valueFiles:
- "values.yaml"
clusterAutoScaler:
valueFiles:
- "envs/dev-account/saas/values.yaml"
clusterResourceLimits:
valueFiles:
- "values.yaml"
externalDns:
valueFiles:
- "envs/dev-account/saas/values.yaml"
ingressNginx:
enabled: true
valueFiles:
- "values.yaml"
Ниже приведен скриншот одного из моих приложений из каталога приложений для завершения примера.
В чистом Helm нет встроенного способа сделать это, но есть helmfile.
Ваш пример какhelmfile.yaml
:
releases:
- name: chart1 # name of the release (helm install <...> first_chart)
chart: repo1/first_chart
version: 1.2.3
namespace: foo
- name: chart2
chart: repo2/second_chart
version: 1.5.6
namespace: bar
# in case you want helmfile to automatically update repos
repositories:
- name: repo1
url: https://firstchart.repo
- name: repo2
url: https://secondchart.repo
Затем запустите:
-
helmfile sync
=> бежатьhelm install/upgrade
во всех выпусках или -
helmfile apply
=> то же, что и синхронизация, но сначала выполните diff, чтобы обновить/установить только измененные выпуски
В helmfile есть еще много чего, но это суть.
PS: если вы боретесь со значениями или хотите иметь что-то похожее на то, как обрабатываются значения зонтичной диаграммы, взгляните на helmfile: простой трюк для интуитивной обработки значений.