kubectl 应用错误:将 YAML 转换为 JSON 时出错

Ali*_*Ali 8 json yaml go-templates kubernetes kubernetes-helm

收到此错误消息后 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)}
Run Code Online (Sandbox Code Playgroud)

我试过放在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 }}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*aze 6

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

annotations:一般属于下metadata:,旁边labels:。 Kubernetes 文档中的注释可能很有用。

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

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

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

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


api*_*sim 2

你在使用头盔吗?尝试将其移至annotations顶级元数据下方:

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

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