2017-10-12 56 views
0

有部署可能使用名稱爲cm-myapp-*的名稱的配置圖。如何編寫一個查看所有部署的腳本,並將其從cm-myapp-*的一些cm-myapp-*重新配置到新的特定cm-myapp-123如何使用腳本更改部署的ConfigMap?

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命令接受轉發模板,但它們不用於編輯。轉儲整個配置會給一些多餘的字段。

可以提取一些東西:

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

'echo「xx:cm-my-app- *」| sed s/cm-my-app - [*]/cm-my-app-123 /'? –

+0

@ mh-cbon,由Kubernetes返回的配置有其他字段,我不舒服的應用。 – Velkan

+0

我試圖做同樣的事情,發現'patch'不能在同一個文件中使用多個資源。如果你將它們分成不同的文件,你應該可以使用'patch'。 –

回答

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" 
     } 
     } 
    } 
    } 
} 
+0

我無法提取部署的明確定義。我不需要'jq',我已經有'kubectl patch'了。 – Velkan

0

在我看來,如果您事先知道部署的話,這將是最優的。你應該生成你從一些模板解決方案中應用的清單(我建議熟悉helm,這更多的僅僅是模板),然後使用模板管理configmap。

+0

我不需要模板解決方案,尤其是'helm'。 – Velkan

0

輸出舊配置名稱,其'volume'數組中的索引以及部署的名稱。過濾掉我們不感興趣的配置,修補所有部署。

#!/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

下面是一些kubectl patch語法我用來修補用的容器名稱圖片:通過修補volumes鍵代替

-p "{\"spec\":{\"template\":{\"spec\":{\"volumes\":[{\"name\":\"myapp\",\"image\":\"$imageUri\"}]}}}}" 

同樣的事情可能會爲你工作:

-p "{\"spec\":{\"template\":{\"spec\":{\"volumes\":[{\"name\":\"config-volume\",\"configMap\":{\"name\":\"myapp-123\"}}]}}}}" 

kubectl補丁的語法是什麼?

正式文件是here與例here。根據該指南,您可以嘗試在您的patch命令上設置--type=json

有兩種語法:JSON PatchJSON Merge Patch