2017-10-12 18 views
0

cm-myapp-*のような名前のconfigmapを使用するデプロイメントがあります。すべてのデプロイメントを確認し、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 

「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の構文は何ですか?

+0

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

+0

@ mh-cbon、Kubernetesによって返された設定には、私が適用するのが快適ではない他のフィールドがあります。 – Velkan

+0

私はまったく同じことをやろうとしましたが、 'patch'は同じファイル内の複数のリソースでは動作しません。それらを別々のファイルに分割すると、 'patch'を使うことができます。 –

答えて

0

「awk for json」jqを使用して、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パッチ 'を持っています。 – Velkan

0

私の意見では、展開を事前に知っていれば最適です。いくつかのテンプレートソリューションから適用するマニフェストを生成する必要があります(私はhelmに慣れ親しんで、ちょうどテンプレートです)、テンプレートを使ってconfigmapを管理するようにしてください。

+0

私はテンプレートソリューション、特に 'helm'は必要ありません。 – Velkan

0

「ボリューム」アレイに古い設定名、そのインデックス、およびデプロイメントの名前を出力します。私たちが興味がないconfigsをフィルタリングし、すべての展開をパッチします。

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

同じことではなく、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\" }]" 
    done 
0

ここで私は、コンテナ名で画像をパッチするために使用しましたいくつかのkubectl patch構文は次のとおりです

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

kubectl patchの構文は何ですか?

公式文書は、の例でhereです。このガイドによれば、patchコマンドで--type=jsonを設定しようとするかもしれません。

構文には、JSON PatchJSON Merge Patchという2つの構文があります。

関連する問題