我正在创建一个Helm图表,该图表依赖于我未维护的多个Helm图表,我想对这些子图表进行一些配置。配置不是太复杂,我只想向每个容器添加几个环境变量。但是,容器的env
字段尚未在Helm图表中模板化。我想避免分叉这些图表并自己维护它们,因为这是一个微不足道的变化。
是否有一种简便的方法可以通过Helm或其他工具灵活地为Kubernetes中的多个容器提供环境变量?
我目前正在考虑在Helm填写完模板后使用Kustomize进行最后一英里的更改,但是我很想设置Kustomize补丁。在我的场景中,Helm在ConfigMap中填写了环境变量。我想添加一个envFrom
字段以读取ConfigMap并将给定的环境变量添加到容器中。我想通过Kustomize将envFrom添加到资源YAML文件中。我遇到的障碍是Kustomize patch.yaml文件是特定于资源的。下面分别是我的patch.yaml
和我的kustomization.yaml
的示例。
patch.yaml
:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: does-not-matter
spec:
template:
spec:
containers:
- name: server
envFrom:
- configMapRef:
name: my-env
kustomization.yaml
:
resources:
- all.yaml
patches:
- path: patch.yaml
target:
kind: "StatefulSet"
name: "*"
要执行Kustomization,我运行:
helm install perceptor ../ --post-renderer ./kustomize
基本上只是填写Helm模板,然后将它们传递给Kustomize进行最后一英里的补丁。
在补丁中,我必须指定容器(“服务器”)的名称才能正确注入我的configMap。我真正想做的是能够将这些环境变量提供给给定部署中的所有容器(由target
中的kustomization.yaml
约束定义),而不管它们的名称如何。从我所看到的情况来看,几乎好像我将不得不为每个容器编写一个单独的补丁,这是次优的。我只是开始使用Kubernetes,所以我可能缺少一些可以轻松解决此问题的东西。
我了解,您不想通过分叉图表来打破子图表的打开/关闭原理,但是您仍然有权通过使其更具扩展性和灵活性来提出对其进行更改的权利。是的,我建议您在上下文中向“舵图”项目提交“拉取请求/新功能”。
以下代码片段不会破坏当前功能,并且使用户有机会根据所需资源的规范中的现有ConfigMap引入自定义环境变量。
helm_template.yaml
#helm template
...
env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
{{- if .Values.envConfigs }}
{{- range $key, $config := $.Values.envConfigs }}
- name: {{ $key }}
valueFrom:
configMapKeyRef:
name: {{ $config }}
key: {{ $key | quote }}
{{- end }}
{{- end }}
values.yaml
#
# values.yaml
#
envConfigs:
Q3_CFG_MAP: Q3DM17
Q3_CFG_TIMEOUT: 30
# if empty use:
# envConfigs: {}