图表测试
图表包含多个 Kubernetes 资源和组件,它们协同工作。作为图表作者,您可能想要编写一些测试来验证您的图表在安装时按预期工作。这些测试还有助于图表使用者了解您的图表应该做什么。
Helm 图表中的**测试**位于 templates/
目录下,是一个作业定义,它指定一个包含要执行的给定命令的容器。对于测试被认为成功,容器应该成功退出(退出代码为 0)。作业定义必须包含 Helm 测试钩子注释:helm.sh/hook: test
。
请注意,直到 Helm v3 之前,作业定义需要包含以下其中一个 Helm 测试钩子注释:helm.sh/hook: test-success
或 helm.sh/hook: test-failure
。helm.sh/hook: test-success
仍然被接受,作为 helm.sh/hook: test
的向后兼容替代方案。
示例测试
- 验证来自 values.yaml 文件的配置是否已正确注入。
- 确保您的用户名和密码正常工作。
- 确保不正确的用户名和密码无法工作。
- 断言您的服务已启动并正确地进行负载均衡。
- 等等。
您可以使用命令 helm test <RELEASE_NAME>
在发布时运行 Helm 中的预定义测试。对于图表使用者来说,这是一种很好的方法,可以检查其图表(或应用程序)的发布是否按预期工作。
示例测试
该 helm create 命令将自动创建多个文件夹和文件。要尝试 Helm 测试功能,首先创建一个演示 Helm 图表。
$ helm create demo
您现在将在演示 Helm 图表中看到以下结构。
demo/
Chart.yaml
values.yaml
charts/
templates/
templates/tests/test-connection.yaml
在 demo/templates/tests/test-connection.yaml
中,您将看到可以尝试的测试。您可以在这里看到 Helm 测试 pod 定义。
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "demo.fullname" . }}-test-connection"
labels:
{{- include "demo.labels" . | nindent 4 }}
annotations:
"helm.sh/hook": test
spec:
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "demo.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never
在发布时运行测试套件的步骤
首先,在您的集群上安装图表以创建发布。您可能需要等待所有 pod 变得活跃;如果您在安装后立即进行测试,很可能显示瞬态失败,您可能需要重新测试。
$ helm install demo demo --namespace default
$ helm test demo
NAME: demo
LAST DEPLOYED: Mon Feb 14 20:03:16 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: demo-test-connection
Last Started: Mon Feb 14 20:35:19 2022
Last Completed: Mon Feb 14 20:35:23 2022
Phase: Succeeded
[...]
备注
- 您可以在单个 YAML 文件中定义任意数量的测试,或者将其分布在
templates/
目录中的多个 YAML 文件中。 - 欢迎将您的测试套件嵌套在
tests/
目录下,例如<chart-name>/templates/tests/
,以实现更好的隔离。 - 测试是 Helm 钩子,因此可以使用
helm.sh/hook-weight
和helm.sh/hook-delete-policy
之类的注释与测试资源一起使用。