首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用脚本更改展开的ConfigMap?

如何使用脚本更改展开的ConfigMap?
EN

Stack Overflow用户
提问于 2017-10-12 18:48:25
回答 4查看 2.8K关注 0票数 1

有些部署可能使用名称类似于cm-myapp-*的配置映射。如何编写一个脚本来查看所有部署,并将它们从使用某些cm-myapp-*重新配置为新的特定cm-myapp-123

代码语言:javascript
复制
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,但它们不能用于编辑。转储整个配置会产生一些多余的字段。

可以提取一些东西:

代码语言:javascript
复制
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}}"

需要给它打补丁(不起作用):

代码语言:javascript
复制
kubectl patch deployment myapp -p '{ "op": "replace", "path": ".spec.template.spec.volumes[0].name", "value": "cf" }'

那么,如何才能做到呢?kubectl patch的语法是什么

EN

回答 4

Stack Overflow用户

发布于 2017-10-12 19:33:38

使用jq,"awk for json“来转换JSON文档。我不确定您想要确切地更改哪些字段,但是如何调整它应该从jq参数中清晰可见。

代码语言:javascript
复制
$ 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"
        }
      }
    }
  }
}
票数 0
EN

Stack Overflow用户

发布于 2017-10-12 19:34:42

在我看来,如果你提前知道部署,那将是最好的。您应该从一些模板解决方案中生成应用的清单(我建议您熟悉helm,它不仅仅是模板),然后使用模板管理配置映射。

票数 0
EN

Stack Overflow用户

发布于 2017-10-12 20:23:46

输出旧配置名称、其在“volumes”数组中的索引以及部署的名称。过滤掉我们不感兴趣的配置,修补所有部署。

代码语言:javascript
复制
#!/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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46707697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档