我是 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”命令不应该包含任何这样的大括号,所有变量和值都应该被解析。 我希望有人可以提供一些我可能缺少的东西的提示。
您在这里遇到了两个问题。 首先,
.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
图表就是此设置的一个示例。)