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