Helm Chart YAML error converting YAML to JSON: YAML: line 93: did not find expected key

3/23/2020

I am trying to include cloudsqlproxy in the same pod has my GHOST container. However, I am having problems when adding cloudsqlproxy to the pod related to the YAML file linting.

The error it gives me is quite misleading has the problem most likely is not related to the line he is saying.

{{- if include "ghost.host" . -}}
apiVersion: {{ template "ghost.deployment.apiVersion" . }}
kind: Deployment
metadata:
  name: {{ template "ghost.fullname" . }}
  labels:
    app: "{{ template "ghost.fullname" . }}"
    chart: "{{ template "ghost.chart" . }}"
    release: {{ .Release.Name | quote }}
    heritage: {{ .Release.Service | quote }}
spec:
  selector:
    matchLabels:
      app: "{{ template "ghost.fullname" . }}"
      release: {{ .Release.Name | quote }}
  replicas: 3
  template:
    metadata:
      labels:
        app: "{{ template "ghost.fullname" . }}"
        chart: "{{ template "ghost.chart" . }}"
        release: {{ .Release.Name | quote }}
    spec:
      {{- if .Values.securityContext.enabled }}
      securityContext:
        fsGroup: {{ .Values.securityContext.fsGroup }}
        runAsUser: {{ .Values.securityContext.runAsUser }}
      {{- else }}
      initContainers:
      - name: volume-permissions
        image: {{ template "ghost.volumePermissions.image" . }}
        imagePullPolicy: "{{ .Values.volumePermissions.image.pullPolicy }}"
        command: ['sh', '-c', 'chmod -R g+rwX {{ .Values.persistence.path }}']
      volumeMounts:
      - mountPath: {{ .Values.persistence.path }}
        name: ghost-data
      {{- end }}
{{- include "ghost.imagePullSecrets" . | indent 6 }}
      containers:
      - name : cloudsql-proxy
        image: gcr.io/cloudsql-docker/gce-proxy:1.16
        command:
          - -/cloudsql_sql_proxy
          - --dir=/cloudsql
          - -instances=infrastructure-0000:europe-west4:blablabla=tcp:3306
                {{- if or .Values.serviceAccountKey .Values.existingSecret -}}
          - -credential_file=/secrets/cloudsql/{{- if .Values.existingSecret -}} {{ .Values.existingSecretKey }} {{- else -}} credentials.json {{- end }}
            {{end}}
        securityContext:
          runAsUser: 2
          AllowPrivilegeEscalation: false
        volumeMounts:
          - name: cloudsql-instance-credentials
            mountPath: /secrets/cloudsql
      - name: {{ template "ghost.fullname" . }}
        image: {{ template "ghost.image" . }}
        imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
        env:
        - name: ALLOW_EMPTY_PASSWORD
        {{- if .Values.allowEmptyPassword }}
          value: "yes"
        {{- else }}
          value: "no"
        {{- end }}
        - name: MARIADB_HOST
        {{- if .Values.mariadb.enabled }}
          value: {{ template "ghost.mariadb.fullname" . }}
        {{- else }}
          value: {{ .Values.externalDatabase.host | quote }}
        {{- end }}
        - name: MARIADB_PORT_NUMBER
        {{- if .Values.mariadb.enabled }}
          value: "3306"
        {{- else }}
          value: {{ .Values.externalDatabase.port | quote }}
        {{- end }}
        - name: GHOST_DATABASE_NAME
        {{- if .Values.mariadb.enabled }}
          value: {{ .Values.mariadb.db.name | quote }}
        {{- else }}
          value: {{ .Values.externalDatabase.database | quote }}
        {{- end }}
        - name: GHOST_DATABASE_USER
        {{- if .Values.mariadb.enabled }}
          value: {{ .Values.mariadb.db.user | quote }}
        {{- else }}
          value: {{ .Values.externalDatabase.user | quote }}
        {{- end }}
        - name: GHOST_DATABASE_PASSWORD
        {{- if .Values.mariadb.enabled }}
          valueFrom:
            secretKeyRef:
              name: {{ template "ghost.mariadb.fullname" . }}
              key: mariadb-password
        {{- else }}
          value: {{ .Values.externalDatabase.password | quote }}
        {{- end }}
        - name: GHOST_HOST
          value: {{ include "ghost.host" . | quote }}
        - name: GHOST_PROTOCOL
          value: {{  .Values.ghostProtocol | quote }}
        - name: GHOST_PORT_NUMBER
        {{- if .Values.ghostPort }}
          value: {{ .Values.ghostPort | quote }}
        {{- else }}
          value: {{ .Values.service.port | quote }}
        {{- end }}
        - name: GHOST_USERNAME
          value: {{ .Values.ghostUsername | quote }}
        - name: GHOST_PASSWORD
          valueFrom:
            secretKeyRef:
              name: {{ template "ghost.fullname" . }}
              key: ghost-password
        - name: GHOST_EMAIL
          value: {{ .Values.ghostEmail | quote }}
        - name: BLOG_TITLE
          value: {{ .Values.ghostBlogTitle | quote }}
        {{- if .Values.smtpHost }}
        - name: SMTP_HOST
          value: {{ .Values.smtpHost | quote }}
        {{- end }}
        {{- if .Values.smtpPort }}
        - name: SMTP_PORT
          value: {{ .Values.smtpPort | quote }}
        {{- end }}
        {{- if .Values.smtpUser }}
        - name: SMTP_USER
          value: {{ .Values.smtpUser | quote }}
        {{- end }}
        {{- if .Values.smtpPassword }}
        - name: SMTP_PASSWORD
          valueFrom:
            secretKeyRef:
              name: {{ template "ghost.fullname" . }}
              key: smtp-password
        {{- end }}
        {{- if .Values.smtpFromAddress }}
        - name: SMTP_FROM_ADDRESS
          value: {{ .Values.smtpFromAddress | quote }}
        {{- end }}
        {{- if .Values.smtpService }}
        - name: SMTP_SERVICE
          value: {{ .Values.smtpService | quote }}
        {{- end }}
        ports:
        - name: http
          containerPort: 2368
        {{- if .Values.livenessProbe.enabled }}
        livenessProbe:
          httpGet:
            path: {{ .Values.ghostPath }}
            port: http
            httpHeaders:
            - name: Host
              value: {{ include "ghost.host" . | quote }}
            {{- if eq .Values.ghostProtocol "https" }}
            - name: X-Forwarded-Proto
              value: https
            {{- end }}
          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
          periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
          successThreshold: {{ .Values.livenessProbe.successThreshold }}
          failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
        {{- end }}
        {{- if .Values.readinessProbe.enabled }}
        readinessProbe:
          httpGet:
            path: {{ .Values.ghostPath }}
            port: http
            httpHeaders:
            - name: Host
              value: {{ include "ghost.host" . | quote }}
            {{- if eq .Values.ghostProtocol "https" }}
            - name: X-Forwarded-Proto
              value: https
            {{- end }}zshzs
          initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
          periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
          timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
          successThreshold: {{ .Values.readinessProbe.successThreshold }}
          failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
        {{- end }}
        {{- if .Values.resources }}
        resources: {{- toYaml .Values.resources | nindent 10 }}
        {{- end }}
        volumeMounts:
        - name: ghost-data
          mountPath: /bitnami/ghost
      volumes:
      - name: cloudsql-instance-credentials
        secret:
          secretName: "calm-com-tls"
      - name: ghost-data
      {{- if .Values.persistence.enabled }}
        persistentVolumeClaim:
          claimName: {{ template "ghost.fullname" . }}
      {{- else }}
        emptyDir: {}
      {{- end }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
{{- end -}}
-- lbfjo
kubernetes
kubernetes-helm
yaml

2 Answers

3/24/2020

I would change section GHOST_DATABASE_PASSWORD to look like:

        - name: GHOST_DATABASE_PASSWORD
          valueFrom:
            secretKeyRef:
            {{- if .Values.mariadb.enabled }}
              name: {{ template "ghost.mariadb.fullname" . }}
              key: mariadb-password
            {{- else }}
              name: {{ printf "%s-%s" .Release.Name "externaldb" }}
              key: db-password
            {{- end }}

where:

data:
  db-password: {{ .Values.externalDatabase.password | b64enc | quote }}

Example: helm-chart-secret.

-- MaggieO
Source: StackOverflow

3/25/2020

Pls check volumeMounts section in init container I guess indentation is not correct.

-- shubham_asati
Source: StackOverflow