Можно ли абстрагировать шаблонный YAML от шаблонов подшлемов руля? - PullRequest
0 голосов
/ 01 ноября 2019

Есть ли способ перенести шаблонный YAML из шаблонов дочерних диаграмм в родительский _helpers.tpl или values.yaml ?

helm project

    MyHelmApp
    │
    ├── Chart.yaml
    ├── values.yaml
    ├── templates
    │   ├── _helpers.tpl
    │   ├── configmap.yaml
    │   └── app-ingress-rules.yaml
    │
    └── charts
        │
        ├── app1
        │   ├── Chart.yaml
        │   ├── templates
        │   │   ├── _helpers.tpl
        │   │   ├── deployment.yaml
        │   │   └── service.yaml
        │   └── values.yaml
        ├── app2
        │   ├── Chart.yaml
        │   ├── templates
        │   │   ├── _helpers.tpl
        │   │   ├── deployment.yaml
        │   │   └── service.yaml
        │   └── values.yaml
        └── app3
            ├── Chart.yaml
            ├── templates
            │   ├── _helpers.tpl
            │   ├── deployment.yaml
            │   └── service.yaml
            └── values.yaml

Для уточнения: у меня есть 3 подпункта приложения, и у каждого из них есть шаблон YAML в их шаблонах. Значения в этих шаблонах определены в файле values.yaml родительской диаграммы, а пути к переменным идентичны. Например:

app1, app2 и app3 deploy.yaml все содержат ...

          livenessProbe:
            httpGet:
              path: {{ .Values.health.livenessProbe.path }}
              port: {{ .Values.health.livenessProbe.port }}
            initialDelaySeconds: {{ .Values.health.livenessProbe.initialDelaySeconds }}
            periodSeconds: {{ .Values.health.livenessProbe.periodSeconds }}
            timeoutSeconds: {{ .Values.health.livenessProbe.timeoutSeconds }}
            successThreshold: {{ .Values.health.livenessProbe.successThreshold }}
            failureThreshold: {{ .Values.health.readinessProbe.failureThreshold }}

          readinessProbe:
            tcpSocket:
              port: {{ .Values.health.readinessProbe.port }}
            initialDelaySeconds: {{ .Values.health.readinessProbe.initialDelaySeconds }}
            periodSeconds: {{ .Values.health.readinessProbe.periodSeconds }}
            timeoutSeconds: {{ .Values.health.readinessProbe.timeoutSeconds }}
            successThreshold: {{ .Values.health.livenessProbe.successThreshold }}
            failureThreshold: {{ .Values.health.readinessProbe.failureThreshold }}

values.yaml (в родительской диаграмме)

app1:
  health:
    livenessProbe:
      path: /system_health
      port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20
      timeoutSeconds: 5
      successThreshold: 1
      failureThreshold: 3
    readinessProbe:
      port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
      timeoutSeconds: 5
      successThreshold: 1
      failureThreshold: 3

app2:
  health:
    livenessProbe:
      path: /system_health
      port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20
      timeoutSeconds: 5
      successThreshold: 1
      failureThreshold: 3
    readinessProbe:
      port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
      timeoutSeconds: 5
      successThreshold: 1
      failureThreshold: 3

(etc)

Возвращаясь к вопросу: я хотел бы взять то, что идентично в шаблонах вложенных диаграмм, и переместить его в одно централизованное место, например, _helpers.tpl или values.yaml родительской диаграммы;Это возможно? Можете ли вы привести пример того, как вы это сделаете?

1 Ответ

1 голос
/ 02 ноября 2019

Helm отображает весь YAML, который он дает, из всех родительских и зависимых диаграмм вместе, в одной среде выполнения с общим пространством имен шаблонов. Теоретически, диаграмма app1 может зависеть от шаблона, который определен в родительском _helpers.tpl, и в показанном вами конкретном макете он будет работать.

Из-за этой настройки среды также возможнонапишите «диаграмму», которая на самом деле не производит никаких собственных YAML, а просто содержит шаблоны. Шлем 3 будет включать в себя «библиотечный график» в качестве конкретной концепции. Лучшим вариантом по-прежнему будет иметь библиотеку с вашими общими шаблонами и ссылку на нее.

MyHelmApp
\-- charts
  +-- app1
  | +-- Chart.yaml
  | \-- templates/...
  \-- common
    +-- Chart.yaml
    \-- templates
      \-- _helpers.tpl
          (but no *.yaml)

Теперь MyHelmApp зависит от app1, app2, app3 и каждого из них. те зависят от common. Это позволило бы установить любого из них независимо от их братьев и сестер.

У Хелма нет способа «протолкнуть» фрагменты YAML в объекты в других местах ( Kustomize , часть относительноНедавние Кубернетес, может это сделать). Каждый объект должен объявить для себя любую потенциальную настройку, которая может быть разрешена. Таким образом, в каждой диаграмме вам нужно было бы объявить

spec:
{{ include "common.probes" . | indent 2 }}

Общая диаграмма просто определяет шаблоны, и при их вызове они будут использовать версию .Values, локализованную на подкарте.

{{- define "common.probes" -}}
livenessProbe:
  httpGet:
    path: {{ .Values.health.livenessProbe.path }}
    et: cetera
{{ end -}}
...