如何使用脚本更改部署的ConfigMap?

时间:2017-10-12 10:48:25

标签: json go kubernetes

有些部署可能使用名称为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的语法是什么?

4 个答案:

答案 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 PatchJSON Merge Patch

相关问题