Helm读取ConfigMap多行TLS证书格式错误求助
问题分析
- YAML缩进混乱:原Route模板中,
tls:下的Helm模板语句缩进层级错位,导致渲染后的YAML结构破坏,触发"could not find expected ':'"解析错误。 - 多行证书格式丢失:直接输出
{{$ssocertificate}}会抹平证书的换行符,导致证书格式失效,不符合使用要求。 - 类型不匹配:简化配置中直接将整个ConfigMap对象赋值给
certificate字段,类型完全不匹配,触发类型错误。
解决方案
1. 保留ConfigMap的多行证书格式
继续使用|-语法保存原始证书的换行结构,这是YAML中保留多行文本的正确写法:
kind: ConfigMap apiVersion: v1 metadata: name: mymap namespace: {{ .Release.Namespace }} # 显式指定命名空间,避免跨空间读取问题 data: certificate: |- -----BEGIN CERTIFICATE----- certificate data -----END CERTIFICATE-----
2. 修正Route的Helm模板
核心解决缩进对齐和多行文本渲染问题,同时处理空值避免错误:
kind: Route apiVersion: route.openshift.io/v1 metadata: name: my-route spec: tls: termination: edge # 根据实际需求设置TLS终止类型:edge/passthrough/reencrypt {{- # 从当前命名空间读取ConfigMap,不存在时返回空字典 }} {{- $configMap := lookup "v1" "ConfigMap" .Release.Namespace "mymap" | default dict }} {{- $certData := get $configMap "data" | default dict }} {{- $cert := get $certData "certificate" | default "" }} {{- # 仅当证书存在时渲染字段 }} {{- if ne $cert "" }} certificate: | {{- $cert | nindent 6 }} # 为证书每行添加6个空格缩进,匹配YAML层级并保留换行 {{- end }} # 补全Route的其他必填配置 to: kind: Service name: my-service
关键细节说明
- 缩进对齐:
tls:下的所有模板语句和字段必须保持相同缩进层级,确保渲染后的YAML结构合法。 - nindent函数:
nindent 6会自动为证书的每一行添加6个空格缩进,同时完整保留原始换行符,完美还原证书格式。 - 空值防护:通过
default dict和default ""处理ConfigMap不存在的情况,避免模板渲染时出现空指针错误。
验证步骤
执行helm template --debug .查看渲染后的YAML输出,确认certificate字段格式如下:
spec: tls: termination: edge certificate: | -----BEGIN CERTIFICATE----- certificate data -----END CERTIFICATE-----
格式符合预期后,再执行helm upgrade即可完成正常部署。
内容的提问来源于stack exchange,提问作者Dodd-learning
相关产品推荐
相关产品推荐

