Template helm tidak kompatibel dengan struktur values.yaml
Saya memiliki ingress.yaml berikut:
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 }}
Dan nilai berikut untuk memberi makan template ini:
hosts:
host: "app.example.com"
paths:
- "/api"
- "/oauth"
tls:
- secretName: "example-tls"
hosts:
- "*.app.example.com"
- "dev.example.com"
Ketika saya menjalankan "helm install" gagal pada:
Kesalahan: UPGRADE GAGAL: template: templates / ingress.yaml: 31: 15: mengeksekusi "templates / ingress.yaml" di <.host>: tidak dapat mengevaluasi host bidang dalam antarmuka tipe {}
Jadi bagi saya sepertinya host harus berupa daftar, bukan kamus (karena instruksi jangkauan ). Jadi saya mengubahnya:
hosts:
- host: "app.example.com"
paths:
- "/api"
- "/oauth"
Tetapi dalam hal ini saya mendapatkan:
peringatan: tujuan untuk host adalah tabel. Mengabaikan nilai non-tabel [map [host: app.example.com jalur: [/ api / oauth]]]
dan kesalahan yang sama seperti di atas sebagai tambahan.
Bagaimana cara membuatnya bekerja?
PEMBARUAN 1
NILAI-NILAI:
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"
Template:
{{- 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 }}
PEMBARUAN 2
Saya mengerti bahwa masalahnya bukan pada kode tetapi pada baris perintah. Saya diberi makan dengan string, bukan dengan array.
helm template ... --set ingress.hosts.host = c1.app.example.com ...
Saya akan mencoba mencari cara untuk memberikan banyak nilai dan memperbaruinya di sini.
PEMBARUAN 3
Saya menghapus data dari nilai:
ingress:
enabled: false
rules:
- host:
tls:
- secretName:
hosts: []
Jawaban
Template sedang mencari .Values.ingress.hosts
, sedangkan nilai yang ditampilkan tidak ada ingress
awalan. Dan karena range
operator sedang digunakan, kita harus memiliki daftar kamus .
Selain itu, sebelum melakukan a helm install
, sebaiknya jalankan helm template
hanya untuk memastikan definisi YAML dirender dengan benar.
Mempertimbangkan konten di bawah ini dalam 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"
Menjalankan helm template
perintah menghasilkan (saya telah menetapkan serviceName
sebagai haproxy, dan servicePort
sebagai 8080 untuk ilustrasi):
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
Menjawab pertanyaan saya sendiri.
Masalahnya adalah ketidakcocokan struktur template masuk dan argumen baris perintah yang telah saya sediakan untuk penggantian parameter.
Ini adalah kesesuaian yang tepat dari argumen baris perintah :
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
Itu mengisi values.yaml :
ingress:
enabled: false
rules:
- host:
tls:
- secretName:
hosts: []
Untuk template masuk :
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 }}