kubectl套用错误:将YAML转换为JSON时发生错误

时间:2019-07-08 23:06:06

标签: json kubernetes yaml

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在这里的某个地方,但是我不确定该给什么参数。

3 个答案:

答案 0 :(得分:2)

您在使用Helm吗?尝试将annotations移动到顶级元数据下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: demo
  annotations:
    checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
spec:
  replicas: 1
...

无论如何,除非应用程序可以检测到对外部配置的更改并将其热重新加载,否则通常需要(滚动)重新启动来获取某些更改。

答案 1 :(得分:2)

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

annotations:通常属于metadata:下的labels:下。 Kubernetes文档中的Annotations可能很有用。

  

我只希望能够在不重启Pod的情况下更新它们。

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

如果您只在谈论配置数据而不是代码,则可以Add ConfigMap data to a Volume;然后,如果ConfigMap更改,则窗格看到的文件也将更改。您遇到的语法实际上是一种解决方法,可在ConfigMap数据更改时强制Pod重新启动:这与您要尝试的相反,应该删除这两行。

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

答案 2 :(得分:1)

解决此类问题的最简单方法是使用工具。

这些大多是缩进问题,使用正确的工具可以很容易地解决

 npm install -g yaml-lint

yaml-lint 就是这样一种工具

D:\vsc-workspaces\grafana-1> yamllint grafana.yaml
× YAML Lint failed for D:\vsc-workspaces\grafana-1/grafana.yaml
× bad indentation of a mapping entry at line 137, column 11:
          restartPolicy: Always
          ^
D:\vsc-workspaces\grafana-1> yamllint grafana.yaml
√ YAML Lint successful.