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"
「helminstall」を実行すると、次の場合に失敗します。
エラー:アップグレードに失敗しました:テンプレート: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
問題はコードではなくコマンドラインにあることを理解しました。配列の代わりに文字列を入力しました。
ヘルムテンプレート...-- 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 }}