Comment puis-je mettre à jour un secret sur Kubernetes lorsqu'il est généré à partir d'un fichier?


97

J'ai créé un secret en utilisant kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt.

Si je souhaite mettre à jour les valeurs, comment puis-je faire cela?

Réponses:


242

Cela devrait fonctionner:

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

21
J'aime l'utilisation intelligente de la sortie pour yaml et appliquer la commande. +1
Kevin Mansel

10
Dans la dernière version de k8s, vous devrez fournir --save-configau kubectl create secretafin d'éviter un avertissement CLI.
David House

fyi, syntaxe récente (septembre 2019) qui a fonctionné pour tls secret: kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -les certificats étaient en texte brut.
ldg le

63

Vous pouvez supprimer et recréer immédiatement le secret:

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

J'ai mis ces commandes dans un script, au premier appel, vous recevez un avertissement concernant le secret existant (pas encore), mais cela fonctionne.


3
que se passe-t-il avec les pods lorsque le secret est supprimé?
BrunoJCM

4
Les pods en cours d'exécution @BrunoJCM ne sont pas affectés, peu importe qu'ils obtiennent les secrets via des variables d'environnement ou montés en tant que volumes. Si un pod j'ai démarré dans le temps alors qu'il n'y a pas de secret, il se heurte à une erreur; la réponse de Janos est donc la meilleure solution.
PJMeisch

2
Oui, je vois, l'utilisation a applybeaucoup plus de sens, merci!
BrunoJCM

Cela ne fonctionnait pas pour moi parce que j'ai oublié le--namespace=kube-system
Souradeep Nanda

dépend de l'espace de noms auquel vous souhaitez ajouter le secret, sinon par défaut , vous devez bien sûr ajouter l'argument d'espace de noms.
PJMeisch

8

Vous pouvez également utiliser l jq' opérateur =ou |=pour mettre à jour les secrets à la volée.

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 -

Bien qu'elle ne soit pas aussi élégante ou simple que l' kubectl create secret generic --dry-runapproche, techniquement, cette approche met réellement à jour les valeurs plutôt que de les supprimer / recréer. Vous aurez également besoin jqet base64(ou openssl enc -base64) des commandes disponibles,tr est un utilitaire Linux couramment disponible pour couper les nouvelles lignes de fin.

Voir ici pour plus de détails sur l' jqopérateur de mise à jour |=.


1

Comme je n'ai pas pu répondre à la réponse de Devy ci-dessus, ce que j'aime parce que cela préservera la propriété où la suppression et la recréation risquent de perdre des informations supplémentaires dans le dossier. J'ajoute ceci pour les nouvelles personnes qui peuvent ne pas comprendre immédiatement que leurs variables ne sont pas interpolées.

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 -

Cela m'a conduit à essayer d'utiliser la méthode «patch» de kubectl, qui semble également fonctionner.

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

Merci Devy pour la réponse qui a le mieux répondu à mes besoins.


0

Pour des cas plus spécifiques, vous devrez peut-être spécifier votre espace de noms que le certificat doit être renouvelé et supprimer l'ancien.

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.