使用 "template inheritance" 更改 Helm 子图表的模板文件



我想从公共Helm图表存储库中获取一个现有的Helm图表,并告诉Helm通过在模板文件中添加额外的行来更改其模板的一部分。

下面是一个例子。有一个名为basic-app(我不控制)的Helm图表,这是一个简单的基于apache的web应用程序。下面是其中一个模板文件,它创建了一个部署:

apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.APP_NAMESPACE }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Chart.Name }}
template:
metadata:
labels:
app: {{ .Chart.Name }}
spec:
## CONTAINERS
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.apache.port }}
protocol: TCP
volumeMounts:
- name: secrets-yaml
mountPath: /etc/myapp/secrets.yaml
subPath: secrets.yaml
## VOLUMES
volumes:
- name: secrets-yaml
secret:
secretName: {{ .Values.APP_NAMESPACE }}-secrets-yaml

basic-app图表对我来说工作得很好,除了我想添加一个新的秘密。也就是说,我希望得到的部署模板与上面类似,只是我想为新的秘密添加第二个卷和卷挂载:

apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.APP_NAMESPACE }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Chart.Name }}
template:
metadata:
labels:
app: {{ .Chart.Name }}
spec:
## CONTAINERS
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.apache.port }}
protocol: TCP
volumeMounts:
- name: secrets-yaml
mountPath: /etc/myapp/secrets.yaml
subPath: secrets.yaml
# This is new.    
- name: secrets-new-yaml
mountPath: /etc/myapp/secrets-new.yaml
subPath: secrets-new.yaml           
## VOLUMES
volumes:
- name: secrets-yaml
secret:
secretName: {{ .Values.APP_NAMESPACE }}-secrets-yaml
# This is new.
- name: secrets-new-yaml
secret:
secretName: {{ .Values.APP_NAMESPACE }}-secrets-new-yaml        
实现这一点的一种方法是通过复制basic-app并将额外的秘密添加到部署模板中来创建一个新图表。但是,由于许多原因,这种方法是不可取的,其中最重要的是对basic-app的更改和修复将不会出现在复制的图表中。

另一种方法是通过添加一些条件代码来改变basic-app本身,这些条件代码只在某个值为真时插入它。但是,这意味着让维护者进行更改,而维护者出于良好的理由,可能不希望对他们的图表进行这种特定于站点的更改。

理想情况下,就像面向对象编程中的类继承一样,我希望Helm简单地采用现有的basic-app图表并将这个新秘密注入其部署模板。这可能吗?

您不能按照您建议的方式操作或包装defined模板函数。Gotext/template语言不提供任何机制来重新定义或修改模板,一旦它被定义。

Helm确实有后渲染的概念,允许您在生成YAML之后操作它。这可以是任何在标准输入上接受YAML并在标准输出上产生YAML的可执行文件;在实践中,它似乎可能需要一个调用更复杂工具的脚本。该文档包含一个指向基于customize的示例的链接。

如果你有可用的yq,你可以使用它作为后渲染器(未经测试):

#!/bin/sh
yq -M eval 'select(.Kind == "Deployment") | .spec.template.spec.containers.[0].volumeMounts += {name: secrets-new-yaml, mountPath: /etc/myapp/secrets-new.yaml, subPath: secrets-new.yaml}' -
helm template . --post-renderer ./add-secrets.sh
写完这篇文章,我可能会选择Kustomize而不是yq。您需要一个复杂的目录树和一些更多的设置来使用Kustomize,但是您需要分别安装yq或Kustomize才能使用它们,并且似乎没有办法传递yq脚本。除了作为单个命令行参数;考虑到您试图添加的结构的数量,它很快就会变得笨拙。

最新更新