Helm单文件校验必填变量实现问询,是否有更符合规范的最佳实践?
Helm必填变量校验方案评估与优化建议
现有方案评估
你当前的实现可以正常触发校验,但不属于官方推荐的最佳实践:
- 利用Helm会渲染注释内模板表达式的特性实现校验,属于非规范的「黑魔法」写法,可读性非常差,后续维护的同学很容易误以为注释内的代码没有生效,误删或修改后导致校验逻辑失效
- 没有明确的语义标识说明这段代码的作用,排查问题时很难定位到校验逻辑的位置
更优实现方案
官方推荐的做法是单独写一个不会生成实际Kubernetes资源的模板文件存放校验逻辑,不需要把校验代码放在注释里:
方案1:基础显式校验写法
直接在/templates/required.yaml中使用$noop(无意义变量名,标识该变量不会被实际使用)承接required函数的返回值,整个文件渲染后为空,不会生成多余资源:
{{- /* 集中校验所有必填Values,本文件渲染结果为空,不会生成实际资源 */ -}} {{- $noop := .Values.domainZone | required "Domain Zone is required and should be non-empty string" }} {{- $noop := .Values.someOtherRequireVar | required "The someOtherRequireVar is also required and should be non-empty string" }}
这种写法语义明确,所有人一眼就能看出这段代码是校验用的,不会误修改。
方案2:批量校验写法
如果必填字段较多,可以用列表遍历的方式统一管理,后续新增必填字段只需要更新列表即可,维护成本更低:
{{- /* 集中定义所有必填字段和对应错误提示 */ -}} {{- $requiredFields := list (dict "value" .Values.domainZone "errMsg" "Domain Zone is required and should be non-empty string") (dict "value" .Values.someOtherRequireVar "errMsg" "The someOtherRequireVar is also required and should be non-empty string") }} {{- /* 遍历执行校验 */ -}} {{- range $requiredFields }} {{- $noop := .value | required .errMsg }} {{- end }}
额外注意事项
Helm内置的required函数仅会在值为nil时抛出错误,如果你的values.yaml中给必填字段设置了空字符串""作为默认值,required不会触发校验。如果需要校验字段必须为非空字符串,推荐使用fail函数配合empty判断:
{{- if empty .Values.domainZone }} {{- fail "Domain Zone is required and should be non-empty string" }} {{- end }}
内容的提问来源于stack exchange,提问作者DmitrySemenov
相关产品推荐
相关产品推荐

