将YAML转换为JSON的Helm Chart YAML错误:YAML:第93行:找不到预期的密钥

时间:2020-03-23 16:41:17

标签: kubernetes yaml kubernetes-helm

我试图将cloudsqlproxy包含在具有GHOST容器的同一容器中。但是,将cloudsqlproxy添加到与YAML文件掉毛相关的pod时遇到问题。

它给我的错误很容易引起误解,原因是问题很可能与他所说的话无关。

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

3 个答案:

答案 0 :(得分:1)

解决此类问题的简单方法是使用工具。这些大多是缩进问题

 npm install -g yaml-lint

yaml-lint 就是这样一种工具

 PS E:\vsc-workspaces\grafana-1> yamllint .\grafana.yaml
× YAML Lint failed for C:/Users/mnadeem6/vsc-workspaces/grafana-1/grafana.yaml
× bad indentation of a mapping entry at line 137, column 11:
          restartPolicy: Always
          ^
PS E:\vsc-workspaces\grafana-1> yamllint .\grafana.yaml
√ YAML Lint successful.

答案 1 :(得分:0)

我将class DialogBuilder : DialogFragment() { ... override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val builder = AlertDialog.Builder(activity) val inflater = activity?.layoutInflater val view = inflater?.inflate(R.layout.dialog_builder_fragment, null) builder.setView(view) val dialog = builder.create() fillViews() initListeners() return dialog } ... private fun fillViews() { if (headline.isNotBlank()) { headline_text_view.text = headline headline_text_view.visibility = View.VISIBLE } ... } 节更改为:

GHOST_DATABASE_PASSWORD

其中:

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

示例:helm-chart-secret

答案 2 :(得分:0)

请检查init容器中的volumeMounts部分,我认为缩进不正确。