Home > Blockchain >  Helm chart not picking up correct values
Helm chart not picking up correct values

Time:11-03

I'm trying to assign static IPs for Load Balancers in GKE to services by storing them in the values.yaml file as:

ip:
  sandbox:
    service1: xxx.xxx.201.74
    service2: xxx.xxx.80.114
  dev:
    service1: xxx.xxx.249.203
    service2: xxx.xxx.197.77
  test:
    service1: xxx.xxx.123.212
    service2: xxx.xxx.194.133
  prod:
    service1: xxx.xx.244.211
    service2: xxx.xxx.207.177

All works fine till I want to deploy to prod and that will fail as:

Error: UPGRADE FAILED: template: chart-v1/templates/service2-service.yaml:24:28: executing "chart-v1/templates/service2-service.yaml" at <.Values.ip.prod.service2>: nil pointer evaluating interface {}.service2
helm.go:94: [debug] template: chart-v1/templates/service2-service.yaml:24:28: executing "chart-v1/templates/service2-service.yaml" at <.Values.ip.prod.service2>: nil pointer evaluating interface {}.service2

and the part for service2-service.yaml looks like:

apiVersion: v1
kind: Service
metadata:
  annotations:
    appName: {{ include "common.fullname" . }}
    componentName: service2
  labels:
    io.kompose.service: service2
  name: service2
spec:
  ports:
  - name: "{{ .Values.service.service2.ports.name }}"
    port: {{ .Values.service.service2.ports.port }}
    protocol: {{ .Values.service.service2.ports.protocol }}
    targetPort: {{ .Values.service.service2.ports.port }}
  type: LoadBalancer
{{ if eq .Values.target.deployment.namespace "sandbox" }}
  loadBalancerIP: {{ .Values.ip.sandbox.service2 }}
{{ else if eq .Values.target.deployment.namespace "dev" }}
  loadBalancerIP: {{ .Values.ip.dev.service2 }}
{{ else if eq .Values.target.deployment.namespace "test" }}
  loadBalancerIP: {{ .Values.ip.test.service2 }}
{{ else if eq .Values.target.deployment.namespace "prod" }}
  loadBalancerIP: {{ .Values.ip.prod.service2 }}
{{ else }}
{{ end }}
  selector:
    io.kompose.service: service2
status:
  loadBalancer: {}

Any clue why is complaining that is nil (empty)?

CodePudding user response:

it could be due to the function changing the context and defined in values.yaml

Normally with range, we can use the $ for global scope, appName: {{ include "common.fullname" $ }}

When tested the same template by keeping the static value of the appName it worked for me, so there is no issue with access from values.yaml unless nil is getting set at .Values.ip.prod.service2.

in other case as you mentioned {{ (.Values.ip.prod).service2 }} multiple level nesting will solve issue.

  • Related