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 会输出错误信息,说明哪里出了问题。

参考:

### 使用 Helm 渲染模板文件 HelmKubernetes 的包管理工具,它通过模板引擎来生成 Kubernetes 配置文件。以下是关于如何使用 Helm 渲染模板文件的相关说明。 #### 模板渲染机制 Helm 使用 Go 模板语法作为其模板语言[^1]。开发者可以通过编写 `.yaml` 文件中的占位符变量,在运行时由 Helm 将这些变量替换为实际值。这种动态生成配置的方式极大地提高了灵活性和可维护性。 #### 渲染模板的关键命令 为了单独渲染 Helm 模板而不执行部署操作,可以使用 `helm template` 命令。该命令会基于指定的 Chart 和参数生成最终的 Kubernetes YAML 文件,而不会将其应用到集群中。 ```bash helm template release-name path/to/chart --values=path/to/values.yaml ``` 上述命令的作用如下: - **release-name**: 自定义发布名称。 - **path/to/chart**: 表示目标 Helm Chart 所在路径。 - **--values=path/to/values.yaml**: 提供自定义参数文件以覆盖默认设置。 此过程允许用户预览即将被部署的内容并验证其正确性。 #### 示例代码展示 下面是一个简单的例子,演示了如何创建一个包含 Pod 定义的基础 Helm Chart 并对其进行模板渲染: ##### 创建基础 Chart 结构 假设我们有一个名为 mychart 的简单 Helm Chart,其中 templates/deployment.yaml 文件内容如下所示: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }}-deployment spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ .Chart.Name }} template: metadata: labels: app: {{ .Chart.Name }} spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" ports: - containerPort: {{ .Values.service.port }} ``` ##### values.yaml 参数设定 对应的 values.yaml 可能看起来像这样: ```yaml replicaCount: 2 image: repository: nginx tag: latest service: port: 80 ``` ##### 运行 helm template 查看结果 当执行以下命令时, ```bash helm template test-release ./mychart/ ``` 将会得到类似于这样的输出(部分省略): ```yaml --- # Source: mychart/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: test-release-deployment ... ``` 这表明所有的模板标签都被成功解析成了具体的数值。 #### 总结 通过以上介绍可以看出,利用 `helm template` 不仅能够帮助开发人员更好地理解整个资源结构,还能有效减少因错误配置引发的风险。同时,这也体现了 Helm 在复杂环境下的强大适应能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

k8s-open

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

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

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

打赏作者

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

抵扣说明:

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

余额充值