既存のものを削除せずにk8sConfigMapまたはSecretを更新します


100

私はK8SConfigMapとSecretを使用してプロパティを管理してきました。私のデザインは非常にシンプルで、プロパティファイルをgitリポジトリに保持し、Thoughtworks GOなどのビルドサーバーを使用して、プロパティファイルをConfigMapsまたはSecrets(選択条件)としてk8sクラスターに自動的にデプロイします。

現在、既存のConfigMapとSecretを常に削除し、以下のように更新する新しいものを作成する必要があるのは、あまり効率的ではないことがわかりました。

  1. kubectl delete configmap foo

  2. kubectl create configmap foo --from-file foo.properties

現在を削除するよりも、1つ以上のステップを効率的に行うための便利で簡単な方法はありますか?古い構成マップが削除され、新しい構成マップが作成されていないときにマウントしようとすると、これらの構成マップを使用するコンテナーが危険にさらされる可能性があります。

前もって感謝します。


configmapを環境値に自動的にマップするプロジェクトを作成しました。誰かに役立つ可能性があります。github.com/Acanguven/kubernetes-configmap-update
アフメット缶グベン

回答:


160

次のように、kubectl create configmapコマンドからYAMLを取得して、にパイプすることができますkubectl replace

kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -

3
コマンドをパイプするのが道であり、コマンドの重要な部分であると思われる--dry-runについては考えていませんでした。
James Jiang

5
ここに示すConfigMapsの例に加えて、この同じパターンがシークレットでも機能します。
rwehner 2016

2
kubernetes 1.10でこれを試してみましたが、エラーが発生し続けますerror: error validating "STDIN": error validating data: [apiVersion not set, kind not set]; if you choose to ignore these errors, turn validation off with --validate=false
yee379 2018


2
素晴らしい答え。使用するkubectl apply代わりにkubectl replace、新規および既存のconfigmapの両方に動作します
nahsh

33

将来の参考のkubectl replaceために、これを達成するための非常に便利な方法になりました

kubectl replace -f some_spec.yaml 完全なconfigMap(または他のオブジェクト)を更新できます

ここで直接ドキュメントと例を参照してください

ヘルプからコピー/貼り付け:

# Replace a pod using the data in pod.json.
kubectl replace -f ./pod.json

# Replace a pod based on the JSON passed into stdin.
cat pod.json | kubectl replace -f -

# Update a single-container pod's image version (tag) to v4
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -

# Force replace, delete and then re-create the resource
kubectl replace --force -f ./pod.json

2
これは--from-file要件を満たしていませんでした。Configmapは、yamlだけでなく、任意のファイルから作成できます。
デイブヒリアー2018

@sébastien-porteboisありがとう!ConfigMapがまだ存在しないときに、初めてでも--forceアプローチ<dry-run ConfigMap creation> | kubectl replace --force -f -コマンドを使用できるようにするオプションを知りませんでした。ただし、ConfigMapが見つからないためにポッドが不足しているときに破損する可能性があるため、ConfigMapを削除しても安全かどうかはわかりません。多分それはアプローチの方が良い<dry-run ConfigMap creation> | kubectl apply -f -ですか?この点は@ karthic-cによって紹介されたようなものですが、どう思いますか?また、@ jordan-liggittどう思いますか?
Alex MM

18

の小さな変更にはconfigMap、を使用しますedit

kubectl edit configmap <cfg-name>

これにより、configMapがviエディターで開きます。変更を加えて保存します。


1
涼しい。ただし、OPが述べたように、これは自動化されたプロセスで目標を達成する方法についてです。私のシナリオでは、ThoughtWorksGoをサーバーの構築として使用します。
ジェームズ・江

5

kubectl replace configmapがすでに存在する場合は失敗します:

$ kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -

Error from server (NotFound): error when replacing "STDIN": configmaps "falco-config" not found

最善の解決策は、kubectl apply存在しない場合はconfigmapを作成する、存在する場合はconfigmapを更新するを使用することです。

$ kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl apply -f -

configmap/falco-config configured


6
kubectl replaceconfigmapまだ存在しないと失敗する」という意味だと思います。
David Dooling
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.