【问题标题】:kubectl apply error: error converting YAML to JSONkubectl apply 错误:将 YAML 转换为 JSON 时出错
【发布时间】:2019-11-18 11:23:57
【问题描述】:

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,但我不确定要给出什么论据。

【问题讨论】:

    标签: json kubernetes yaml kubernetes-helm go-templates


    【解决方案1】:

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

    annotations: 一般属于metadata:,在labels: 旁边。阅读 Kubernetes 文档中的 Annotations 可能会有用。

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

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

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

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

    【讨论】:

    • 我正在按照书中的说明进行操作,我想我误解了一些事情,而您的回答澄清了它们。看起来我应该使用 Helm,这个练习的重点是在配置更改时更新 pod。我应该在这里的某个地方使用helm upgrade,但我不确定要给出什么论据。
    【解决方案2】:

    你在使用 Helm 吗?尝试在顶级元数据下移动annotations

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

    在任何情况下,除非应用程序可以检测到外部配置的更改并热重载它们,否则通常需要(滚动)重启才能获取一些更改。

    【讨论】:

    • kubectl 在应用输入之前不知道如何处理 Go 模板。你在使用 Helm 之类的东西吗?
    • 我想我正在尝试(并且失败)实际使用 Helm
    【解决方案3】:

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

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

     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.
    

    【讨论】:

      猜你喜欢
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 2021-02-04
      • 2021-11-12
      • 2022-08-14
      • 2019-12-13
      • 1970-01-01
      相关资源
      最近更新 更多