Это многостраничный печатный вид этого раздела. Нажмите что бы печатать.

Вернуться к обычному просмотру страницы.

Управление Secrets

Управление конфиденциальными данными настроек с помощью Secrets.

1 - Управление Secrets с помощью kubectl

Создание объекта Secret с использованием утилиты командной строки 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).

Использование файлов в качестве источника

  1. Сохраните учётные данные в файлы:

    echo -n 'admin' > ./username.txt
    echo -n 'S!B\*d$zDsb=' > ./password.txt
    

    Флаг -n гарантирует, что в конце текста в сгенерированных файлах не будет лишнего символа новой строки. Это важно, поскольку при чтении файла и кодировании содержимого в строку base64 утилита kubectl закодирует лишний символ новой строки тоже. Экранировать специальные символы в строках, содержащихся в файле, не нужно.

  2. Передайте пути к файлам в команде 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

  1. Просмотрите содержимое созданного Secret:

    kubectl get secret db-user-pass -o jsonpath='{.data}'
    

    Вывод будет аналогичен следующему:

    { "password": "UyFCXCpkJHpEc2I9", "username": "YWRtaW4=" }
    
  2. Декодируйте данные поля 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 с помощью конфигурационного файла

Создание объектов Secret с использованием файла конфигурации ресурса.

Подготовка к работе

Вам нужен Kubernetes кластер и инструмент командной строки kubectl должен быть настроен на связь с вашим кластером. Если у вас ещё нет кластера, вы можете создать, его используя Minikube, или вы можете использовать одну из песочниц Kubernetes:

Создание Secret

Сначала можно описать Secret в манифесте в формате JSON или YAML, а затем создать этот объект. Ресурс Secret содержит два отображения: data и stringData. Поле data используется для хранения произвольных данных, закодированных в base64. Поле stringData предоставлено для удобства и позволяет указывать те же данные в виде незакодированных строк. Ключи полей data и stringData должны состоять из буквенно-цифровых символов, -, _ или ..

В следующем примере в Secret с помощью поля data сохраняются две строки.

  1. Закодируйте строки в 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
    
  2. Создайте манифест:

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: YWRtaW4=
      password: MWYyZDFlMmU2N2Rm
    

    Обратите внимание, что имя Secret должно быть допустимым именем DNS-поддомена.

  3. Создайте 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, выполните следующие действия:

  1. Закодируйте новую строку пароля:

    echo -n 'birdsarentreal' | base64
    

    Вывод будет аналогичен следующему:

    YmlyZHNhcmVudHJlYWw=
    
  2. Обновите поле data, указав новую строку пароля:

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: YWRtaW4=
      password: YmlyZHNhcmVudHJlYWw=
    
  3. Примените манифест к кластеру:

    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

Что дальше

3 - Управление Secrets с помощью Kustomize

Создание Secret с использованием файла kustomization.yaml.

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

  1. Сохраните учётные данные в файлы. Имена файлов станут ключами Secret:

    echo -n 'admin' > ./username.txt
    echo -n '1f2d1e2e67df' > ./password.txt
    

    Флаг -n гарантирует отсутствие символа новой строки в конце файлов.

  2. Создайте файл 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

  1. Измените данные в файле kustomization.yaml, например значение password.

  2. Примените директорию, содержащую файл kustomization:

    kubectl apply -k <directory-path>
    

    Вывод будет аналогичен следующему:

    secret/db-user-pass-6f24b56cc8 created
    

Отредактированный Secret создаётся как новый Secret, а не обновляет существующий. Возможно, потребуется обновить ссылки на Secret в ваших Pod'ах.

Очистка

Чтобы удалить Secret, используйте kubectl:

kubectl delete secret db-user-pass

Что дальше