Come posso aggiornare un segreto su Kubernetes quando viene generato da un file?


97

Ho creato un segreto usando kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt.

Se desidero aggiornare i valori, come posso farlo?

Risposte:


242

Questo dovrebbe funzionare:

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

21
Mi piace l'uso intelligente dell'output di yaml e del comando apply. +1
Kevin Mansel

10
Nell'ultima versione di k8s, dovrai fornire --save-configa kubectl create secretper evitare un avviso della CLI.
David House

fyi, sintassi recente (settembre 2019) che ha funzionato per tls secret: kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -i certificati erano in testo normale.
LDG

63

Puoi eliminare e ricreare immediatamente il segreto:

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

Ho inserito questi comandi in uno script, alla prima chiamata ricevi un avviso sul segreto (non ancora) esistente, ma funziona.


3
cosa succede con i pod mentre il segreto viene cancellato?
BrunoJCM

4
I pod in esecuzione di @BrunoJCM non sono interessati, indipendentemente dal fatto che ottengano i segreti tramite variabili env o montati come volumi. Se un pod che ho avviato nel tempo in cui non ci sono segreti, si verifica un errore; quindi la risposta di Janos è la strada preferita da percorrere.
PJMeisch

2
Sì, vedo, usare applyha molto più senso, grazie!
BrunoJCM

Questo non funzionava per me perché ho dimenticato il--namespace=kube-system
Souradeep Nanda

dipende dallo spazio dei nomi a cui si desidera aggiungere il segreto, se non di default, ovviamente è necessario aggiungere l'argomento dello spazio dei nomi.
PJMeisch

8

In alternativa, puoi anche utilizzare jql' operatore =o |=per aggiornare i segreti al volo.

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 -

Anche se potrebbe non essere così elegante o semplice come l' kubectl create secret generic --dry-runapproccio, tecnicamente, questo approccio sta veramente aggiornando i valori piuttosto che eliminarli / ricrearli. Avrai anche bisogno dei comandi jqe base64(o openssl enc -base64) disponibili, trè un'utilità Linux comunemente disponibile per tagliare le nuove righe finali.

Vedi qui per maggiori dettagli sull'operatore di jqaggiornamento |=.


1

Poiché non sono stato in grado di rispondere alla risposta di Devy sopra, il che mi piace perché preserverà la proprietà in cui l'eliminazione e la ricreazione hanno il potenziale per perdere qualsiasi informazione extra nel record. Aggiungo questo per le persone più recenti che potrebbero non capire immediatamente il siero di latte le loro variabili non vengono interpolate.

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 -

Questo mi ha portato a tentare di utilizzare il metodo "patch" di kubectl, che sembra funzionare.

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

Grazie Devy per la risposta che meglio ha soddisfatto le mie esigenze.


0

Per casi più specifici potresti dover specificare il tuo spazio dei nomi che il certificato deve essere rinnovato ed eliminare quello vecchio.

**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} ```

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.