Как скопировать secret (секрет) Kubernetes из одного пространства имен в другое пространство имен (namespace)?
Secret – это объект Kubernetes, в котором хранятся конфиденциальные данные, такие как пароль, токен или ключ.
В противном случае такая информация могла бы быть помещена в спецификацию пода или образа, но для совместного использования между подами и службами это лучше сделать через объект Kubernetes.
Пользователи кластера Kubernetes могут создавать секреты, а также и система создает некоторые секреты.
В этом руководстве мы скопируем секрет, уже созданный в пространстве имен или проекте при использовании OpenShift, и применим его к другому пространству имен.
Это хорошая практика – например секреты registry, общие учетные данные git, сертификаты и ключи SSL, общие учетные данные API и т. д.
Мы создадим тестовый секрет и покажем, как копировать его из одного проекта в другой.
Создание секретов Kubernetes
Мы создадим секрет с именем пользователя и паролем из файла.
echo -n 'admin' > ./username.txt
echo -n 'Password' > ./password.txt
Запустите команду kubectl create secret, чтобы упаковать эти файлы в секрет и создать объект на сервере API.
$ kubectl create secret generic my-user-pass --from-file=./username.txt --from-file=./password.txt
secret/my-user-pass created
Перечислим наши секреты:
$ kubectl get secrets
Копирование секретов Kubernetes между неймспейсами
Используйте следующий синтаксис команды kubectl, чтобы скопировать секрет из одного пространства имен в другое пространство имен.
kubectl get secret <secret-name> \
--namespace=<source-nemespace> \
--export -o yaml | \
kubectl apply --namespace=<new-namespace> -f -
В моем примере я выполню:
kubectl get secret my-user-pass \
--namespace=namespace1 \
--export -o yaml | \
kubectl apply --namespace=namespace2 -f -
Вывод выполнения команды:
secret/my-user-pass created
Подтвердите создание секрета в пространстве имен.
$ kubectl get secret -n namespace2 my-user-pass
NAME TYPE DATA AGE
my-user-pass Opaque 2 38s
Расшифруйте секрет, чтобы подтвердить правильность данных:
secret_name="my-user-pass"
namespace="namespace2"
kubectl get secret -n $namespace $secret_name -o go-template='{{range $k,$v := .data}}{{printf "%s: " $k}}{{if not $v}}{{$v}}{{else}}{{$v | base64decode}}{{end}}{{"\n"}}{{end}}'
Вывод команды:
password.txt: Password
username.txt: admin
Если у вас есть jq, вы можете использовать следующую команду для расшифровки.
$ kubectl get secret my-user-pass -o json | jq '.data | map_values(@base64d)'
{
"password.txt": "Password",
"username.txt": "admin"
}
Вот как вы можете легко скопировать секрет между пространствами имен в Kubernetes и OpenShift кластерах.