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 : <.host>에서 "templates / ingress.yaml"실행 : {} 유형 인터페이스에서 필드 호스트를 평가할 수 없습니다.
그래서 나에게 호스트는 사전이 아닌 목록이어야합니다 ( 범위 명령으로 인해 ). 그래서 나는 그것을 변환합니다.
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 템플릿 ... --set ingress.hosts.host = c1.app.example.com ...
여기에서 여러 값을 제공하고 업데이트하는 방법을 알아 내려고합니다.
업데이트 3
값에서 데이터를 지 웠습니다.
ingress:
enabled: false
rules:
- host:
tls:
- secretName:
hosts: []
답변
템플릿 .Values.ingress.hosts
은를 찾고 있지만 표시된 값에는 ingress
접두사 가 없습니다 . 그리고 range
연산자가 사용되고 있으므로 사전 목록 이 있어야합니다 .
또한를 수행하기 전에 YAML 정의가 올바르게 렌더링되었는지 확인하기 위해 helm install
실행하는 것이 좋습니다 helm template
.
의 아래 내용을 고려하십시오 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
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 }}