有些部署可能使用名称为cm-myapp-*
的配置映射。如何编写一个脚本来查看所有部署并将其重新配置为使用某些cm-myapp-*
到新的特定cm-myapp-123
?
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: myapp
spec:
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:2
volumeMounts:
- name: config-volume
mountPath: /etc/myapp/
volumes:
- name: config-volume
configMap:
name: cm-myapp-9375546193
---
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-myapp-123
data:
myapp.conf: |
hi
有kubectl patch
接受'JSON补丁',并且kubectl edit
看起来像仅限交互式。一些kubectl
命令接受go-templates,但它们不用于编辑。转储整个配置会产生一些多余的字段。
可以提取一些东西:
kubectl get deployment -o go-template --template="{{range .items}}{{\$deploymentName := .metadata.name}}{{range .spec.template.spec.volumes}}{{if .configMap}}{{\$deploymentName}} {{.configMap}}:{{end}}{{end}}{{end}}" | tr ':' '\n'
kubectl get deployment myapp -ojsonpath="{.spec.template.spec.volumes[0].configMap.name}}"
需要修补它(不工作):
kubectl patch deployment myapp -p '{ "op": "replace", "path": ".spec.template.spec.volumes[0].name", "value": "cf" }'
那怎么办呢? kubectl patch
的语法是什么?
答案 0 :(得分:0)
使用jq,“awk for json”转换JSON文档。我不确定你想要改变哪些字段,但是如何调整它应该从jq参数中清楚。
$ cat x.json
{
"apiVersion": "apps/v1beta1",
"kind": "Deployment",
"foo": "myapp"
"metadata": {
"name": "myapp"
},
"spec": {
"template": {
"metadata": {
"labels": {
"app": "myapp"
}
}
}
}
}
$ jq '
.metadata.name = "cm-myapp-123"
| .spec.template.metadata.labels.app = "cm-myapp-123"
| .
' < x.json
{
"apiVersion": "apps/v1beta1",
"kind": "Deployment",
"foo": "myapp"
"metadata": {
"name": "cm-myapp-123"
},
"spec": {
"template": {
"metadata": {
"labels": {
"app": "cm-myapp-123"
}
}
}
}
}
答案 1 :(得分:0)
在我看来,如果您事先了解部署情况,那将是最佳选择。您应该从一些模板解决方案中生成您应用的清单(我建议您熟悉helm
,而不仅仅是模板),然后使用模板管理配置映射。
答案 2 :(得分:0)
输出旧的配置名称,“卷”数组中的索引以及部署的名称。过滤掉我们不感兴趣的配置,修补所有部署。
#!/bin/bash
name=cm-myapp
unique_name=cm-myapp-123
# Columns: ConfigMap name, index in volumes, Deployment name.
kubectl get deployment -o go-template --template="{{range .items}}{{\$deploymentName := .metadata.name}}{{range \$i, \$v := .spec.template.spec.volumes}}{{if .configMap}}{{.configMap.name}} {{\$i}} {{\$deploymentName}}:{{end}}{{end}}{{end}}" | tr ':' '\n' |
egrep "^$name-[^-]+ " | while read l; do
i=$(printf '%s\n' "$l" | awk '{print $2}')
deployment=$(printf '%s\n' "$l" | awk '{print $3}')
kubectl patch deployment $deployment --type=json -p "[{ \"op\": \"replace\", \"path\": \"/spec/template/spec/volumes/$i/configMap/name\", \"value\": \"$unique_name\" }]"
done
答案 3 :(得分:0)
以下是我用于按容器名称修补图片的一些kubectl patch
语法:
-p "{\"spec\":{\"template\":{\"spec\":{\"volumes\":[{\"name\":\"myapp\",\"image\":\"$imageUri\"}]}}}}"
通过修补volumes
密钥,同样的事情可能对您有用:
-p "{\"spec\":{\"template\":{\"spec\":{\"volumes\":[{\"name\":\"config-volume\",\"configMap\":{\"name\":\"myapp-123\"}}]}}}}"
kubectl补丁的语法是什么?
官方文档为here,其中包含示例here。根据该指南,您可以尝试在--type=json
命令上设置patch
。
有两种语法:JSON Patch和JSON Merge Patch。