Я создал секрет, используя
kubectl create secret generic production-tls \
--from-file=./tls.key \
--from-file=./tls.crt
Если я хочу обновить значения - как я могу это сделать?
Я создал секрет, используя
kubectl create secret generic production-tls \
--from-file=./tls.key \
--from-file=./tls.crt
Если я хочу обновить значения - как я могу это сделать?
Ответы:
Это должно работать:
kubectl create secret generic production-tls \
--from-file=./tls.key --from-file=./tls.crt --dry-run -o yaml |
kubectl apply -f -
--save-config
в kubectl create secret
для того , чтобы избежать предупреждения CLI.
kubectl create secret tls my-domain-tls --namespace=default --key=./tls.key --cert=./tls.crt --dry-run -o yaml | kubectl apply -f -
tls : сертификаты были в виде обычного текста.
Вы можете удалить и сразу воссоздать секрет:
kubectl delete secret production-tls
kubectl create secret generic production-tls --from-file=./tls.key --from-file=./tls.crt
Я помещаю эти команды в скрипт, при первом вызове вы получаете предупреждение о (еще не существующем) секрете, но это работает.
apply
гораздо больше смысла, спасибо!
--namespace=kube-system
Кроме того , вы также можете использовать 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
|=
Поскольку я не смог ответить на ответ Деви выше, который мне нравится, потому что он сохранит право собственности, когда удаление и воссоздание может привести к потере любой дополнительной информации в записи. Я добавляю это для новичков, которые могут не сразу понять, почему их переменные не интерполируются.
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}\"}}"
Спасибо Деви за ответ, который наилучшим образом удовлетворил мои потребности.
Для более конкретных случаев вам может потребоваться указать пространство имен, в котором сертификат необходимо обновить, и удалить старый.
**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} ```
Чтобы расширить эти ответы, я обнаружил, что добавление '--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.
Я использовал этот, и он отлично работал:
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.