You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Helm Chart条件配置CPU资源报错:YAML转JSON失败

问题解决:Helm Chart部署YAML转JSON错误

问题背景

尝试在单个Helm Chart中根据环境配置不同的CPU/内存资源限制,已编写values.yaml和deployment.yaml,但部署时触发错误:

error converting YAML to JSON: yaml: line 42: mapping values are not allowed in this context

使用yamllint排查后仍未解决,作为Kubernetes和DevOps新手陷入困境。

错误原因分析

  1. 条件判断字段错误:deployment.yaml中使用{{- if .Values.nonprod }}判断环境,但values.yaml里没有顶级的nonprod字段,该字段实际嵌套在resources下,导致判断逻辑失效。
  2. YAML缩进层级错误:resources下的limits和requests未与同级字段(如volumeMounts)保持正确缩进,破坏了YAML的结构。
  3. HTML实体引号问题:模板中使用了"这种HTML实体引号,会被Helm解析为无效字符,引发YAML语法错误。

修复方案

1. 调整values.yaml(新增环境标识字段)

在顶级添加env字段,明确当前环境类型(nonprod或prod):

metadata:
  name: api
  namespace: trans
deployment:
  replicaCount: 3
image:
  repository: registry.rancher.abc.com/capture_trans/transactionapi
  tag: 0.0.11
  pullPolicy: Always
service:
  name: transactionapi 
  type: ClusterIP
  externalPort: 4545
  internalPort: 4545
# 新增环境标识字段,部署时可通过--set env=prod覆盖
env: nonprod
resources: 
  nonprod:
    limits:
      cpu: 500m
      memory: 300Mi
    requests:
      cpu: 400m
      memory: 200Mi
  prod:
    limits:
      cpu: 800m
      memory: 1000Mi
    requests:
      cpu: 800m
      memory: 1000Mi    
ingress:
  env: dev-rancher
  domain: abc.com
autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 5
  targetCPUUtilizationPercentage: 80

2. 修正deployment.yaml(修复缩进、判断逻辑和引号)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.metadata.name }}
  namespace:  {{ .Values.metadata.namespace }}
  labels:
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
spec:
  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.deployment.replicaCount }}
  {{- end }}
  selector:
    matchLabels:
      app: {{ .Values.service.name}}
  template:
    metadata:
      labels:
        app: {{ .Values.service.name }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        ports:
        - containerPort: {{ .Values.service.internalPort }}
        livenessProbe:
          httpGet:
            path: /health
            port: {{ .Values.service.internalPort }}
          initialDelaySeconds: 2
          periodSeconds: 30
        readinessProbe:
          httpGet:
            path: /health
            port: {{ .Values.service.internalPort }}
          initialDelaySeconds: 2
          periodSeconds: 30
        resources:
          {{- if eq .Values.env "nonprod" }}
          limits:
            cpu: {{ .Values.resources.nonprod.limits.cpu }}
            memory: {{ .Values.resources.nonprod.limits.memory }}
          requests:
            cpu: {{ .Values.resources.nonprod.requests.cpu }}
            memory: {{ .Values.resources.nonprod.requests.memory }}
          {{- else }}    
          limits:
            cpu: {{ .Values.resources.prod.limits.cpu }}
            memory: {{ .Values.resources.prod.limits.memory }}
          requests:
            cpu: {{ .Values.resources.prod.requests.cpu }}
            memory: {{ .Values.resources.prod.requests.memory }}
          {{- end }}    
        volumeMounts:
          - mountPath: /root/tls.crt
            name: config
            subPath: tls.crt
          - mountPath: /root/tls.key
            name: config
            subPath: tls.key
      volumes:
      - name: config
        secret:
          secretName: config
      imagePullSecrets:
        - name: default-image-pull-secret

3. 部署验证

部署时可通过--set参数切换环境:

# 部署非生产环境
helm install my-release ./chart --set env=nonprod

# 部署生产环境
helm install my-release ./chart --set env=prod

关键修复点说明

  • 新增顶级env字段作为环境判断依据,避免嵌套字段判断的混乱
  • 将limits和requests缩进至resources:下,保持YAML层级正确
  • 把"替换为普通双引号,消除无效字符解析错误
  • 使用eq运算符明确环境匹配逻辑,提升模板可读性

内容的提问来源于stack exchange,提问作者Alex Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:25:09