हेल्म टेम्पलेट मानों के अनुकूल नहीं है। श्याम संरचना

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"

जब मैं "हेल्म इंस्टॉल" चलाता हूं तो यह विफल रहता है:

त्रुटि: UPGRADE विफल: टेम्पलेट: टेम्पलेट्स / ingress.yaml: 31: 15: <.host पर "टेम्पलेट्स / ingress.yaml" निष्पादित: प्रकार इंटरफ़ेस में फ़ील्ड होस्ट का मूल्यांकन नहीं कर सकता {}।

तो मेरे लिए ऐसा लगता है कि मेजबानों की एक सूची होनी चाहिए, न कि एक शब्दकोष ( रेंज निर्देश के कारण)। इसलिए मैं इसे परिवर्तित करता हूं:

  hosts:
    - host: "app.example.com"
      paths:
        - "/api"
        - "/oauth"

लेकिन इस मामले में मुझे:

चेतावनी: मेजबानों के लिए गंतव्य एक मेज है। गैर-तालिका मान को अनदेखा करना [मानचित्र [मेजबान: app.example.com पथ: [/ api / oauth]]

और इसके अलावा के रूप में एक ही त्रुटि।

इसे कैसे काम करना है?

अद्यतन १

मान:

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

अद्यतन २

मैं समझ गया कि समस्या कोड में नहीं बल्कि कमांड लाइन में थी। मैं सरणी के बजाय स्ट्रिंग के साथ खिलाया।

पतवार टेम्पलेट ...

मैं यह पता लगाने की कोशिश करूंगा कि कैसे कई मूल्य प्रदान करें और इसे यहां अपडेट करें।

अद्यतन 3

मैंने मूल्यों से डेटा मिटा दिया:

ingress:
  enabled: false

  rules:
    - host:

  tls:
    - secretName:
      hosts: []

जवाब

1 seshadri_c Aug 16 2020 at 15:36

टेम्पलेट की तलाश है .Values.ingress.hosts, जबकि आपके प्रदर्शित मूल्यों में कोई ingressउपसर्ग नहीं है । और जैसा कि rangeऑपरेटर का उपयोग किया जा रहा है, हमारे पास शब्दकोश की एक सूची होनी चाहिए ।

इसके अलावा, ए करने से पहले 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में आदेश परिणाम (मैं परिभाषित किया है serviceNamehaproxy के रूप में, और 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

मेरे ही प्रश्न का उत्तर दे रहा हूं।

समस्या इंग्रेस टेम्पलेट संरचना और कमांड लाइन तर्कों के बेमेल में थी जो मैंने परमेस ओवरराइड के लिए प्रदान की है।

यह कमांड लाइन के तर्कों का उचित योग है :

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

यह मानों को आबाद करता है

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