debugging 正在验证舵图内容

2w2cym1i  于 2022-11-24  发布在  其他
关注(0)|答案(4)|浏览(132)

我正在开发一个图表,但其中有一个错误-错误地放置了imagePullSecrets。当我尝试通过

helm install ./mychart

放错位置的元素被简单地忽略了,我想知道出了什么问题。
当我做了

helm template ./mychart | kubectl apply --dry-run -f -

而是打印:

error: error validating "STDIN": error validating data: ValidationError(Deployment.spec.template.spec.containers[0]): unknown field "imagePullSecrets" in io.k8s.api.core.v1.Container

这清楚地表明了什么是错误的。我不确定它是否符合什么蒂勒实际上做的扩展模板。
但如果我只做一个

helm install --dry-run --debug ./mychart

它只显示展开的模板,看起来还不错。
那么,我如何正确地验证我的所有模板匹配相应的模式与helm?

ve7v8dk2

ve7v8dk21#

您可以通过运行helm lint ./mychart来lint图表,如果发现问题,应打印以下内容:

$ helm lint ./mychart
==> Linting ./mychart
[ERROR] Chart.yaml: version is required
[INFO] Chart.yaml: icon is recommended

Error: 1 chart(s) linted, 1 chart(s) failed

参见舵面绒布。

ao218c7q

ao218c7q2#

使用kubeconform

helm template ./mychart | kubeconform -strict

如果您有CRD,可能需要使用kubeconform -ignore-missing-schemas。我建议您提供模式版本:kubeconform -kubernetes-version 1.18 .
建议:使你的图表专业化并验证它们。2例子如下。
简单:

helm template --set some.key="val" | kubeconform -strict

复杂:

VALUES_FILE=$(cat << EOF
some:
  key: "val"

another:
  key:
    another: "val"
EOF
)
# It is important to quote "$VALUES_FILE" to ensure line breaks and indentation are preserved
echo "$VALUES_FILE" | helm template -f - | kubeconform -strict
stszievb

stszievb3#

我强烈建议使用以下两种解决方案的组合

溶液1

使用values.schema.json在values.yaml文件上添加一个结构。
示例:

{
  "$schema": "https://json-schema.org/draft-07/schema#",
  "properties": {
    "image": {
      "description": "Container Image",
      "properties": {
        "repo": {
          "type": "string"
        },
        "tag": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "name": {
      "description": "Service name",
      "type": "string"
    },
    "port": {
      "description": "Port",
      "minimum": 0,
      "type": "integer"
    },
    "protocol": {
      "type": "string"
    }
  },
  "required": [
    "protocol",
    "port"
  ],
  "title": "Values",
  "type": "object"
}

(!)此架构将应用于值以对其进行验证。调用以下任何命令时将进行验证:

helm install
helm upgrade
helm lint
helm template

为了向验证添加条件,请在此处阅读。
(*)进一步阅读:Nice article

溶液2

在使用条件时,values.schema.json中的代码可能可读性较差,或者我们希望在验证中使用更动态的逻辑。
在这种情况下,我们可以创建一个validations.yaml文件(一些供应商更喜欢使用.tpl文件),并使用go templates添加验证逻辑。
示例:
如果特定功能(启用时)需要IP或DNS:

some_feature:
    enabled: true
    ip:
    dns:

验证逻辑可以显式编写为:

{{- if .Values.some_feature.enabled -}}
    {{- if and (not .Values.some_feature.ip ) (not .Values.some_feature.dns  ) -}}
        When some_feature is enabled, ip or dns must be given.
    {{- end -}}
{{- end -}}

(*)也可以使用json-schema if-else语句编写此逻辑,但其可读性可能较差。
(**)考虑将所有确认放在/tests/validations文件夹下,其中所有测试都被分为单独的文件(如单元测试)。

falq053o

falq053o4#

为避免舵图安装失败,我建议在本地或/和CI管道中遵循以下顺序:

如果linter遇到会导致图表安装失败的情况,它将发出[ERROR]消息。

  • 运行helm template来测试图表是否可以成功地在本地呈现。虽然一旦helm-〉kubernetes api服务器交互发生,安装仍然可能失败,但它仍然提供了良好的质量检查。
  • 在呈现图表之后,使用kubeval(不支持CRD)或kubeconform(支持CRD)验证图表Kubernetes清单是否符合Kubernetes模式:

helm template [chart_name] . | kubeval

  • 运行helm unit tests以验证图表值是否符合预期(例如,复制副本数为1,卷类型为hostPath等):

helm unittest [chart_name] [chart_name]

相关问题