Helm 模板.. 值匹配

Helm templating.. values match

想知道是否可以使用值中存在的端口,否则使用 http.. 类似这样的东西;

svc:
  app:
    ports:
      - port: 8080
        name: http
      - port: 8090
        name: metrics
  app2:
    ports:
      - port: 8080
        name: http

有些服务通过 http 公开它们的指标,有些服务有指标端口。所以我想将其模板化为类似的东西;

{{ define "app.service.ports" }}
{{ range (index .Values.svc (include "app.refName" .) "ports") }}
- name: {{ .name }}
{{ end }}
{{ end }}

这会正确提取每个端口名称,但我想提取指标(如果存在),否则提取 http.. 有人可以指出正确的方向吗?

Go text/template 语言和 Helm 扩展都无法在像这样的复杂结构中进行通用查找。相反,您需要手动遍历列表并使用变量来记住您所看到的内容。

{{- $ports := index .Values "svc" (include "app.refName" .) "ports" -}}

{{-/* Set up variables to remember what we've seen.  Initialize them
      to an empty dictionary, which is false in a conditional. -*/}}
{{- $httpPort := dict -}}
{{- $metricsPort := dict -}}

{{-/* Scan the list of ports. */-}}
{{- range $port := range $ports -}}
  {{- if eq $port.name "metrics" -}}
    {{- $metricsPort = $port -}}
  {{- else if eq $port.name "http" -}}
    {{- $httpPort = $port -}}
  {{- end -}}
{{- end -}}

{{-/* Emit the metrics port if it exists, else the HTTP port. */-}}
{{- coalesce $metricsPort $httpPort | toYaml -}}

在 higher-level 语言中,您可以想象搜索一个列表,并且对于每个字典元素,如果它具有 name 键值 metrics,则接受它。这通常涉及将 lambda 或匿名函数传递给 find() 函数,而 text/template 语言不支持该功能。