Як я можу оновити секрет Kubernetes, коли він генерується з файлу?


97

Я створив секрет, використовуючи kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt.

Якщо я хочу оновити значення - як я можу це зробити?

Відповіді:


241

Це має працювати:

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

21
Мені подобається розумне використання виводу до yaml та застосування команди. +1
Кевін Мансель,

10
В останній версії K8S, вам необхідно надати --save-configв kubectl create secretдля того , щоб уникнути попередження CLI.
Девід Хаус,

fyi, нещодавній (вересень 2019 р.) синтаксис, який працював для tls secret: kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -сертифікати були в простому тексті.
ldg

63

Ви можете видалити та негайно відтворити секрет:

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

Я вкладаю ці команди в сценарій, і під час першого дзвінка ви отримуєте попередження про (ще не) існуючий секрет, але це працює.


3
що відбувається з стручками, поки секрет видаляється?
BrunoJCM

4
@BrunoJCM запущені стручки не впливають, незалежно від того, наскільки вони отримують секрети через env-змінні або встановлюються як томи. Якщо стручок, який я запустив у той час, поки немає секрету, вони стикаються з помилкою; тому відповідь Яноша - найкращий шлях.
PJMeisch

2
Так, я розумію, використання applyмає набагато більше сенсу, дякую!
BrunoJCM

Це не --namespace=kube-system
спрацювало

залежить від того, до якого простору імен ви хочете додати секрет, якщо не за замовчуванням, то, звичайно, вам доведеться додати аргумент простору імен.
PJMeisch

8

Крім того, ви також можете використовувати jq' =або ' |=оператор для оновлення секретів на льоту.

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 -

Хоча це може бути не настільки елегантно чи просто, як kubectl create secret generic --dry-runпідхід, технічно цей підхід справді оновлює значення, а не видаляє / відтворює їх. Вам також знадобляться jqта base64(або openssl enc -base64) доступні команди tr- це загальнодоступна утиліта Linux для обрізки кінцевих нових рядків.

Детальніше про оператор оновлення див. Тут .jq|=


1

Оскільки я не зміг відповісти на відповідь Деві вище, що мені подобається, оскільки це збереже право власності, де видалення та відтворення може втратити зайву інформацію в записі. Я додаю це для нових людей, які можуть не відразу зрозуміти, коли їх змінні не інтерполюються.

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 -

Це призвело до того, що я намагаюся використати метод "патча" кубектл, який також, здається, працює.

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

Дякую Деві за відповідь, яка найкраще відповідала моїм потребам.


0

Для більш конкретних випадків вам може знадобитися вказати у вашому просторі імен, що cert потрібно оновити та видалити старий.

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

0

Я використав цей, і він спрацював як шарм:

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/ (для DockerHub)

Більш детально: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-secret-by-providing-credentials-on-the-command-line

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.