Синхронизация с секретами Yandex Managed Service for Kubernetes
External Secrets Operator позволяет настроить синхронизацию секретов Yandex Lockbox с секретами кластера Managed Service for Kubernetes.
Существует несколько схем интеграции Yandex Lockbox с сервисом Managed Service for Kubernetes. Далее для примера рассматривается схема ESO as a Service:
Чтобы настроить синхронизацию секретов:
- Установите External Secrets Operator.
- Настройте Yandex Lockbox.
- Настройте кластер Kubernetes.
- Создайте External Secret.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Создайте инфраструктуру
- Создайте облачную сеть и подсеть.
- Создайте сервисный аккаунт с именем
eso-service-account
, необходимый для работы External Secrets Operator. - Создайте кластер Managed Service for Kubernetes и группу узлов любой подходящей конфигурации.
-
Если у вас еще нет Terraform, установите его.
-
Скачайте файл с настройками провайдера. Поместите его в отдельную рабочую директорию и укажите значения параметров.
-
Скачайте в ту же рабочую директорию файл конфигурации кластера k8s-cluster.tf. В файле описаны:
- Сеть.
- Сеть.
- Группа безопасности и правила, необходимые для работы кластера Managed Service for Kubernetes:
- Правила для служебного трафика.
- Правила для доступа к API Kubernetes и управления кластером с помощью
kubectl
через порты 443 и 6443.
- Кластер Managed Service for Kubernetes.
- Сервисный аккаунт, необходимый для работы кластера и группы узлов Managed Service for Kubernetes.
-
Укажите в файле конфигурации:
- Идентификатор каталога.
- Версии Kubernetes для кластера и групп узлов Managed Service for Kubernetes.
- CIDR кластера Managed Service for Kubernetes.
- Имя сервисного аккаунта кластера.
-
Выполните команду
terraform init
в директории с конфигурационными файлами. Эта команда инициализирует провайдер, указанный в конфигурационных файлах, и позволяет работать с ресурсами и источниками данных провайдера. -
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления.
-
Подготовьте окружение
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
. -
Установите утилиту
jq
:sudo apt update && sudo apt install jq
-
Создайте сервисный аккаунт с именем
eso-service-account
, необходимый для работы External Secrets Operator. -
Создайте авторизованный ключ для сервисного аккаунта и сохраните его в файл
authorized-key.json
:yc iam key create \ --service-account-name eso-service-account \ --output authorized-key.json
-
Создайте кластер Managed Service for Kubernetes и группу узлов любой подходящей конфигурации.
-
Установите kubectl и настройте его на работу с созданным кластером.
Установите External Secrets Operator
Чтобы установить External Secrets Operator, воспользуйтесь инструкцией.
Настройте Yandex Lockbox
-
- Имя —
lockbox-secret
. - Ключ/Значение:
- Ключ —
password
. - Значение → Текст —
p@$$w0rd
.
- Ключ —
- Имя —
-
Получите идентификатор секрета:
yc lockbox secret list
Результат выполнения команды:
+--------------------------------------------+----------------+------------+---------------------+----------------------+--------+ | ID | NAME | KMS KEY ID | CREATED AT | CURRENT VERSION ID | STATUS | +--------------------------------------------+----------------+------------+---------------------+----------------------+--------+ | <идентификатор Yandex Lockbox-секрета> | lockbox-secret | | 2021-09-19 04:33:44 | e6qlkguf0hs4q3i6jpen | ACTIVE | +--------------------------------------------+----------------+------------+---------------------+----------------------+--------+
-
Чтобы сервисный аккаунт
eso-service-account
имел доступ к секрету, присвойте этому аккаунту рольlockbox.payloadViewer
:yc lockbox secret add-access-binding \ --name lockbox-secret \ --service-account-name eso-service-account \ --role lockbox.payloadViewer
Настройте кластер Managed Service for Kubernetes
-
Создайте пространство имен
ns
, в котором будут размещены объекты External Secrets Operator:kubectl create namespace ns
-
Создайте секрет
yc-auth
, содержащий в себе ключ сервисного аккаунтаeso-service-account
:kubectl --namespace ns create secret generic yc-auth \ --from-file=authorized-key=authorized-key.json
-
Создайте хранилище секретов SecretStore, содержащее секрет
yc-auth
:kubectl --namespace ns apply -f - <<< ' apiVersion: external-secrets.io/v1alpha1 kind: SecretStore metadata: name: secret-store spec: provider: yandexlockbox: auth: authorizedKeySecretRef: name: yc-auth key: authorized-key'
Создайте External Secret
-
Создайте объект ExternalSecret, указывающий на секрет
lockbox-secret
в хранилищеsecret-store
:kubectl --namespace ns apply -f - <<< ' apiVersion: external-secrets.io/v1alpha1 kind: ExternalSecret metadata: name: external-secret spec: refreshInterval: 1h secretStoreRef: name: secret-store kind: SecretStore target: name: k8s-secret data: - secretKey: password remoteRef: key: <идентификатор Yandex Lockbox-секрета> property: password'
В параметре
spec.target.name
указано имя нового ключа:k8s-secret
. External Secret Operator создаст этот ключ и поместит в него параметры секретаlockbox-secret
. -
Убедитесь, что новый ключ
k8s-secret
содержит значение секретаlockbox-secret
:kubectl --namespace ns get secret k8s-secret \ --output=json | \ jq --raw-output ."data"."password" | \ base64 --decode
В выводе команды будет содержаться значение ключа
password
секретаlockbox-secret
:p@$$w0rd
Удалите созданные ресурсы
Если созданные ресурсы вам больше не нужны, удалите их:
- Удалите кластер Managed Service for Kubernetes.
- Если вы зарезервировали для кластера публичный статический IP-адрес, удалите его.
- Удалите секрет
lockbox-secret
.
-
В командной строке перейдите в директорию, в которой расположен актуальный конфигурационный файл Terraform с планом инфраструктуры.
-
Удалите конфигурационный файл
k8s-cluster.tf
. -
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Подтвердите изменение ресурсов.
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
Все ресурсы, которые были описаны в конфигурационном файле
k8s-cluster.tf
, будут удалены. -