Kubernetes 是否可以从helm subchart模板中提取样板YAML?

Kubernetes 是否可以从helm subchart模板中提取样板YAML?,kubernetes,yaml,kubernetes-helm,Kubernetes,Yaml,Kubernetes Helm,有没有办法将样板YAML从subchart模板移动到parent\u helpers.tpl或values.YAML 掌舵项目 MyHelmApp │ ├── Chart.yaml ├── values.yaml ├── templates │   ├── _helpers.tpl │   ├── configmap.yaml │   └── app-ingress-rules.yaml │ └── charts

有没有办法将样板YAML从subchart模板移动到parent\u helpers.tpl或values.YAML

掌舵项目

    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

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)
详细说明:我有3个子应用程序,它们的模板中都有样板YAML。这些模板中的值在父图表的values.yaml中定义,变量路径相同。例如:

app1、app2和app3部署。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(在父图表中)


回到问题上来:我想获取子图表模板中的相同内容,并将其移动到一个集中的位置,如父图表的_helpers.tpl或values.yaml;这可能吗?你能举例说明你是如何做到这一点的吗

Helm在一个具有共享模板名称空间的单一执行环境中,从所有父级和依赖关系图一起呈现它给定的所有YAML。从理论上讲,
app1
图表可以依赖于在父级的
\u 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的碎片“推”到其他位置的物体中(相对较新的Kubernetes的一部分可以做到这一点)。每个对象都必须为自己声明可能允许的任何潜在自定义。因此,在每个图表中,您必须声明

spec:
{{ include "common.probes" . | indent 2 }}
公共图表只定义模板,当调用它们时,它们将使用本地化到子图表的
.Values
版本

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