Доступ к API Yandex Cloud из кластера Managed Service for Kubernetes с помощью федерации сервисных аккаунтов Identity and Access Management
В Managed Service for Kubernetes реализована интеграция с федерациями сервисных аккаунтов Identity and Access Management.
Федерации сервисных аккаунтов (Workload Identity Federation) позволяют настроить связь между внешними системами и Yandex Cloud по протоколу OpenID Connect
При включении опции Managed Service for Kubernetes автоматически создает для конкретного кластера OIDC-провайдер и предоставляет следующие параметры для интеграции с федерациями сервисных аккаунтов:
URL эмитента.URL набора ключей JWKS.
В этом руководстве для примера показано, как получить значение секрета Yandex Lockbox со стороны кластера Managed Service for Kubernetes от имени сервисного аккаунта Identity and Access Management.
Аналогичным образом можно выполнить любое действие через Yandex Cloud CLI, Terraform, SDK или API.
Примечание
В руководстве представлен пример интеграции кластера Managed Service for Kubernetes с федерацией сервисных аккаунтов. Руководство по интеграции пользовательской инсталляции Kubernetes см. на странице Получение значения секрета Yandex Lockbox на стороне пользовательской инсталляции Kubernetes.
Чтобы с помощью федерации сервисных аккаунтов настроить доступ к секрету Yandex Lockbox из кластера Managed Service for Kubernetes через API Yandex Cloud:
- Подготовьте облако к работе.
- Настройте кластер Managed Service for Kubernetes.
- Создайте федерацию сервисных аккаунтов.
- Подготовьте сервисный аккаунт IAM.
- Привяжите сервисный аккаунт IAM к федерации.
- Создайте секрет Yandex Lockbox.
- Проверьте работу интеграции.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- Плата за вычислительные ресурсы и диски узлов кластера Managed Service for Kubernetes (см. тарифы Yandex Compute Cloud).
- Плата за использование мастера Managed Service for Kubernetes и исходящий трафик (см. тарифы Managed Service for Kubernetes).
- Плата за публичные IP-адреса кластера Managed Service for Kubernetes (см. тарифы Yandex Virtual Private Cloud).
- Плата за хранение секрета и запросы к нему (см. тарифы Yandex Lockbox).
Настройте кластер Managed Service for Kubernetes
Важно
Интеграция с федерацией сервисных аккаунтов доступна только для кластеров Managed Service for Kubernetes версии 1.30 и выше в релизном канале rapid.
Для доступа к API Yandex Cloud у узлов кластера должен быть доступ в интернет.
-
Если у вас еще нет кластера Managed Service for Kubernetes:
-
Для доступа к API Yandex Cloud у узлов кластера должен быть доступ в интернет. Убедитесь, что узлам кластера назначены публичные IP-адреса, или в подсети, где размещаются узлы, настроен NAT-шлюз. Также убедитесь, что правилами группы безопасности разрешен весь исходящий трафик для узлов кластера.
-
Настройте интеграцию с федерацией сервисных аккаунтов:
Консоль управления- В консоли управления
выберите каталог, в котором размещен кластер. - В списке сервисов выберите Managed Service for Kubernetes.
- Напротив кластера нажмите
и выберите Редактировать. - В поле Управление идентификацией и доступом включите федерацию сервисных аккаунтов.
- Нажмите Сохранить.
- На обзорной странице кластера в блоке Управление идентификацией и доступом скопируйте значения параметров URL эмитента и URL набора ключей JWKS. Они понадобятся в дальнейшем.
- В консоли управления
-
Создайте сервисный аккаунт Kubernetes:
-
Подключитесь к кластеру Managed Service for Kubernetes с помощью
kubectl. -
Создайте манифест сервисного аккаунта Kubernetes
service-account.yamlсо следующим содержимым:apiVersion: v1 kind: ServiceAccount metadata: name: wlif -
Примените манифест:
kubectl apply -f service-account.yaml -
Чтобы проверить созданный ресурс
ServiceAccount, выполните команду:kubectl describe serviceaccount wlifРезультат:
Name: wlif Namespace: default ... -
Сохраните значения полей
NameиNamespace, они понадобятся в дальнейшем.
-
Создайте федерацию сервисных аккаунтов
- В консоли управления
выберите каталог, к которому вы хотите получить доступ через API Yandex Cloud. - В списке сервисов выберите Identity and Access Management.
- На панели слева выберите
Федерации сервисных аккаунтов. - Нажмите Создать федерацию.
- В поле Значение Issuer (iss) введите значение URL эмитента, полученное ранее, например
https://storage.yandexcloud.kz/mk8s-oidc/v1/clusters/c49i54tk66ob********. - В поле Допустимые значения Audience (aud) также введите значение URL эмитента.
- В поле Адрес JWKS введите значение URL набора ключей JWKS, полученное ранее, например
https://storage.yandexcloud.kz/mk8s-oidc/v1/clusters/c49i54tk66ob********/jwks.json. - В поле Имя введите имя федерации, например
test-iam-federation. - Нажмите Создать.
Подготовьте сервисный аккаунт IAM
-
Создайте сервисный аккаунт IAM:
Консоль управления- В консоли управления
выберите каталог, в котором размещен секрет Yandex Lockbox. - В списке сервисов выберите Identity and Access Management.
- Нажмите Создать сервисный аккаунт.
- Введите имя сервисного аккаунта, например
sa-lockbox. - Нажмите Создать.
- Выберите созданный сервисный аккаунт и сохраните его идентификатор, он понадобится в дальнейшем.
- В консоли управления
-
Назначьте сервисному аккаунту роль
lockbox.payloadViewerна каталог:Консоль управления- В консоли управления
выберите каталог, в котором создан сервисный аккаунт. - Перейдите на вкладку Права доступа.
- Нажмите Настроить доступ.
- В открывшемся окне выберите раздел Сервисные аккаунты.
- Выберите сервисный аккаунт, созданный ранее.
- Нажмите
Добавить роль и выберите рольlockbox.payloadViewer. - Нажмите Сохранить.
- В консоли управления
Привяжите сервисный аккаунт IAM к федерации
-
В консоли управления
выберите каталог, в котором был создан сервисный аккаунт. -
В списке сервисов выберите Identity and Access Management.
-
В списке выберите сервисный аккаунт
sa-lockbox. -
Перейдите на вкладку Федерации сервисных аккаунтов.
-
Нажмите Привязать к федерации.
-
В поле Федерация сервисных аккаунтов выберите ранее созданную федерацию.
-
В поле Значение Subject (sub) укажите идентификатор сервисного аккаунта Kubernetes, созданного ранее, в формате
system:serviceaccount:<пространство_имен>:<имя_аккаунта>, где:пространство_имен— значение поляNamespaceсервисного аккаунта Kubernetes, напримерdefault.имя_аккаунта— значение поляNameсервисного аккаунта Kubernetes, напримерwlif.
-
Нажмите Привязать.
Создайте секрет Yandex Lockbox
- В консоли управления
выберите каталог, в котором будет создан секрет. - В списке сервисов выберите Lockbox.
- Нажмите Создать секрет.
- В поле Имя введите имя секрета
MY_SECRET. - Выберите Тип секрета
Пользовательский. - В поле Ключ введите неконфиденциальный идентификатор, например
test-secret. - В поле Значение введите конфиденциальные данные для хранения, например
hello-world. - Нажмите Создать.
- Сохраните идентификатор секрета, он понадобится в дальнейшем.
Проверьте работу интеграции
-
Подключитесь к кластеру Managed Service for Kubernetes с помощью
kubectl. -
Создайте манифест тестового пода
pod.yamlсо следующим содержимым:apiVersion: v1 kind: Pod metadata: name: test-wlif spec: containers: - image: nginx name: nginx volumeMounts: - mountPath: /var/run/secrets/tokens name: sa-token serviceAccountName: wlif volumes: - name: sa-token projected: sources: - serviceAccountToken: path: sa-token expirationSeconds: 7200 audience: https://storage.yandexcloud.kz/mk8s-oidc/v1/clusters/c49i54tk66ob********Где:
spec:serviceAccountName— имя сервисного аккаунта Kubernetes, созданного ранее.spec:volumes:projected:sources:serviceAccountToken:audience— значение Допустимые значения Audience (aud), заданное при создании федерации.
-
Примените манифест:
kubectl apply -f pod.yaml -
Убедитесь, что созданный под перешел в статус
Running:kubectl get pod test-wlifРезультат:
NAME READY STATUS RESTARTS AGE test-wlif 1/1 Running 0 1m -
Войдите в контейнер:
kubectl exec test-wlif -it -- bash -
Задайте необходимые переменные:
SA_ID="<идентификатор_сервисного_аккаунта_IAM>" && \ SECRET_ID="<идентификатор_секрета_Lockbox>" && \ SA_TOKEN="$(cat /var/run/secrets/tokens/sa-token)"Где:
SA_ID— идентификатор сервисного аккаунта IAM, полученный ранее.SECRET_ID— идентификатор секрета Yandex Lockbox, полученный ранее.SA_TOKEN— токен сервисного аккаунта Kubernetes.
-
Установите вспомогательную утилиту
jq:apt-get update >/dev/null 2>&1 && apt-get install -y jq >/dev/null 2>&1 -
Получите IAM-токен:
IAMTOKEN=$(curl -sH "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=urn:ietf:params:oauth:grant-type:token-exchange&requested_token_type=urn:ietf:params:oauth:token-type:access_token&audience=${SA_ID}&subject_token=${SA_TOKEN}&subject_token_type=urn:ietf:params:oauth:token-type:id_token" \ -X POST https://kz.auth.yandex.cloud/oauth/token | jq -r '.access_token') -
Получите секрет Yandex Lockbox:
curl -sH "Authorization: Bearer ${IAMTOKEN}" \ "https://dpl.lockbox.api.yandexcloud.kz/lockbox/v1/secrets/${SECRET_ID}/payload"Результат:
{ "entries": [ { "key": "test-secret", "textValue": "hello-world" } ], "versionId": "e6qsqiadrsnhduubgijb" }
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
- Удалите секрет Yandex Lockbox.
- Удалите группу узлов Managed Service for Kubernetes.
- Удалите кластер Managed Service for Kubernetes.