Szablon Helm nie jest zgodny ze strukturą values.yaml
Mam następujący plik 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 }}
Oraz następujące wartości do podania tego szablonu:
hosts:
host: "app.example.com"
paths:
- "/api"
- "/oauth"
tls:
- secretName: "example-tls"
hosts:
- "*.app.example.com"
- "dev.example.com"
Po uruchomieniu „helm install” kończy się niepowodzeniem:
Błąd: AKTUALIZACJA NIE POWIODŁA SIĘ: template: templates / ingress.yaml: 31: 15: wykonywanie „templates / ingress.yaml” w <.host>: nie można ocenić hosta pola w interfejsie typu {}
Więc dla mnie wygląda na to, że hosty muszą być listą, a nie słownikiem (z powodu instrukcji zakresu ). Więc konwertuję to:
hosts:
- host: "app.example.com"
paths:
- "/api"
- "/oauth"
Ale w tym przypadku otrzymuję:
ostrzeżenie: miejscem docelowym dla hostów jest tabela. Ignorowanie wartości innej niż tabela [mapa [host: app.example.com ścieżki: [/ api / oauth]]]
i dodatkowo ten sam błąd co powyżej.
Jak sprawić, by to działało?
AKTUALIZACJA 1
Wartości:
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"
Szablon:
{{- 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 }}
AKTUALIZACJA 2
Zrozumiałem, że problem nie dotyczy kodu, ale wiersza poleceń. Karmiłem ciągiem zamiast tablicą.
helm template ... --set ingress.hosts.host = c1.app.example.com ...
Spróbuję dowiedzieć się, jak podać wiele wartości i zaktualizować je tutaj.
AKTUALIZACJA 3
Usunąłem dane z wartości:
ingress:
enabled: false
rules:
- host:
tls:
- secretName:
hosts: []
Odpowiedzi
Szablon szuka .Values.ingress.hosts
, podczas gdy w wyświetlanych wartościach nie ma ingress
przedrostka. Ponieważ range
używany jest operator, powinniśmy mieć listę słowników .
Ponadto przed wykonaniem a helm install
dobrze byłoby uruchomić helm template
tylko po to, aby upewnić się, że definicje YAML są poprawnie renderowane.
Biorąc pod uwagę poniższe treści w 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"
Uruchamianie helm template
komendy powoduje (Mam zdefiniowane serviceName
jako HAProxy, a servicePort
jako 8080 na ilustracji):
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
Odpowiadając na moje własne pytanie.
Problem polegał na niedopasowaniu struktury szablonu wejścia i argumentów wiersza poleceń, które podałem w celu zastąpienia parametrów.
Oto właściwe dopasowanie argumentów wiersza poleceń :
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
To wypełnia wartości. Yaml :
ingress:
enabled: false
rules:
- host:
tls:
- secretName:
hosts: []
W przypadku szablonu wejściowego :
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 }}