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?

Chris Stryczynski
la source

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 -
Janos Lenart
la source
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.

PJMeisch
la source
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 |=.

Devy
la source
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.

CJ Maahs
la source
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} ```
JohnBegood
la source
0

J'ai utilisé celui-ci et cela a fonctionné comme un charme:

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

docker-server = https://index.docker.io/v1/ (pour DockerHub)

Pour plus de détails: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-secret-by-providing-credentials-on-the-command-line

Itay Ben Shmuel
la source