【问题标题】:Testing helm chart templating测试舵图模板
【发布时间】:2021-10-31 01:09:44
【问题描述】:

有没有办法测试模板是否适用于所有可能的值?
(注意:这与 helm test 不同,后者用于通过作业中运行的任意代码来测试部署的图表)。

我想要实现的是迭代一组值并检查每个值生成的 K8s 资源。

假设我们要测试我们的图表是否正确编写:

图表:
值.yaml

app:
  port: 8081

pod2:
   enabled: true

AppPod.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: AppPod
  labels:
    app: nginx
spec:
...
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: {{ $.Values.app.port| default 8080  }}

Pod2.yaml

{{- if $.Values.pod2.enabled }}
apiVersion: apps/v1
kind: Deployment
metadata:
  name: Pod2
  labels:
    app: nginx2
spec:
...
{{- end}}

我们要运行以下测试:

  • 使用默认 Values.yaml -> 断言 port=8081 并创建 Pod2
  • 缺少 app.port -> 断言端口=8080
  • 使用 pod2.enabled 为 false -> 未创建断言 Pod2
  • 缺少 pod2 -> 测试将失败,因为密钥 'pod2' 是强制性的

所以基本上是为了测试模板逻辑。

我现在在做什么:
每当我修改图表中的某些内容时,我只需为不同的 Values.yaml 运行 helm template 并手动检查结果。手动执行此操作容易出错,并且图表包含的模板越多,就越耗时。

是否有任何内置的 helm 功能或单独的框架?

【问题讨论】:

  • 嗨@beatrice,Eugene 的回答能回答你的问题吗?

标签: testing kubernetes automated-tests kubernetes-helm


【解决方案1】:

是的,我们使用rego policy rules 来做这件事。设置并不复杂,这就是它作为我们管道之一的一部分的外观(这是一个非常简单的示例,可以帮助您入门):

# install conftest to be able to run helm unit tests
wget https://github.com/open-policy-agent/conftest/releases/download/v0.28.1/conftest_0.28.1_Linux_x86_64.tar.gz
tar xzf conftest_0.28.1_Linux_x86_64.tar.gz
chmod +x conftest

# you can call "helm template" with other override values of course, too
helm template src/main/helm/my-service/ > all.yaml

echo "running opa policies tests"
if ! ./conftest test -p src/main/helm/my-service/ all.yaml; then
  echo "failure"
  exit 1
fi

my-service 目录中有一个policy 文件夹,其中包含用于测试的“规则”(尽管这可以作为参数传递)。这是我最近必须编写的两条规则的示例:

package main

deny_app_version_must_be_present[msg] {
    input.kind == "Deployment"
    env := input.spec.template.spec.containers[_].env[_]
    msg := sprintf("env property with name '%v' must not be empty", [env.name])
    "APP_VERSION" == env.name ; "" == env.value
}

deny_app_version_env_variable_must_be_present[msg] {
    input.kind == "Deployment"
    app_version_names := { envs | envs := input.spec.template.spec.containers[_].env[_]; envs.name == "APP_VERSION"}
    count(app_version_names) != 1
    msg := sprintf("'%v' env variable must be preset once", ["APP_VERSION"])
}

这验证了Deployment 中的容器有一个名为APP_VERSION 的环境变量,该变量必须是唯一的并且必须是非空的。

【讨论】:

  • 乍一看很酷,我试试看。谢谢
猜你喜欢
  • 2021-08-04
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
相关资源
最近更新 更多