我有以下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 }}