【问题标题】:Alter template file of a Helm subchart using "template inheritance"使用“模板继承”更改 Helm 子图的模板文件
【发布时间】:2021-02-05 20:20:51
【问题描述】:

我想从公共 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 图表并将这个新秘密注入其部署模板。这可能吗?

【问题讨论】:

    标签: inheritance kubernetes-helm


    【解决方案1】:

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

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

    如果您有 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 “脚本”;考虑到您尝试添加的结构数量,它很快就会变得笨拙。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 2018-08-18
      • 2014-06-09
      • 1970-01-01
      • 2022-08-16
      相关资源
      最近更新 更多