首页 > 解决方案 > kubectl apply 错误:将 YAML 转换为 JSON 时出错

问题描述

之后收到此错误消息kubectl apply -f .

error: error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{"include (print $.Template.BasePath \"/configmap.yaml\") . | sha256sum":interface {}(nil)}

我试过放在checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}不同的地方,但我不太了解 YAML 或 JSON 来找出问题所在。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
        - name:  demo
          image: cloudnatived/demo:hello-config-env
          ports:
            - containerPort: 8888
          env:
            - name: GREETING
              valueFrom:
                configMapKeyRef:
                  name: demo-config
                  key: greeting
      annotations:
          checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}

我只是希望能够在配置更改时更新我的​​ pod。我应该helm upgrade在某个地方,但我不确定要给出什么论据。

标签: jsonkubernetesyamlkubernetes-helmgo-templates

解决方案


您不能将{{ ... }}语法与kubectl apply. 该语法通常与Helm包管理器匹配。在不知道应用模板语法的情况下,{ ... }看起来像 YAML 映射语法,并且解析器会感到困惑。

annotations:一般属于under metadata:,next to labels:Kubernetes文档中的注释可能有助于阅读。

我只想能够在不重新启动它们的情况下更新我的 pod。

Kubernetes 不是这样工作的,只有一些非常有限的例外。

如果您只谈论配置数据而不是代码,您可以将 ConfigMap 数据添加到 Volume;那么如果 ConfigMap 发生变化,pod 看到的文件也会发生变化。您遇到的语法实际上是在 ConfigMap 数据更改时强制重新启动 pod 的解决方法:它与您尝试的相反,您应该删除这两行。

对于例行代码更改,标准路径是构建并推送新的 Docker 镜像,然后使用新的镜像标签更新您的部署对象。(它必须是与之前不同的图像标签字符串,仅推送具有相同标签的新图像是不够的。)然后Kubernetes会自动使用新图像启动新的Pod,一旦启动,关闭Pod与旧图像。在某些情况下,Kubernetes 甚至可以自行删除和重新创建 Pod。


推荐阅读