首页 > 解决方案 > 如何从 values.yaml 中引用整个结构而不是一一指定?

问题描述

我正在尝试使用下面显示的 helm 命令在 minikube 上的本地虚拟框中部署 helm 图表。

我指的是 livenessProbe , readinessProbe 配置直接来自 deployment.yaml 中的 values.yam ,如下所示。但是,遵循这种方法会给我下面指定的错误,如果我将其更改为独立引用每个属性值,我会看到图表正在安装,pod 部署成功。

      livenessProbe:
        - {{ .Values.monitorConfig.liveness }}
      readinessProbe:
        - {{ .Values.monitorConfig.readiness }}

谁能告诉我可以做些什么来避免错误,为什么?

谢谢你。

头盔命令

helm install --debug -n pspk ./pkg/helm/my-service/

错误

错误:发布 pspk 失败:版本“v1beta1”中的部署不能作为部署处理:v1beta1.Deployment.Spec:v1beta1.DeploymentSpec.Template:v1.PodTemplateSpec.Spec:v1.PodSpec.Containers:[]v1.Container:v1 .Container.LivenessProbe: readObjectStart: expect { or n, but found [, error found in #10 byte of ...|ssProbe":["map[failu|..., Greater context ...|"imagePullPolicy": "IfNotPresent","livenessProbe":["map[failureThreshold:3 httpGet:map[path:/greeting|...

部署.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: {{ template "fullname" . }}
  labels:
    app: {{ template "fullname" .}}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
    release: "{{ .Release.Name }}"
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      labels:
        app: {{ template "fullname" . }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 50443
              protocol: TCP
            - name: grpc
              containerPort: 50051
              protocol: TCP
          livenessProbe:
            - {{ .Values.monitorConfig.liveness }}
          readinessProbe:
            - {{ .Values.monitorConfig.readiness }}
          resources:
{{ toYaml .Values.resources | indent 12 }}

值.yaml

replicaCount: 2

application:
  track: stable

image:
  repository: test/go-k8s
  tag: 0.1.1
  pullPolicy: IfNotPresent

# SQL migration scripts

service:
  enabled: false
  type: NodePort
  port: 80
  grpc_port: 50051

env:
  # POSTGRES_HOST  
  postgresHost: localhost
  # POSTGRES_PORT
  postgresPort: "5432"
  # POSTGRES_SSL_MODE
  postgresSSLMode: "disable"
  # POSTGRES_DB
  postgresDB: test
  # POSTGRES_USER
  postgresUser: test
  # POSTGRES_PASSWORD
  postgresPassword: "test"


monitorConfig:
  liveness:
    httpGet:
      path: "/greeting"
      port: 50443
    periodSeconds: 2
    timeoutSeconds: 10
    initialDelaySeconds: 5
    failureThreshold: 3
    successThreshold: 1
  readiness:
    httpGet:
      path: "/greeting"
      port: 50443
    periodSeconds: 2
    timeoutSeconds: 10
    initialDelaySeconds: 5
    failureThreshold: 3
    successThreshold: 1

resources: {}

nodeSelector: {}

tolerations: []

affinity: {}

标签: kubernetesyamlkubernetes-helm

解决方案


您需要做两件事才能使其正常工作:将值显式序列化为 YAML,并使缩进正确。这往往看起来像

livenessProbe:
  - {{ .Values.monitorConfig.liveness | toYaml | indent 8 | trim }}

默认序列化将是 Go-native 转储格式,它不是 YAML,会导致奇怪的map[failureThreshold:1]输出;toYaml解决这个问题。 indent 8在结果块中每行的前面放置空格(您需要调整“8”)。 trim删除前导和尾随空格。(toYaml是 Helm 特有的,没有很好地记录;其他两个函数来自Sprig支持库。)

您应该仔细检查此输出

helm template -n pspk ./pkg/helm/my-service/

如果它看起来不像有效的 YAML,请进一步调整它。


推荐阅读