helm 模板输出显示值未解析

问题描述 投票:0回答:1

我是 Helm Charts 和 K8 的新手,所以请原谅我。 我正在开发一个项目,该项目部署一个应用程序项目,其中包含多个应用程序。 之前将图表放在一起的开发人员使用“查找和替换”技术来填充图像存储库、标签等的值。这使得我们的 CICD 管道开发变得棘手且不可扩展。 我正在尝试更新图表以使用变量和values.yml 文件。 其中大部分似乎都有效,除了一部分之外,值都被传递到模板,我不明白为什么。 这是一个很大的项目,所以我不会复制所有的图表文件。我会尽力列出重要部分:

文件夹结构:

helm
  project1
     dev
       charts
          app1
            templates
               *template files
            Chart.yaml
            values.yaml
          app2
            *same subfolders
          app3
            *same subfolders
       Chart.yml
       values.yml

基础值.yml

artifactory_base_url: company.repo.io/repo_folder
imageversions:
  app1_tag: 6.1.2-alpine-edge
  app2_tag: 8.1.0.0-edge
  app3_tag: 8.1.0.0-alpine-edge
  app4_tag: 10.1.1-alpine-edge
  initcontainer: latest

App Values.yml 文件

app:
  image: 
    repository: "{{ .Values.artifactory_base_url }}/pingaccess"
    tag: "{{ .Values.pa_tag }}"

deployment.yml 模板文件

containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.app.image }}"

我正在运行以下 helm 模板命令,以确认在实际尝试部署到 k8s 集群之前,我至少获得了 app1 部分的正确输出。

helm template app1 --set date="$EPOCHSECONDS" --set namespace='porject_namespace' --values helm/project1/dev/values.yaml helm/project1/dev/charts/app1

大多数生成的 yaml 看起来都很棒,而且看起来我在基本 value.yml 文件中定义的值正在其他区域中传递,如本例所示:

initContainers:
  - name: appinitcontainer
      image: "company.repo.io/repo_folder/initcontainer:latest"

但是从部署.yml 模板文件中填充的一部分仍然显示变量的大括号

containers:
  - name: app1
    image: "map[repository:{{ .Values.image_repo_base_url }}/app1 tag:{{ .Values.app1_tag }}]"
    imagePullPolicy: Always

我尝试对上述所有文件进行更改以删除引号、使用单引号等。在这些尝试中,我通常会收到以下错误的变体: “将 yaml 转换为 json 时出错。未找到预期的密钥” “错误映射值”

我还没找到解决办法。 我假设“helm template”命令不应该包含任何这样的大括号,所有变量和值都应该被解析。 我希望有人可以提供一些我可能缺少的东西的提示。

kubernetes-helm
1个回答
0
投票

您在这里遇到了两个问题。 首先,

.Values.app.image
是一个包含两个键
repository
tag
的映射;这就是为什么你在输出中得到奇怪的
map[repository:... tag:...]
语法。 其次,
values.yaml
中的字符串值不会针对 Helm 模板语法进行重新解释;这就是为什么
{{ ... }}
标记被传递到输出。

这又意味着您需要做两件事。 要解析映射,请根据字典的内容构造字符串;要解析字符串值内的模板标记,请使用 Helm 的

tpl
函数。

{{- $repository := tpl .Values.app.image.repository . }}
{{- $tag := tpl .Values.app.image.tag . }}
image: "{{ $repository }}:{{ $tag }}"

(您可能会发现将“存储库”、“注册表”或“图像”和“标签”分成三个单独的部分很有用,因为可能所有图像都来自同一个存储库;这将允许您配置存储库在一个位置并自定义每个组件的图像名称

bitnami/postgresql
图表就是此设置的一个示例。)

© www.soinside.com 2019 - 2024. All rights reserved.