2

我正在创建一个依赖于我未维护的几个 Helm 图表的 Helm 图表,我想对这些子图表进行一些配置。配置并不太复杂,我只想为每个容器添加几个环境变量。但是,env容器的字段尚未在 Helm 图表中模板化。我想避免分叉这些图表并自己维护它们,因为这是一个微不足道的变化。

有没有一种简单的方法可以通过 Helm 或其他工具灵活地为 Kubernetes 中的多个容器提供环境变量?

我目前正在研究在 Helm 填写模板后使用 Kustomize 进行最后一英里的更改,但我对设置 Kustomize 补丁程序感到困惑。在我的场景中,Helm 在 ConfigMap 中填写了环境变量。我想添加一个envFrom字段来读取 ConfigMap 并将给定的环境变量添加到容器中。我想通过 Kustomize 将 envFrom 添加到资源 YAML 文件中。我遇到的问题是 Kustomize patch.yaml 文件是资源特定的。下面分别是 mypatch.yaml和 my的示例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,所以我可能遗漏了一些可以轻松解决这个问题的东西。

4

1 回答 1

2

我理解,您不想通过分叉来破坏您的伞形图所依赖的子图的打开/关闭原则,但您仍然有权通过使其更具可扩展性和灵活性来提议对其进行更改。是的,我建议您在上下文中向 helm chart 项目提交拉取请求/请求新功能。

以下代码片段不会破坏当前功能,并让用户有机会根据所需资源的规范中的现有 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 }}

值.yaml

#
# values.yaml
#
envConfigs:
  Q3_CFG_MAP: Q3DM17
  Q3_CFG_TIMEOUT: 30

# if empty use: 
# envConfigs: {}
于 2020-04-21T11:21:07.960 回答