具有自定义值文件的 Nil 指针评估接口

Nil pointer evaluating interface with custom values file

我正在制作一个包含多个子图表的伞状图表。 在顶层,我有一个文件 values-ext.yaml,其中包含一些在子图表中使用的值。

sql:
  common:
    host: <SQL Server host>
    user: <SQL user>
    pwd: <SQL password>

这些设置在子图表的 configmap.yaml 中读取。在这种情况下,SQL 服务器连接字符串是根据这些设置构建的。

apiVersion: v1
kind: ConfigMap
metadata:
  name: "childchart-config"
  labels:
    app: some-app
    chart: my-child-chart
data:
  ConnectionStrings__DbConnection: Server={{ .Values.sql.common.host }};Database=some-db

我像这样从伞形图目录中测试图表:helm template --values values-ext.yaml . 它给了我这个错误:

executing "my-project/charts/child-chart/templates/configmap.yaml" at <.Values.sql.common.host>: 
nil pointer evaluating interface {}.host

所以,它显然无法从 values-ext.yaml 文件中找到我想要读取的值。 我应该能够像这样传递额外的值文件,对吧? 我也尝试过 $.Values.sql.common.host 但它似乎并不重要。

这是怎么回事?

渲染子图表时,它们的 .Valuesa subset of the parent chart values。使用 $.Values 来“转义”当前范围根本不会影响这一点。所以在 child-chart 中,.Values 实际上指的是 .Values.child-chart 在父级中所指的内容。

您可以为此做三件事:

  1. 在 YAML 文件中将设置下移一级;您必须为每个子图表重复它们,但它们可以不加修改地使用。

    child-chart:
      sql:
        common: { ... }
    
  2. 将设置移动到 global: 键下。所有引用此值的图表都必须引用 .Values.global.sql...,但它在父图表和子图表中保持一致。

    global:
      sql:
        common: { ... }
    
    ConnectionStrings__DbConnection: Server={{ .Values.global.sql.common.host }};...
    
  3. 在父图表中创建ConfigMap,并在子图表中间接引用它。了解所有图表都将作为同一 Helm 版本的一部分进行安装会有所帮助,如果您使用标准的 {{ .Release.Name }}-{{ .Chart.Name }}-suffix 命名模式,则 .Release.Name 在所有上下文中都是相同的.

    # in a child chart, that knows it's being included by the parent
    env:
      - name: DB_CONNECTION
        valueFrom:
          configMapKeyRef:
            name: '{{ .Release.Name }}-parent-dbconfig'
            key: ConnectionStrings__DbConnection