Mẫu Helm không tương thích với cấu trúc values.yaml

Aug 16 2020

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

1 seshadri_c Aug 16 2020 at 15:36

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ó ingresstiền tố. Và khi rangetoá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 templatechỉ để đả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 templateLệnh đang chạy cho kết quả (tôi đã định nghĩa serviceNamelà haproxy và servicePortlà 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

1 MichaelA. Aug 27 2020 at 00:13

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 }}