Wie kann ich ein Geheimnis auf Kubernetes aktualisieren, wenn es aus einer Datei generiert wird?

96

Ich habe ein Geheimnis mit erstellt kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt.

Wenn ich die Werte aktualisieren möchte - wie kann ich das tun?

Chris Stryczynski
quelle

Antworten:

240

Das sollte funktionieren:

kubectl create secret generic production-tls \
    --from-file=./tls.key --from-file=./tls.crt --dry-run -o yaml | 
  kubectl apply -f -
Janos Lenart
quelle
21
Ich mag die clevere Verwendung der Ausgabe, um Befehle zu yamlieren und anzuwenden. +1
Kevin Mansel
10
In der neuesten Version von K8S, müssen Sie zur Verfügung zu stellen , --save-configum die kubectl create secretum eine CLI - Warnung zu vermeiden.
David House
fyi, aktuelle Syntax (September 2019), die für tls secret funktioniert hat: kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -Die Zertifikate waren im Klartext.
ldg
63

Sie können das Geheimnis löschen und sofort neu erstellen:

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

Ich habe diese Befehle in ein Skript eingefügt. Beim ersten Aufruf erhalten Sie eine Warnung über das (noch nicht) vorhandene Geheimnis, aber das funktioniert.

PJMeisch
quelle
3
Was passiert mit Pods, während das Geheimnis gelöscht wird?
BrunoJCM
4
@BrunoJCM-laufende Pods sind nicht betroffen, unabhängig davon, ob sie die Geheimnisse über env-Variablen erhalten oder als Volumes bereitgestellt werden. Wenn ein Pod, den ich in der Zeit gestartet habe, in der es kein Geheimnis gibt, ein Fehler auftritt; Daher ist Janos 'Antwort der bevorzugte Weg.
PJMeisch
2
Ja, ich applyverstehe, die Verwendung macht viel mehr Sinn, danke!
BrunoJCM
Dies funktionierte nicht für mich, weil ich die--namespace=kube-system
Souradeep Nanda
hängt davon ab, zu welchem ​​Namespace Sie das Geheimnis hinzufügen möchten. Wenn nicht standardmäßig , müssen Sie natürlich das Namespace-Argument hinzufügen.
PJMeisch
8

Alternativ können Sie auch jq's =oder |=Operator verwenden, um Geheimnisse im laufenden Betrieb zu aktualisieren.

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 -

Obwohl es kubectl create secret generic --dry-runtechnisch gesehen möglicherweise nicht so elegant oder einfach ist wie der Ansatz, aktualisiert dieser Ansatz die Werte wirklich, anstatt sie zu löschen / neu zu erstellen. Sie benötigen auch jqund base64(oder openssl enc -base64) Befehle zur Verfügung,tr ein allgemein verfügbares Linux-Dienstprogramm zum Trimmen nachfolgender Zeilenumbrüche.

Sehen Sie hier , um weitere Informationen über jqUpdate - Operator |=.

Devy
quelle
1

Da ich nicht auf Devys Antwort oben antworten konnte, was mir gefällt, weil dadurch die Eigentümerschaft erhalten bleibt, wenn beim Löschen und Neuerstellen zusätzliche Informationen in der Aufzeichnung verloren gehen können. Ich füge dies für die neueren Leute hinzu, die möglicherweise nicht sofort verstehen, dass Molke ihre Variablen nicht interpoliert werden.

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 -

Dies führte mich zu dem Versuch, die 'Patch'-Methode von kubectl zu verwenden, die ebenfalls zu funktionieren scheint.

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

Vielen Dank an Devy für die Antwort, die meinen Bedürfnissen am besten entspricht.

CJ Maahs
quelle
0

In genaueren Fällen müssen Sie möglicherweise Ihren Namespace angeben, in dem das Zertifikat erneuert werden muss, und den alten löschen.

**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
quelle
0

Ich habe dieses benutzt und es hat wie ein Zauber funktioniert:

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/ (für DockerHub)

Für weitere Informationen: 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
quelle