Mẫu Helm không tương thích với cấu trúc values.yaml
Tôi có ingress.yaml sau:
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 }}
Và các giá trị sau để cung cấp mẫu này:
hosts:
host: "app.example.com"
paths:
- "/api"
- "/oauth"
tls:
- secretName: "example-tls"
hosts:
- "*.app.example.com"
- "dev.example.com"
Khi tôi chạy "helm install", nó không thành công:
Lỗi: UPGRADE FAILED: template: templates / ingress.yaml: 31: 15: thực thi "template / ingress.yaml" tại <.host>: không thể đánh giá máy chủ trường trong giao diện loại {}
Vì vậy, đối với tôi, có vẻ như máy chủ phải là một danh sách, không phải là một từ điển (vì hướng dẫn phạm vi ). Vì vậy, tôi chuyển đổi nó:
hosts:
- host: "app.example.com"
paths:
- "/api"
- "/oauth"
Nhưng trong trường hợp này, tôi nhận được:
cảnh báo: đích cho máy chủ là một bảng. Bỏ qua giá trị không phải bảng [đường dẫn map [host: app.example.com: [/ api / oauth]]]
và lỗi tương tự như trên ngoài ra.
Làm thế nào để làm cho nó hoạt động?
CẬP NHẬT 1
Giá trị:
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"
Bản mẫu:
{{- 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 }}
CẬP NHẬT 2
Tôi hiểu rằng vấn đề không phải ở mã mà là ở dòng lệnh. Tôi đã cho ăn bằng chuỗi thay vì mảng.
mẫu helm ... --set ingress.hosts.host = c1.app.example.com ...
Tôi sẽ cố gắng tìm ra cách cung cấp nhiều giá trị và cập nhật nó tại đây.
CẬP NHẬT 3
Tôi đã xóa dữ liệu khỏi các giá trị:
ingress:
enabled: false
rules:
- host:
tls:
- secretName:
hosts: []
Trả lời
Mẫu đang tìm kiếm .Values.ingress.hosts
, trong khi trong các giá trị được hiển thị của bạn không có ingress
tiền tố. Và khi range
toán tử đang được sử dụng, chúng ta nên có một danh sách từ điển .
Ngoài ra, trước khi thực hiện a helm install
, tốt hơn là bạn nên chạy helm template
chỉ để đảm bảo các định nghĩa YAML được hiển thị chính xác.
Xem xét nội dung dưới đây trong 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
Lệnh đang chạy cho kết quả (tôi đã định nghĩa serviceName
là haproxy và servicePort
là 8080 để minh họa):
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
Trả lời câu hỏi của riêng tôi.
Vấn đề là do cấu trúc mẫu nhập và đối số dòng lệnh không khớp mà tôi đã cung cấp để ghi đè tham số.
Đây là sự phù hợp thích hợp của các đối số dòng lệnh :
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
Điều đó điền vào các giá trị.yaml :
ingress:
enabled: false
rules:
- host:
tls:
- secretName:
hosts: []
Đối với mẫu nhập :
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 }}