如何在Helm Chart中创建Secret取值模板并解决nil指针报错?
问题根因
- 核心原因:Kubernetes的Secret资源不会持久化存储
stringData字段。你提交YAML时使用的stringData是供API Server自动转码为base64写入data字段的临时字段,etcd中实际存储的只有data字段,因此通过lookup函数获取到的Secret对象中根本不存在stringData属性,访问自然会报空指针错误。 - 次要排查点:
- 确认执行helm操作的ServiceAccount有对应命名空间下Secret的
get权限,权限不足时lookup函数会返回空对象,也会触发类似报错。 - 确认执行操作时没有加
--dry-run参数,dry-run模式下lookup不会真实调用Kubernetes API,固定返回空值。
- 确认执行helm操作的ServiceAccount有对应命名空间下Secret的
修复方案
将模板中访问stringData的逻辑替换为访问data字段,同时用b64dec函数对base64编码的内容做解码,还可以增加字段存在性判断提升容错性,修改后的模板如下:
{{/* User */}} {{- define "@@chartName@@.user" -}} {{- $secret := lookup "v1" "Secret" .Release.Namespace "secret" -}} {{- if $secret -}} {{- if and (hasKey $secret "data") (hasKey $secret.data "user") -}} {{- $secret.data.user | b64dec | print -}} {{- else -}} {{- fail "The secret does not contain valid user field" -}} {{- end -}} {{- else -}} {{- fail "The secret is absent" -}} {{- end -}} {{- end -}}
内容的提问来源于stack exchange,提问作者Java
相关产品推荐
相关产品推荐

