Perbarui k8s ConfigMap atau Rahasia tanpa menghapus yang sudah ada

100

Saya telah menggunakan K8S ConfigMap dan Secret untuk mengelola properti kami. Desain saya cukup sederhana, yang menyimpan file properti dalam git repo dan menggunakan server build seperti Thoughtworks GO untuk secara otomatis menerapkannya menjadi ConfigMaps atau Rahasia (dengan syarat pilihan) ke cluster k8s saya.

Saat ini, saya merasa tidak terlalu efisien sehingga saya harus selalu menghapus ConfigMap dan Rahasia yang ada dan membuat yang baru untuk diperbarui seperti di bawah ini:

  1. kubectl delete configmap foo

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

Adakah cara yang bagus dan sederhana untuk membuat satu langkah di atas dan lebih efisien daripada menghapus arus? berpotensi apa yang saya lakukan sekarang dapat membahayakan container yang menggunakan configmaps ini jika mencoba untuk me-mount sementara configmap lama dihapus dan yang baru belum dibuat.

James Jiang
sumber
Saya baru saja membuat proyek untuk memetakan configmap ke nilai lingkungan secara otomatis, ini dapat berguna bagi seseorang. github.com/Acanguven/kubernetes-configmap-update
Ahmet Can Güven

Jawaban:

161

Anda bisa mendapatkan YAML dari kubectl create configmapperintah dan menyalurkannya ke kubectl replace, seperti ini:

kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -
Jordan Liggitt
sumber
3
Pipa perintah adalah cara untuk pergi, tidak memikirkan --dry-run yang tampaknya menjadi bagian kunci dari perintah!
James Jiang
5
Untuk apa nilainya, pola yang sama ini dapat berfungsi untuk Rahasia selain contoh ConfigMaps yang ditunjukkan di sini.
rwehner
2
mencoba ini dengan kubernetes 1,10 tetapi saya terus mendapatkan kesalahanerror: 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
2
itu bug di 1.10 yang diselesaikan di 1.10.1 - lihat github.com/kubernetes/kubernetes/issues/61780 dan github.com/kubernetes/kubernetes/pull/61808
Jordan Liggitt
2
Jawaban yang bagus. menggunakan kubectl applyalih-alih kubectl replace, akan berfungsi baik untuk configmap baru dan yang sudah ada
nahsh
35

Untuk referensi di masa mendatang, kubectl replacesekarang cara yang sangat berguna untuk mencapai ini

kubectl replace -f some_spec.yaml Memungkinkan Anda memperbarui configMap lengkap (atau objek lain)

Lihat dokumen dan contoh langsung di sini

Salin / tempel dari bantuan:

# 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
Sébastien Portebois
sumber
2
Ini melewatkan --from-filepersyaratan. Configmaps dapat dibuat dari file arbitrer, bukan hanya yaml.
Dave Hillier
@ sébastien-portebois terima kasih! Saya tidak tahu --forceopsinya, apa yang memungkinkan kita menggunakan <dry-run ConfigMap creation> | kubectl replace --force -f -perintah pendekatan bahkan untuk pertama kalinya, ketika ConfigMap belum ada. Tetapi saya tidak yakin apakah aman untuk menghapus ConfigMap karena Pod mungkin rusak selama kekurangannya karena tidak menemukannya. Mungkin lebih baik pendekatannya <dry-run ConfigMap creation> | kubectl apply -f -? Poin ini diperkenalkan oleh @ karthic-c, bagaimana menurut Anda? Juga @ jordan-liggitt bagaimana menurutmu?
Alex MM
20

Untuk perubahan kecil configMap, gunakanedit

kubectl edit configmap <cfg-name>

Ini akan membuka configMap di vieditor. Lakukan perubahan dan simpan.

menyelam dalam
sumber
1
Keren. Namun, seperti yang disebutkan OP, ini tentang bagaimana mencapai tujuan dengan proses otomatis, misalnya. dengan ThoughtWorks Go sebagai server bangunan dalam skenario saya.
James Jiang
5

kubectl replace gagal jika configmap sudah ada:

$ 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

Solusi terbaik adalah menggunakan kubectl applyyang akan membuat configmap jika tidak ada, perbarui configmap jika ada:

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

configmap/falco-config configured

Karthik C
sumber
6
Saya pikir maksud Anda " kubectl replacegagal jika configmap belum ada".
David Dooling
1

Ambil salinan dari configmap yang ada:

kubectl get configmap foo -o yaml > foo.yaml

Dan kemudian lakukan modifikasi dan gunakan perintah terapkan, ini harus berfungsi.

kubectl apply -f foo.yaml

Catatan: Memetikan jika Anda melihat salah satu masalah berikut, sertakan "resourceVersion" terbaru dari peta konfigurasi yang ada dan coba lagi.

"Operasi tidak dapat diselesaikan di configmaps" foo ": objek telah dimodifikasi; terapkan perubahan Anda ke versi terbaru dan coba lagi"

Vallabha Vamaravelli
sumber