1

我已经看到{{ toYaml .Values.deployment.updateStrategy | indent 4 }}了 - 这在我们的 helm 部署 yaml 之一中。我想知道如何确定缩进为 4?

在同一 yaml 的另一行中{{ toYaml .Values.imagePullSecrets | indent 8 }},缩进设置为 8。

如何计算 yaml 文件中的缩进值?

4

1 回答 1

1

4 或 8 的缩进取决于 YAML 文件的当前缩进。如果您需要输出为 4 个空格,则使用 4,如果您需要输出为 8 个空格(与周围的 YAML 对齐,则使用 8)。

一个例子

例如,创建一个图表:

mkdir testing-helm
cd testing-helm
helm create anvil
head -7 anvil/templates/service.yaml

你会看到的:

apiVersion: v1
kind: Service
metadata:
  name: {{ include "anvil.fullname" . }}
  labels:
    {{- include "anvil.labels" . | nindent 4 }}
spec:

所以在这个例子中,输出缩进 4 个空格。当通过生成输出时,helm template anvil您会看到:

# Source: anvil/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: RELEASE-NAME-anvil
  labels:
    helm.sh/chart: anvil-0.1.0               # <<<--- From Template
    app.kubernetes.io/name: anvil            # <<<--- From Template
    app.kubernetes.io/instance: RELEASE-NAME # <<<--- From Template
    app.kubernetes.io/version: "1.16.0"      # <<<--- From Template
    app.kubernetes.io/managed-by: Helm       # <<<--- From Template
spec:

请注意,模板的输出在每行之前有 4 个空格,因此输出显然是labels:属性的一部分。

现在将输出从 4 个空格更改为 8 个空格

如果我们将缩进更改为 8,语法将如下所示:

# Source: anvil/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: RELEASE-NAME-anvil
  labels:
        helm.sh/chart: anvil-0.1.0               # <<<--- From Template
        app.kubernetes.io/name: anvil            # <<<--- From Template
        app.kubernetes.io/instance: RELEASE-NAME # <<<--- From Template
        app.kubernetes.io/version: "1.16.0"      # <<<--- From Template
        app.kubernetes.io/managed-by: Helm       # <<<--- From Template
spec:

请注意,模板的输出现在每行前有 8 个空格。

因此选择该数字以适当地格式化 YAML。根据周围的 YAML,生成的输出可能会产生格式错误的 YAML 语法,这会在尝试解析它时导致错误。

如果您想查看更改是否有效,可以使用http://www.yamllint.com/上的在线 YAML 验证器。

现在将输出从 4 个空格更改为 1 个空格(无效的 YAML 语法)

将输出更改为 1 个空格时,生成的 YAML 无效。

运行helm template会报错:

helm template anvil
Error: YAML parse error on anvil/templates/service.yaml: error converting YAML to JSON: yaml: line 5:
 did not find expected key

Use --debug flag to render out invalid YAML

当我添加 --debug 标志时,我可以看到以下输出,它不再是有效的 YAML 语法。

helm template anvil --debug
. . . trimmed output . . .
# Source: anvil/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: RELEASE-NAME-anvil
  labels:
 helm.sh/chart: anvil-0.1.0                # <<<--- From Template
 app.kubernetes.io/name: anvil             # <<<--- From Template
 app.kubernetes.io/instance: RELEASE-NAME  # <<<--- From Template
 app.kubernetes.io/version: "1.16.0"       # <<<--- From Template
 app.kubernetes.io/managed-by: Helm        # <<<--- From Template
    another: value                         # I added 
spec:

我添加another: value了正确缩进,以便更容易看到模板中的缩进无效。

以下是anvil/templates/service.yaml文件如何查找上述测试:

head -8 anvil/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ include "anvil.fullname" . }}
  labels:
    {{- include "anvil.labels" . | nindent 1 }}
    another: value
spec:

因此,即使源看起来缩进正确,生成的结果输出格式也不正确。另请参阅 helm 语法 {{ something }} 和 {{- something }} 有什么区别?为了更好地理解为什么缩进在源代码中看起来不错,但产生的输出无效。

于 2021-04-28T17:40:23.403 回答