Как я могу обновить секрет в Kubernetes, если он сгенерирован из файла?

99

Я создал секрет, используя

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

Если я хочу обновить значения - как я могу это сделать?

Крис Стричински
источник

Ответы:

247

Это должно работать:

kubectl create secret generic production-tls \
    --from-file=./tls.key --from-file=./tls.crt --dry-run -o yaml | 
  kubectl apply -f -
Янош Ленарт
источник
22
Мне нравится умное использование вывода в yaml и применение команды. +1
Кевин
12
В последней версии K8S, вам необходимо предоставить --save-configв kubectl create secretдля того , чтобы избежать предупреждения CLI.
David House
fyi, недавний (сентябрь 2019 г.) синтаксис, который работал с секретом kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -tls : сертификаты были в виде обычного текста.
ldg
64

Вы можете удалить и сразу воссоздать секрет:

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

Я помещаю эти команды в скрипт, при первом вызове вы получаете предупреждение о (еще не существующем) секрете, но это работает.

PJMeisch
источник
3
что происходит со стручками, когда секрет удален?
BrunoJCM
4
На запущенные модули @BrunoJCM это не влияет, независимо от того, получают ли они секреты через переменные env или монтируются как тома. Если pod я запустил в то время, когда нет секрета, они столкнутся с ошибкой; поэтому ответ Яноша - лучший вариант.
PJMeisch
2
Да, понятно, в использовании applyгораздо больше смысла, спасибо!
BrunoJCM
Это не сработало для меня, потому что я забыл--namespace=kube-system
Сурадип Нанда
1
зависит от того, в какое пространство имен вы хотите добавить секрет, если не по умолчанию, чем, конечно, вы должны добавить аргумент пространства имен.
PJMeisch
9

Кроме того , вы также можете использовать jq«S =или |=оператора обновления секреты на лету.

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», который, похоже, тоже работает.

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

Спасибо Деви за ответ, который наилучшим образом удовлетворил мои потребности.

CJ Maahs
источник
0

Для более конкретных случаев вам может потребоваться указать пространство имен, в котором сертификат необходимо обновить, и удалить старый.

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

Чтобы расширить эти ответы, я обнаружил, что добавление '--ignore-not-found' к удалению помогло с нашим CICD, поскольку это не привело бы к ошибке, если бы секрет не существовал, он просто продолжил бы и создал его:

kubectl delete secret production-tls --ignore-not-found
kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt.
Киаран Джордж
источник
-1

Я использовал этот, и он отлично работал:

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.

Итай Бен Шмуэль
источник