项目场景:
提示:这里简述项目相关背景:
chart 中使用了 CronJob 资源,该 chart 需同时兼容 v1.20、v1.24、v1.28 三个k8s集群版本,
但 从 v1.25 版本开始不再提供 batch/v1beta1API 版本的 CronJob。
- 迁移清单和 API 客户端使用batch/v1API 版本,此 API 从 v1.21 版本开始可用;
- 所有的已保存的对象都可以通过新的 API 来访问;
已弃用 API 的迁移指南:https://kubernetes.io/zh-cn/docs/reference/using-api/deprecation-guide/
问题描述
提示:这里描述项目中遇到的问题:
通过 .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.20 | batch/v1beta1 | batch/v1beta1 |
v1.24 | batch/v1 | batch/v1beta1 |
v1.28 | batch/v1 | batch/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.20 | v1.20.0 | v1.20.0 |
v1.24 | v1.24.3 | v1.20.0 |
v1.28 | v1.28.13 | v1.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.20 | v1.20.15 | v1.20.15 |
v1.24 | v1.24.3 | v1.24.3 |
v1.28 | v1.28.13 | v1.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 会输出错误信息,说明哪里出了问题。