Helm 템플릿은 values.yaml 구조와 호환되지 않습니다.

Aug 16 2020

다음 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: []

답변

1 seshadri_c Aug 16 2020 at 15:36

템플릿 .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

1 MichaelA. Aug 27 2020 at 00:13

내 질문에 대답합니다.

문제는 내가 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 }}