Это многостраничный печатный вид этого раздела. Нажмите что бы печатать.
Управление Secrets
- 1: Управление Secrets с помощью kubectl
- 2: Управление Secrets с помощью конфигурационного файла
- 3: Управление Secrets с помощью Kustomize
1 - Управление Secrets с помощью kubectl
На этой странице показано, как создавать, редактировать, управлять и удалять Kubernetes
Secrets с помощью инструмента командной строки kubectl.
Подготовка к работе
Вам нужен Kubernetes кластер и инструмент командной строки kubectl должен быть настроен на связь с вашим кластером. Если у вас ещё нет кластера, вы можете создать, его используя Minikube, или вы можете использовать одну из песочниц Kubernetes:
Создание Secret
Объект Secret хранит конфиденциальные данные, например учётные данные,
используемые Pod'ами для доступа к сервисам. К примеру, может потребоваться Secret
для хранения имени пользователя и пароля, необходимых для доступа к базе данных.
Secret можно создать, передав данные непосредственно в команде или сохранив
учётные данные в файлах и указав их в команде. Следующие команды создают Secret,
в котором хранятся имя пользователя admin и пароль S!B\*d$zDsb=.
Использование исходных данных
Выполните следующую команду:
kubectl create secret generic db-user-pass \
--from-literal=username=admin \
--from-literal=password='S!B\*d$zDsb='
Для экранирования специальных символов ($, \, *, =, !) в строках
необходимо использовать одинарные кавычки ''. В противном случае оболочка
интерпретирует эти символы самостоятельно.
Примечание:
ПолеstringData у Secret плохо работает совместно с серверным применением (server-side apply).Использование файлов в качестве источника
-
Сохраните учётные данные в файлы:
echo -n 'admin' > ./username.txt echo -n 'S!B\*d$zDsb=' > ./password.txtФлаг
-nгарантирует, что в конце текста в сгенерированных файлах не будет лишнего символа новой строки. Это важно, поскольку при чтении файла и кодировании содержимого в строку base64 утилитаkubectlзакодирует лишний символ новой строки тоже. Экранировать специальные символы в строках, содержащихся в файле, не нужно. -
Передайте пути к файлам в команде
kubectl:kubectl create secret generic db-user-pass \ --from-file=./username.txt \ --from-file=./password.txtПо умолчанию именем ключа становится имя файла. При желании можно указать имя ключа явно с помощью
--from-file=[key=]source. Например:kubectl create secret generic db-user-pass \ --from-file=username=./username.txt \ --from-file=password=./password.txt
При использовании любого из этих методов вывод будет аналогичен следующему:
secret/db-user-pass created
Проверка Secret
Убедитесь, что Secret был создан:
kubectl get secrets
Вывод будет аналогичен следующему:
NAME TYPE DATA AGE
db-user-pass Opaque 2 51s
Просмотрите подробную информацию о Secret:
kubectl describe secret db-user-pass
Вывод будет аналогичен следующему:
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 12 bytes
username: 5 bytes
Команды kubectl get и kubectl describe по умолчанию не отображают содержимое Secret.
Это сделано для защиты от случайного раскрытия данных или их сохранения в логах терминала.
Декодирование Secret
-
Просмотрите содержимое созданного Secret:
kubectl get secret db-user-pass -o jsonpath='{.data}'Вывод будет аналогичен следующему:
{ "password": "UyFCXCpkJHpEc2I9", "username": "YWRtaW4=" } -
Декодируйте данные поля
password:echo 'UyFCXCpkJHpEc2I9' | base64 --decodeВывод будет аналогичен следующему:
S!B\*d$zDsb=Внимание:
Это пример, приведённый в целях документирования. На практике такой способ может привести к тому, что команда с закодированными данными сохранится в истории оболочки. Любой, кто имеет доступ к вашему компьютеру, сможет найти эту команду и декодировать секрет. Более предпочтительный подход — объединить команды просмотра и декодирования.kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode
Редактирование Secret
Вы можете редактировать существующий объект Secret, если он не является
неизменяемым.
Для редактирования Secret выполните следующую команду:
kubectl edit secrets <secret-name>
Откроется редактор по умолчанию, позволяющий обновить закодированные в base64
значения Secret в поле data, как показано в следующем примере:
# Пожалуйста, отредактируйте объект ниже. Строки, начинающиеся с '#', будут проигнорированы,
# а пустой файл отменит редактирование. При возникновении ошибки во время сохранения файл
# будет открыт повторно с указанием неполадок.
#
apiVersion: v1
data:
password: UyFCXCpkJHpEc2I9
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2022-06-28T17:44:13Z"
name: db-user-pass
namespace: default
resourceVersion: "12708504"
uid: 91becd59-78fa-4c85-823f-6d44436242ac
type: Opaque
Очистка
Чтобы удалить Secret, выполните следующую команду:
kubectl delete secret db-user-pass
Что дальше
2 - Управление Secrets с помощью конфигурационного файла
Подготовка к работе
Вам нужен Kubernetes кластер и инструмент командной строки kubectl должен быть настроен на связь с вашим кластером. Если у вас ещё нет кластера, вы можете создать, его используя Minikube, или вы можете использовать одну из песочниц Kubernetes:
Создание Secret
Сначала можно описать Secret в манифесте в формате JSON или YAML,
а затем создать этот объект. Ресурс
Secret
содержит два отображения: data и stringData.
Поле data используется для хранения произвольных данных, закодированных в base64.
Поле stringData предоставлено для удобства и позволяет указывать те же данные
в виде незакодированных строк.
Ключи полей data и stringData должны состоять из буквенно-цифровых символов,
-, _ или ..
В следующем примере в Secret с помощью поля data сохраняются две строки.
-
Закодируйте строки в base64:
echo -n 'admin' | base64 echo -n '1f2d1e2e67df' | base64Примечание:
Сериализованные значения данных Secret в JSON и YAML кодируются как строки base64. Символы новой строки недопустимы внутри этих строк и должны быть опущены. При использовании утилитыbase64в Darwin/macOS следует избегать опции-bдля разбиения длинных строк. Пользователям Linux, напротив, следует добавлять опцию-w 0к командамbase64или использовать конвейерbase64 | tr -d '\n', если опция-wнедоступна.Вывод будет аналогичен следующему:
YWRtaW4= MWYyZDFlMmU2N2Rm -
Создайте манифест:
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2RmОбратите внимание, что имя Secret должно быть допустимым именем DNS-поддомена.
-
Создайте Secret с помощью
kubectl apply:kubectl apply -f ./secret.yamlВывод будет аналогичен следующему:
secret/mysecret created
Чтобы проверить, что Secret был создан, и декодировать его данные, обратитесь к разделу Управление Secrets с помощью kubectl.
Указание незакодированных данных при создании Secret
В ряде сценариев может потребоваться использовать поле stringData. Оно позволяет
помещать строки без кодирования base64 непосредственно в Secret; при создании или
обновлении Secret строка будет закодирована автоматически.
Практический пример такого подхода — развёртывание приложения, которое использует Secret для хранения конфигурационного файла, когда часть значений этого файла нужно задать в процессе развёртывания.
Например, если приложение использует следующий конфигурационный файл:
apiUrl: "https://my.api.com/api/v1"
username: "<user>"
password: "<password>"
Его можно сохранить в Secret с помощью следующего определения:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
stringData:
config.yaml: |
apiUrl: "https://my.api.com/api/v1"
username: <user>
password: <password>
Примечание:
ПолеstringData у Secret плохо работает совместно с серверным применением (server-side apply).При получении данных Secret команда вернёт закодированные значения,
а не исходный открытый текст, переданный в поле stringData.
Например, при выполнении следующей команды:
kubectl get secret mysecret -o yaml
Вывод будет аналогичен следующему:
apiVersion: v1
data:
config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19
kind: Secret
metadata:
creationTimestamp: 2018-11-15T20:40:59Z
name: mysecret
namespace: default
resourceVersion: "7225"
uid: c280ad2e-e916-11e8-98f2-025000000001
type: Opaque
Одновременное указание data и stringData
Если одно и то же поле указано одновременно в data и stringData, используется
значение из stringData.
Например, если определить следующий Secret:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
stringData:
username: administrator
Примечание:
ПолеstringData у Secret плохо работает совместно с серверным применением (server-side apply).Объект Secret будет создан следующим образом:
apiVersion: v1
data:
username: YWRtaW5pc3RyYXRvcg==
kind: Secret
metadata:
creationTimestamp: 2018-11-15T20:46:46Z
name: mysecret
namespace: default
resourceVersion: "7579"
uid: 91460ecb-e917-11e8-98f2-025000000001
type: Opaque
YWRtaW5pc3RyYXRvcg== декодируется в administrator.
Редактирование Secret
Чтобы изменить данные в Secret, созданном с помощью манифеста, отредактируйте
поле data или stringData в манифесте и примените файл к кластеру.
Вы можете редактировать существующий объект Secret, если он не является
неизменяемым.
Например, чтобы изменить пароль из предыдущего примера на birdsarentreal,
выполните следующие действия:
-
Закодируйте новую строку пароля:
echo -n 'birdsarentreal' | base64Вывод будет аналогичен следующему:
YmlyZHNhcmVudHJlYWw= -
Обновите поле
data, указав новую строку пароля:apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: YmlyZHNhcmVudHJlYWw= -
Примените манифест к кластеру:
kubectl apply -f ./secret.yamlВывод будет аналогичен следующему:
secret/mysecret configured
Kubernetes обновит существующий Secret. Подробнее: инструмент kubectl
обнаруживает существующий Secret с тем же именем, получает его, планирует
изменения и отправляет обновлённый Secret на управляющий слой кластера.
Если вместо этого указать kubectl apply --server-side, утилита kubectl будет
использовать Server Side Apply.
Очистка
Чтобы удалить созданный Secret:
kubectl delete secret mysecret
Что дальше
- Подробнее о концепции Secret
- Как управлять Secrets с помощью kubectl
- Как управлять Secrets с помощью kustomize
3 - Управление Secrets с помощью Kustomize
kubectl поддерживает использование инструмента управления объектами Kustomize для управления Secrets
и ConfigMaps. С помощью Kustomize создаётся генератор ресурсов, который
формирует Secret, применяемый к API-серверу командой kubectl.
Подготовка к работе
Вам нужен Kubernetes кластер и инструмент командной строки kubectl должен быть настроен на связь с вашим кластером. Если у вас ещё нет кластера, вы можете создать, его используя Minikube, или вы можете использовать одну из песочниц Kubernetes:
Создание Secret
Secret можно сгенерировать, определив secretGenerator в файле
kustomization.yaml, который ссылается на существующие файлы, файлы .env
или литеральные значения. Например, следующие инструкции создают файл
kustomization для имени пользователя admin и пароля 1f2d1e2e67df.
Примечание:
ПолеstringData у Secret плохо работает совместно с серверным применением (server-side apply).Создание файла kustomization
secretGenerator:
- name: database-creds
literals:
- username=admin
- password=1f2d1e2e67df
-
Сохраните учётные данные в файлы. Имена файлов станут ключами Secret:
echo -n 'admin' > ./username.txt echo -n '1f2d1e2e67df' > ./password.txtФлаг
-nгарантирует отсутствие символа новой строки в конце файлов. -
Создайте файл
kustomization.yaml:secretGenerator: - name: database-creds files: - username.txt - password.txt
secretGenerator в файле kustomization.yaml можно также определить с помощью
файлов .env. Например, следующий файл kustomization.yaml считывает данные
из файла .env.secret:
secretGenerator:
- name: db-user-pass
envs:
- .env.secret
Во всех случаях кодировать значения в base64 не нужно. Имя YAML-файла должно
быть kustomization.yaml или kustomization.yml.
Применение файла kustomization
Чтобы создать Secret, примените директорию, содержащую файл kustomization:
kubectl apply -k <directory-path>
Вывод будет аналогичен следующему:
secret/database-creds-5hdh7hhgfk created
При генерации Secret его имя формируется путём хэширования данных Secret и добавления значения хэша к имени. Это гарантирует, что при каждом изменении данных будет сгенерирован новый Secret.
Чтобы убедиться, что Secret был создан, и декодировать его данные:
kubectl get -k <directory-path> -o jsonpath='{.data}'
Вывод будет аналогичен следующему:
{ "password": "MWYyZDFlMmU2N2Rm", "username": "YWRtaW4=" }
echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
Вывод будет аналогичен следующему:
1f2d1e2e67df
Дополнительную информацию см. в разделах Управление Secrets с помощью kubectl и Декларативное управление объектами Kubernetes с помощью Kustomize.
Редактирование Secret
-
Измените данные в файле
kustomization.yaml, например значениеpassword. -
Примените директорию, содержащую файл kustomization:
kubectl apply -k <directory-path>Вывод будет аналогичен следующему:
secret/db-user-pass-6f24b56cc8 created
Отредактированный Secret создаётся как новый Secret, а не обновляет существующий. Возможно, потребуется обновить ссылки на Secret в ваших Pod'ах.
Очистка
Чтобы удалить Secret, используйте kubectl:
kubectl delete secret db-user-pass