【问题标题】:helm getting subchart service names掌舵获取子图服务名称
【发布时间】:2018-08-14 23:46:48
【问题描述】:

让 helm 子图表服务名称引用到我的入口控制器中的最佳方法是什么,该控制器将位于父图表中

values.yaml
---
ingress:
  paths:
    - serviceName: app-1
      path: /app-1/*
      port: 8080
    - serviceName: app-2
      path: /app-2/*
      port: 8080


ingress.yaml 
---
{{- range .Values.ingress.paths }}
          - path: {{ .path }}
            backend:
              {{- $subchart := .serviceName -}}
              serviceName: {{- include "$subchart.fullname" .}}
              servicePort: {{ .port }}
        {{- end }}

模板:没有与模板“gotpl”关联的模板“$subchart.fullname”

【问题讨论】:

    标签: kubernetes yaml kubernetes-helm


    【解决方案1】:

    按版本限定的硬编码子图表名称怎么样?

    {{ .Release.Name }}-<subchart_name>

    【讨论】:

    • 名称长度超过 X 时会失败。因为大多数图表从模板函数中获取名称,该函数会截断组合名称。
    【解决方案2】:

    我发现引用服务名称的最佳方法是覆盖他们正在使用的模板。但是,这样做有一些注意事项。

    1. 子图表和您的图表将具有不同的上下文,因此它们很可能会以不同的方式呈现模板
    2. 有些东西只对子图可用

    大多数图表的 _helpers.tpl 文件中都有一个类似于下面的模板。

    {{/*
    Create a default fully qualified app name.
    We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
    If release name contains chart name it will be used as a full name.
    */}}
    {{- define "newchart.fullname" -}} 
    {{- if .Values.fullnameOverride }}
    {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
    {{- else }}
    {{- $name := default .Chart.Name .Values.nameOverride }}
    {{- if contains $name .Release.Name }}
    {{- .Release.Name | trunc 63 | trimSuffix "-" }}
    {{- else }}
    {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
    {{- end }}
    {{- end }}
    {{- end }}
    

    子图表的.Values 与您的图表不同。我们将在渲染此模板时通过创建类似于子图表上下文的上下文来解决此问题。

    我们不使用. 上下文调用它,而是通过将.Values 替换为子图表.Values 创建一个新上下文。

    {{ template "newchart.fullname" (set (deepCopy .) "Values" .Values.newchart }}
    

    我们使用 deepCopy,因此我们实际上不会更改 . 上下文,而是创建一个新的上下文来使用。

    子图表可以访问它自己的 .Chart 值,我们无法复制这些值。在这种情况下,我们必须将.Chart.Name 的值硬编码到模板中。在此我们可以将其替换为图表名称newchart

    完成此操作后,子图表上的nameOverridefullnameOverride 都可以正常工作,而无需手动更改模板文件中的任何内容。

    【讨论】:

      【解决方案3】:

      helm 3.7 版本已解决问题 https://github.com/helm/helm/pull/9957.
      你可以这样使用

      {{ template "bar.fullname" .Subcharts.bar }}
      

      【讨论】:

        【解决方案4】:

        如果子图表使用 _helpers.tpl 中的 fullname 函数(由 helm 默认为新图表提供),您可以使用它(将 postgresql 替换为子图表的名称):

        {{- $fullName := include "postgresql.fullname" (mustMerge (dict "Chart" (dict "Name" "postgresql") "Values" .Values.postgresql) (deepCopy .)) -}}
        

        【讨论】:

          【解决方案5】:

          这取决于子图的定义!

          例如,elasticsearch 图表(参见此处https://github.com/elastic/helm-charts/blob/master/elasticsearch/templates/service.yaml)定义了 2 个服务。

          两个服务名称都可以声明为值clusterName

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-03-15
            • 2021-06-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-08
            • 2020-06-12
            相关资源
            最近更新 更多