Шаблон 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"
Когда я запускаю "helm install", он не работает:
Ошибка: ОБНОВЛЕНИЕ НЕ выполнено: шаблон: templates / ingress.yaml: 31: 15: выполнение «templates / ingress.yaml» на <.host>: невозможно оценить хост поля в интерфейсе типа {}
Так что для меня похоже, что хосты должны быть списком, а не словарем (из-за инструкции диапазона ). Итак, я конвертирую это:
hosts:
- host: "app.example.com"
paths:
- "/api"
- "/oauth"
Но в этом случае я получаю:
предупреждение: местом назначения для хостов является таблица. Игнорирование не табличного значения [map [host: app.example.com paths: [/ 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 ... --set 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
Отвечая на свой вопрос.
Проблема заключалась в несоответствии структуры входящего шаблона и аргументов командной строки, которые я предоставил для переопределения параметров.
Это правильное соответствие аргументов командной строки :
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
Это заполняет values.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 }}