如何从values.yaml引用整个结构,而不是一一指定?

时间:2019-08-20 09:39:31

标签: kubernetes yaml kubernetes-helm

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

我直接从Deployment.yaml中的values.yam引用livenessProbe和readinessProbe配置,如下所示。但是,按照这种方法会给我下面指定的错误,如果我将其更改为独立地引用每个属性值,则我看到图表已安装,吊舱成功部署。

      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:期望{或n,但找到[,在#10字节中发现错误   ... | ssProbe“:[” map [failu | ...,更大的上下文   ... |“ imagePullPolicy”:“ IfNotPresent”,“ livenessProbe”:[“ map [failureThreshold:3   httpGet:map [路径:/ greeting | ...

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

values.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: {}

3 个答案:

答案 0 :(得分:2)

您需要做两件事以使此工作正确进行:将值显式序列化为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,请进一步调整。

答案 1 :(得分:0)

在您的YAML中:

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

您将值插入序列项。 YAML中的序列项以-开头。但是,livenessProbe的内容应该是YAML映射。错误消息不多,但告诉您出了什么问题:

  

期望{或n,但发现[,

{启动YAML映射(以流样式),[启动YAML序列(以流样式)。该消息告诉您,YAML映射的开始是预期的,但是找到了YAML序列的开始。请注意,由于您使用的是块样式,因此此处实际上并没有使用{[

要解决此问题,只需删除-,以使插入的映射(如values.yaml所示)为livenessProbe的直接值,并且不包含在序列中:< / p>

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

答案 2 :(得分:0)

感谢社区的回答/评论和helm template guide, 它可以组合为:

          {{- if .Values.monitorConfig.liveness }}
          livenessProbe: 
{{ toYaml .Values.monitorConfig.liveness | indent 12 }}
          {{- end }} 

这将提供更大的灵活性。