Helm:我们如何决定 Helm 模板中的缩进值?

Jib*_*in 8 kubernetes-helm

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

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

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

Pat*_*atS 9

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

一个例子

例如,创建一个图表:

mkdir testing-helm
cd testing-helm
helm create anvil
head -7 anvil/templates/service.yaml
Run Code Online (Sandbox Code Playgroud)

你会看到的:

apiVersion: v1
kind: Service
metadata:
  name: {{ include "anvil.fullname" . }}
  labels:
    {{- include "anvil.labels" . | nindent 4 }}
spec:
Run Code Online (Sandbox Code Playgroud)

因此,在此示例中,输出缩进 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:
Run Code Online (Sandbox Code Playgroud)

请注意,模板的输出在每行之前有 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:
Run Code Online (Sandbox Code Playgroud)

请注意,模板的输出现在每行前有 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
Run Code Online (Sandbox Code Playgroud)

当我添加 --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:

Run Code Online (Sandbox Code Playgroud)

我补充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:
Run Code Online (Sandbox Code Playgroud)

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