Mevcut olanı silmeden k8s ConfigMap veya Secret'i güncelleyin


100

Mülklerimizi yönetmek için K8S ConfigMap ve Secret kullanıyorum. Tasarımım oldukça basittir, bu özellik dosyalarını bir git deposunda tutar ve Thoughtworks GO gibi derleme sunucusunu kullanarak bunları otomatik olarak ConfigMaps veya Secrets (seçim koşuluna göre) k8s kümeme dağıtmak için kullanır.

Şu anda, mevcut ConfigMap ve Secret'ı her zaman silmem ve aşağıdaki gibi güncellemek için yenisini oluşturmamın gerçekten verimli olmadığını anladım:

  1. kubectl delete configmap foo

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

Bir adımı aşmanın ve akımı silmekten daha verimli hale getirmenin güzel ve basit bir yolu var mı? Potansiyel olarak şu anda yaptığım şey, eski yapılandırma haritası silinirken ve yenisi oluşturulmamışken bağlanmaya çalışırsa, bu yapılandırma haritalarını kullanan kapsayıcıyı tehlikeye atabilir.


Configmap'i ortam değerlerine otomatik olarak eşlemek için bir proje oluşturdum, birisi için faydalı olabilir. github.com/Acanguven/kubernetes-configmap-update
Ahmet Can Güven

Yanıtlar:


161

YAML'yi kubectl create configmapkomuttan alabilir ve şu şekilde aktarabilirsiniz kubectl replace:

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

3
Komuta gitme yolu, komutun anahtar parçası gibi görünen - dry-run'ı düşünmüyordum!
James Jiang

5
Değeri ne olursa olsun, bu aynı model burada gösterilen ConfigMaps örneğine ek olarak Secrets için de işe yarayabilir.
rwehner

2
bunu kubernetes 1.10 ile deniyorum ama hatayı almaya devam ediyorumerror: 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


3
Mükemmel cevap. kubectl applyyerine kullanmak kubectl replacehem yeni hem de mevcut yapılandırma haritası için çalışacak
nahsh

35

Gelecekte kubectl replacebaşvurmak için, artık bunu başarmanın çok kullanışlı bir yolu

kubectl replace -f some_spec.yaml Tam bir configMap'i (veya diğer nesneleri) güncellemenize izin verin

Doğrudan burada dokümana ve örneklere bakın

Yardımdan kopyalayın / yapıştırın:

# 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
Bu --from-filegereksinimi kaçırdı . Yapılandırma haritaları sadece yaml dosyasından değil, rastgele bir dosyadan da oluşturulabilir.
Dave Hillier

@ sébastien-portebois teşekkürler! ConfigMap henüz mevcut olmadığında --force, yaklaşma <dry-run ConfigMap creation> | kubectl replace --force -f -komutunu 1. seferde bile kullanmamıza izin veren seçeneği bilmiyordum . Ancak ConfigMap'i silmenin güvenli olup olmadığından emin değilim, çünkü Bölmeler onu bulamadıkları için eksikliği sırasında bozulabilir. Belki yaklaşım daha iyidir <dry-run ConfigMap creation> | kubectl apply -f -? Bu nokta @ karthic-c tarafından tanıtıldı, ne düşünüyorsunuz? Ayrıca @ jordan-liggitt ne düşünüyorsun?
Alex MM

20

Küçük değişiklikler için configMapkullanınedit

kubectl edit configmap <cfg-name>

Bu, configMap'i vidüzenleyicide açacaktır . Değişiklikleri yapın ve kaydedin.


1
Güzel. Ancak, OP'nin bahsettiği gibi, bu hedefe otomatik süreçlerle nasıl ulaşılacağıyla ilgilidir, örn. benim senaryomda yapı sunucusu olarak ThoughtWorks Go ile.
James Jiang

5

kubectl replace bir yapılandırma haritası zaten mevcutsa başarısız olur:

$ 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

En iyi çözüm, kubectl applymevcut değilse configmap'i hangisinin yaratacağını kullanmaktır, yoksa configmap varsa güncelleyin:

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

configmap/falco-config configured


6
Sanırım " kubectl replacebir yapılandırma haritası yoksa başarısız olur " demek istediniz .
David Dooling

1

Mevcut yapılandırma haritasının bir kopyasını alın:

kubectl get configmap foo -o yaml > foo.yaml

Sonra değişiklikleri yapın ve uygula komutunu kullanın, bu işe yaramalı.

kubectl apply -f foo.yaml

Not: Aşağıdaki sorunlardan herhangi birini görürseniz, mevcut yapılandırma haritasından en son "resourceVersion" öğesini ekleyin ve tekrar deneyin.

"Yapılandırma haritalarında işlem gerçekleştirilemez" foo ": nesne değiştirildi; lütfen değişikliklerinizi en son sürüme uygulayın ve tekrar deneyin"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.