图表测试

图表包含多个 Kubernetes 资源和组件,它们协同工作。作为图表作者,您可能想要编写一些测试来验证您的图表在安装时按预期工作。这些测试还有助于图表使用者了解您的图表应该做什么。

Helm 图表中的**测试**位于 templates/ 目录下,是一个作业定义,它指定一个包含要执行的给定命令的容器。对于测试被认为成功,容器应该成功退出(退出代码为 0)。作业定义必须包含 Helm 测试钩子注释:helm.sh/hook: test

请注意,直到 Helm v3 之前,作业定义需要包含以下其中一个 Helm 测试钩子注释:helm.sh/hook: test-successhelm.sh/hook: test-failurehelm.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-weighthelm.sh/hook-delete-policy 之类的注释与测试资源一起使用。