Helm如何检测命名空间中是否存在指定后缀的Service资源
Helm模板逻辑不生效的原因
你的代码存在两处语法错误,导致判断逻辑永远无法命中:
- 变量引用错误:判断后缀时给
$service.name加了双引号,Helm会把它当成普通字符串"$service.name"处理,不会读取实际Service的名称字段,永远匹配不到后缀为mysuffix的资源。 - 变量作用域错误:Helm模板中
:=的作用是声明当前作用域的局部变量,你在if块内用:=给$previousReleaseInstalled赋值时,实际是声明了一个仅在if块内生效的新变量,块外定义的同名变量值始终是初始的false,不会被修改。
修正后的可用代码
{{- $previousReleaseInstalled := false -}} {{- range $service := (lookup "v1" "Service" .Release.Namespace "").items }} {{- if hasSuffix "mysuffix" $service.name }} {{- $previousReleaseInstalled = true -}} {{- end }} {{- end }} {{- if $previousReleaseInstalled -}} # 此处编写需要条件部署的K8s服务资源定义 implement some services {{- end }}
关键修正说明
- 移除
$service.name外层的双引号,正确引用Service对象的名称字段做后缀匹配 - 将if块内的变量赋值符号从
:=改为=,直接修改外层作用域定义的$previousReleaseInstalled变量,不再声明块级局部变量 - 省略了range循环中未使用的
$index参数,简化模板写法
注意:
lookup是Helm的集群交互函数,本地执行helm template离线渲染时不会调用K8s API,会返回空资源列表,只有执行helm install、helm upgrade等和集群实际交互的操作时,这段判断逻辑才会正常生效。
内容的提问来源于stack exchange,提问作者sotiris
相关产品推荐
相关产品推荐

