Helm模板与values.yaml结构不兼容



我有以下ingress.yaml:

spec:
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- host: {{ .host }}                 // row 31
http:
paths:
{{- range .paths }}
- path: {{ . | quote }}
backend:
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}
{{- end }}

以及以下值来提供此模板:

hosts:
host: "app.example.com"
paths:
- "/api"
- "/oauth"
tls:
- secretName: "example-tls"
hosts:
- "*.app.example.com"
- "dev.example.com"

当我跑";舵杆安装";它在以下位置失败:

错误:升级失败:template:templates/ingress。yaml:31:15:执行";templates/ingress;在<处;。主机>:无法评估字段主机类型接口{}

所以对我来说,主机似乎必须是一个列表,而不是字典(因为范围指令(。所以我转换它:

hosts:
- host: "app.example.com"
paths:
- "/api"
- "/oauth"

但在这种情况下,我得到:

警告:主机的目标是一个表。忽略非表值[map[host:app.example.com路径:[/api/oauth]]

以及与上述相同的错误。

如何使其工作?

更新1

值:

ingress:
enabled: true
rules:
- host: c1.app.example.com
paths:
- /api
- /oauth
- host: c2.app.example.com
paths:
- /api
- /oauth
tls:
- secretName: "example-tls"
hosts:
- "*.app.example.com"
- "dev.example.com"

模板:

{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.rules }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ . | quote }}
backend:
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}
{{- end }}

更新2

我知道问题不在代码中,而在命令行中。我用字符串代替数组。

helm模板--设置ingress.hosts.host=c1.app.example.com…

我将尝试找出如何提供多个值并在此处更新它。

更新3

我从值中删除了数据:

ingress:
enabled: false
rules:
- host:
tls:
- secretName:
hosts: []

模板正在查找.Values.ingress.hosts,而在显示的值中没有ingress前缀。当使用range运算符时,我们应该有一个字典的列表。

此外,在执行helm install之前,最好运行helm template以确保YAML定义正确呈现。

考虑values.yaml中的以下内容:

--- 
ingress: 
hosts: 
- 
host: app1.example.com
paths: 
- /api
- /oauth
- 
host: app2.example.com
paths: 
- /api1
- /authz
tls:
- hosts:
- "*.app.example.com"
- "dev.example.com"
secretName: "example-tls"

运行helm template命令会产生(为了便于说明,我将serviceName定义为haproxy,将servicePort定义为8080(:

spec:
tls:
- hosts:
- "*.app.example.com"
- "dev.example.com"
secretName: example-tls
rules:
- host: app1.example.com                 // row 31
http:
paths:
- path: "/api"
backend:
serviceName: haproxy
servicePort: 8080
- path: "/oauth"
backend:
serviceName: haproxy
servicePort: 8080
- host: app2.example.com                 // row 31
# similar output for app2.example.com

回答我自己的问题。

问题在于我为params覆盖提供的入口模板结构和命令行参数不匹配。

这是命令行参数的适当匹配

helm upgrade <some other options here>
--values ./values.yaml
--set ingress.enabled=True
--set ingress.tls[0].hosts[0]=app.example.com
--set ingress.tls[0].secretName=example-tls
--set ingress.rules[0].host=app.example.com

填充值。yaml

ingress:
enabled: false
rules:
- host:
tls:
- secretName:
hosts: []

对于入口模板

spec:
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- secretName: {{ .secretName }}
hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.rules }}
- host: {{ .host | quote }}
http:
paths:
- path: /api
backend:
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}

相关内容

  • 没有找到相关文章

最新更新