有些部署可能使用名称类似于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有接受“JSON补丁”的kubectl patch,还有看起来像是交互式的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的语法是什么
发布于 2017-10-12 19:33:38
使用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"
}
}
}
}
}发布于 2017-10-12 19:34:42
在我看来,如果你提前知道部署,那将是最好的。您应该从一些模板解决方案中生成应用的清单(我建议您熟悉helm,它不仅仅是模板),然后使用模板管理配置映射。
发布于 2017-10-12 20:23:46
输出旧配置名称、其在“volumes”数组中的索引以及部署的名称。过滤掉我们不感兴趣的配置,修补所有部署。
#!/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\" }]"
donehttps://stackoverflow.com/questions/46707697
复制相似问题