测试舵图模板 [英] Testing helm chart templating

查看:24
本文介绍了测试舵图模板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有一种方法可以测试模板对于所有可能的值是否都工作正常?
(注意:这与Helm测试不同,Helm测试用于通过作业中运行的任意代码测试部署的图表)。

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

假设我们想测试图表是否写得正确:

图表:
Values.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->;Assert port=8081并创建Pod2
  • 缺少app.port->;Assert port=8080
  • 启用pod2.时为FALSE->;未创建断言Pod2
  • 缺少pod2-&>测试将失败,因为密钥‘pod2’是必需的

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

我现在正在做的事情:
每当我修改图表中的某些内容时,我只是针对不同的Values.yaml运行Helm模板,并手动检查结果。手动执行此操作容易出错,并且图表包含的模板越多,此操作就越耗时。

是否有内置的舵面功能或单独的框架?

推荐答案

是的,我们使用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文件夹,其中保存用于测试的";Rules";(尽管这可以作为参数传递)。以下是我最近不得不写的两条规则的示例:

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的环境变量,该变量必须唯一且不为空。

这篇关于测试舵图模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆