helm template 模版渲染 Kubernetes 资源清单(YAML 文件)

项目场景:

提示:这里简述项目相关背景:

chart 中使用了 CronJob 资源,该 chart 需同时兼容 v1.20、v1.24、v1.28 三个k8s集群版本,
但 从 v1.25 版本开始不再提供 batch/v1beta1API 版本的 CronJob。


问题描述

提示:这里描述项目中遇到的问题:

通过 .Capabilities.KubeVersion.Version Helm 内置对象来查询集群版本,根据集群版本来选择使用 batch/v1beta1 API 版本或 batch/v1 API 版本的CronJob资源。
判断逻辑:如果集群版本大于等于 v1.24.0,则使用 apiVersion: batch/v1,否则使用 apiVersion: batch/v1beta1
yaml 示例如下:

{{- if semverCompare ">=1.24-0" .Capabilities.KubeVersion.Version }}
apiVersion: batch/v1
{{- else }}
apiVersion: batch/v1beta1
{{- end }}
kind: CronJob

通过 helm template 命令在 v1.20、v1.24、v1.28 三个k8s集群进行验证,发现输出结果一直是 apiVersion: batch/v1beta1。

helm template 命令:

helm template my-release ./
测试集群版本期望的 apiVersion实际的 apiVersion
v1.20batch/v1beta1batch/v1beta1
v1.24batch/v1batch/v1beta1
v1.28batch/v1batch/v1beta1

期望的结果与实际的结果不符。


原因分析:

提示:这里填写问题的分析:

既然结果一直是 apiVersion: batch/v1beta1,说明 {{- if semverCompare ">=1.24-0" .Capabilities.KubeVersion.Version }} 这个判断没有通过,进而说明 .Capabilities.KubeVersion.Version 是小于 v1.24的,那么问题来了:为什么在 v1.24、v1.28 两个k8s集群上该对象一直小于 v1.24 呢?

我们找个测试 chart 来验证下:

为了展示 Helm 中的内置对象 Capabilities 及其属性,可以通过创建一个测试 Helm Chart 并在其中包含一个测试 ConfigMap 文件来查看这些信息。以下是具体的步骤和示例代码。

1. 创建 Helm Chart

首先,确保你已经安装了 Helm。然后运行以下命令来创建一个新的 Helm Chart:

helm create test-chart

2. 创建测试 ConfigMap 模板

test-chart/templates/ 目录下,创建一个名为 configmap.yaml 的文件,并在其中使用 Capabilities 对象的各种属性:

yaml 示例如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  kubeVersion: {{ .Capabilities.KubeVersion.Version | quote }}
  kubeMajorVersion: {{ .Capabilities.KubeVersion.Major | quote }}
  kubeMinorVersion: {{ .Capabilities.KubeVersion.Minor | quote }}

3. 模版渲染 Helm Chart

现在你已经定义了模板文件和默认值,你可以使用 Helm 渲染这个 Chart 并测试它。

首先,确保你已经有一个 Kubernetes 集群在运行,并且 kubectl 已经配置好连接到集群。

然后运行以下命令来安装 Helm Chart:

helm template my-release ./ --show-only templates/configmap.yaml

这个命令会使用 test-chart 目录下的 Chart 并将其安装到 Kubernetes 集群中,Release 名称为 my-release。

你应该会看到类似以下的输出,其中包含了
Capabilities 对象的各种属性信息:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-release-configmap
data:
  kubeVersion: "v1.20.0"
  kubeMajorVersion: "1"
  kubeMinorVersion: "20"

通过这些步骤,你已经成功创建了一个 Helm Chart,并使用了 Capabilities 对象来查看 Kubernetes 集群和 Helm 的相关信息。这个测试 ConfigMap 文件展示了如何在模板中使用这些内置对象和属性。

测试结果:

测试集群版本期望的 kubeVersion实际的 kubeVersion
v1.20v1.20.0v1.20.0
v1.24v1.24.3v1.20.0
v1.28v1.28.13v1.20.0

期望的结果与实际的结果不符。

于是各种搜索,终于在某个github issue上看到某个参数 --validate

然后运行以下命令来渲染 Helm Chart:

helm template my-release ./ --validate --show-only templates/configmap.yaml

这个命令会使用 test-chart 目录下的 Chart 并将其安装到 Kubernetes 集群中,Release 名称为 my-release。

测试结果:

测试集群版本期望的 kubeVersion实际的 kubeVersion
v1.20v1.20.15v1.20.15
v1.24v1.24.3v1.24.3
v1.28v1.28.13v1.28.13

期望的结果与实际的结果相符。


解决方案:

提示:这里填写该问题的具体解决方案:

helm template 是 Helm 命令行工具中的一个命令,它用于将 Chart 模板渲染成 Kubernetes 资源清单(YAML 文件),而不实际将其部署到 Kubernetes 集群中。这个命令对于调试和验证模板的渲染结果非常有用。

具体来说,helm template --validate 选项用于在生成的清单文件上运行 Kubernetes API 服务器的验证。它会检查生成的 YAML 文件是否符合 Kubernetes 的 API 规范。这对于提前发现模板中的错误和不符合 Kubernetes 规范的问题非常有帮助。

以下是 helm template --validate 的主要用途和工作原理:

  • 模板渲染:helm template 会渲染 Chart 模板,并生成对应的 Kubernetes 资源清单(YAML 文件)。
  • 验证:添加 --validate 选项后,Helm 会将生成的 YAML 文件发送给 Kubernetes API 服务器进行验证。API 服务器会检查这些 YAML 文件是否符合 Kubernetes 的 API 规范。
  • 输出:如果验证通过,Helm 会输出渲染后的 YAML 文件。如果验证失败,Helm 会输出错误信息,说明哪里出了问题。

参考:

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

k8s-open

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值