Jak mogę zaktualizować hasło na Kubernetes, gdy jest generowane z pliku?

102

Stworzyłem sekret za pomocą

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

Jeśli chciałbym zaktualizować wartości - jak mogę to zrobić?

Chris Stryczynski
źródło

Odpowiedzi:

261

To powinno działać:

kubectl create secret generic production-tls \
    --from-file=./tls.key --from-file=./tls.crt --dry-run -o yaml | 
  kubectl apply -f -
Janos Lenart
źródło
23
Podoba mi się sprytne wykorzystanie wyjścia do yaml i zastosuj polecenie. +1
Kevin Mansel
12
W najnowszej wersji k8s musisz podać --save-configdo kubectl create secret, aby uniknąć ostrzeżenia CLI.
David House
fyi, ostatnia (wrzesień 2019 r.) składnia, która działała dla tajnego tls: kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -certyfikaty były w postaci zwykłego tekstu.
ldg
Należy używać --dry-run=clientz kubectl 1.18 lub nowszym.
RichVel
65

Możesz usunąć i od razu odtworzyć sekret:

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

Umieściłem te polecenia w skrypcie, przy pierwszym wywołaniu otrzymasz ostrzeżenie o (jeszcze) istniejącym tajemnicy, ale to działa.

PJMeisch
źródło
3
co się dzieje z strąkami, gdy sekret jest usuwany?
BrunoJCM
4
Nie ma to wpływu na działające pody @BrunoJCM, bez względu na to, czy uzyskują sekrety za pomocą zmiennych env, czy są montowane jako woluminy. Jeśli kapsuła została uruchomiona w czasie, gdy nie ma sekretu, napotkają błąd; dlatego preferowaną drogą jest odpowiedź Janosa.
PJMeisch
2
Tak, widzę, używanie applyma o wiele więcej sensu, dzięki!
BrunoJCM,
To nie działało dla mnie, ponieważ zapomniałem--namespace=kube-system
Souradeep Nanda
1
zależy od przestrzeni nazw, do której chcesz dodać sekret, jeśli nie domyślną, musisz oczywiście dodać argument przestrzeni nazw.
PJMeisch
9

Alternatywnie, można również użyć jq„s =lub |=operatorowi aktualizacji tajemnic w locie.

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 -

Chociaż może nie być tak eleganckie lub proste, jak to kubectl create secret generic --dry-runpodejście, technicznie podejście to polega na prawdziwej aktualizacji wartości, a nie ich usuwaniu / odtwarzaniu. Będziesz także potrzebował jqi base64(lub openssl enc -base64) dostępnych poleceń, trjest to powszechnie dostępne narzędzie Linuksa do przycinania końcowych znaków nowej linii.

Zobacz tutaj, aby uzyskać więcej informacji na temat jqoperatora aktualizacji |=.

Devy
źródło
1

Ponieważ nie byłem w stanie odpowiedzieć na powyższą odpowiedź Devy'ego, co mi się podoba, ponieważ zachowa własność, w przypadku gdy usunięcie i ponowne utworzenie może spowodować utratę dodatkowych informacji w rekordzie. Dodam to dla nowszych ludzi, którzy mogą nie od razu zrozumieć, dlaczego ich zmienne nie są interpolowane.

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 -

To doprowadziło mnie do próby użycia metody „patch” kubectl, która również wydaje się działać.

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

Dzięki Devy za odpowiedź, która najlepiej spełniła moje potrzeby.

CJ Maahs
źródło
1

Aby rozwinąć te odpowiedzi, stwierdziłem, że dodanie `` --ignore-not-found '' do usunięcia pomogło w naszym CICD, ponieważ nie byłoby błędu, gdyby sekret nie istniał, po prostu kontynuowałby i tworzył go:

kubectl delete secret production-tls --ignore-not-found
kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt.
Ciaran George
źródło
0

W bardziej szczegółowych przypadkach może być konieczne określenie przestrzeni nazw, w której certyfikat należy odnowić, i usunięcie starego.

**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
źródło