Kubernetes'te bir dosyadan oluşturulmuş bir sırrı nasıl güncelleyebilirim?


103

Kullanarak bir sır oluşturdum

kubectl create secret generic production-tls \
  --from-file=./tls.key \
  --from-file=./tls.crt

Değerleri güncellemek istersem - bunu nasıl yapabilirim?

Yanıtlar:


262

Bu çalışmalı:

kubectl create secret generic production-tls \
    --from-file=./tls.key --from-file=./tls.crt --dry-run -o yaml | 
  kubectl apply -f -

23
Çıktının yaml için akıllıca kullanılmasını ve komutun uygulanmasını seviyorum. +1
Kevin Mansel

12
K8S son sürümünde, sağlamanız gerekir --save-configiçin kubectl create secretbir CLI uyarı önlemek için.
David Evi

fyi, tls sırrı için çalışan son (Eylül 2019) sözdizimi: kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -Sertifikalar düz metindeydi.
ldg

--dry-run=clientKubectl 1.18 veya üstü ile kullanmanız gerekir.
RichVel

65

Sırrı silebilir ve hemen yeniden oluşturabilirsiniz:

kubectl delete secret production-tls
kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt

Bu komutları bir betiğe koyuyorum, ilk çağrıda (henüz değil) var olan sır hakkında bir uyarı alıyorsunuz ama bu çalışıyor.


3
sır silinirken bölmelere ne olur?
BrunoJCM

4
@BrunoJCM çalışan kapsüller, sırları env değişkenleri aracılığıyla alsalar veya birimler olarak monte etseler de etkilenmez. Sır yokken zamanında başlattığım bir kapsül, bir hatayla karşılaşır; bu nedenle Janos'un cevabı tercih edilen yol.
PJMeisch

2
Evet görüyorum, kullanmak applyçok daha mantıklı, teşekkürler!
BrunoJCM

Unutmuşum çünkü bu benim için çalışma değildi--namespace=kube-system
Souradeep Nanda

1
sırrı hangi ad alanına eklemek istediğinize bağlıdır, eğer varsayılan değilse tabii ki ad alanı argümanını eklemeniz gerekir.
PJMeisch

9

Alternatif olarak, sırları anında güncellemek için jq's =veya |=operatörünü de kullanabilirsiniz .

TLS_KEY=$(base64 < "./tls.key" | tr -d '\n')
TLS_CRT=$(base64 < "./tls.crt" | tr -d '\n')
kubectl get secrets production-tls -o json \
        | jq '.data["tls.key"] |= "$TLS_KEY"' \
        | jq '.data["tls.crt"] |= "$TLS_CRT"' \
        | kubectl apply -f -

kubectl create secret generic --dry-runYaklaşım kadar zarif veya basit olmasa da , teknik olarak bu yaklaşım değerleri silmek / yeniden oluşturmaktan ziyade gerçekten değerleri güncelliyor. Ayrıca jqve base64(veya openssl enc -base64) komutlara ihtiyacınız olacak , trsondaki satırları kırpmak için yaygın olarak bulunan bir Linux yardımcı programıdır.

Güncelleme operatörü hakkında daha fazla ayrıntı için buraya bakın .jq|=


1

Yukarıdaki Devy'nin cevabına cevap veremediğim için, bu hoşuma gidiyor çünkü silme ve yeniden oluşturma, kayıttaki ekstra bilgileri kaybetme potansiyeline sahip olduğunda Sahipliği koruyacak. Bunu, değişkenlerinin enterpolasyona tabi tutulmadığını hemen anlayamayan yeni insanlar için ekliyorum.

TLS_KEY=$(base64 < "./tls.key" | tr -d '\n')
TLS_CRT=$(base64 < "./tls.crt" | tr -d '\n')
kubectl get secrets production-tls -o json \
        | jq ".data[\"tls.key\"] |= \"$TLS_KEY\"" \
        | jq ".data[\"tls.crt\"] |= \"$TLS_CRT\"" \
        | kubectl apply -f -

Bu beni kubectl'in 'yama' yöntemini kullanmaya yöneltti, ki bu da işe yarıyor gibi görünüyor.

kubectl \
        patch \
        secret \
        production-tls \
        -p "{\"data\":{\"tls.key\":\"${TLS_KEY}\",\"tls.crt\":\"${TLS_CRT}\"}}"

İhtiyaçlarımı en iyi karşılayan yanıt için teşekkürler Devy.


1

Sadece bu cevapları genişletmek için, silme işlemine '--ignore-not-found' eklemenin CICD'mize yardımcı olduğunu buldum, çünkü eğer sır yoksa, hata yapmazdı, devam eder ve onu oluştururdu:

kubectl delete secret production-tls --ignore-not-found
kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt.

0

Daha özel durumlar için, sertifikanın yenilenmesi gereken ad alanınızı belirtmeniz ve eskisini silmeniz gerekebilir.

**For deletion of the cert **
kubectl delete secret -n `namespace`

**For creation of new cert to specific namespace **
kubectl create secret {your-cert-name} --key /etc/certs/{name}.com.key --cert /etc/certs/{name}.com.crt -n {namespace} ```
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.