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新手陷入困境。
错误原因分析
- 条件判断字段错误:
deployment.yaml中使用{{- if .Values.nonprod }}判断环境,但values.yaml里没有顶级的nonprod字段,该字段实际嵌套在resources下,导致判断逻辑失效。 - YAML缩进层级错误:
resources下的limits和requests未与同级字段(如volumeMounts)保持正确缩进,破坏了YAML的结构。 - 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
相关产品推荐
相关产品推荐

