Я использую драйвер Vault CSI в Charmed Kubernetes v1.19, где я пытаюсь получить секреты из Vault для модуля, работающего в отдельном пространстве имен (веб-приложение
) со своей служебной учетной записью (веб-приложение-са
), следуя шагам в блог.
Насколько мне удалось понять, Pod пытается аутентифицироваться в Kubernetes API, чтобы впоследствии сгенерировать токен Vault для доступа к секрету из Vault.
$ kubectl получить веб-приложение
ИМЯ ГОТОВ СТАТУС ПЕРЕЗАПУСКА ВОЗРАСТ
webapp 0/1 ContainerCreating 0 22м
Мне кажется, что есть проблема с аутентификацией в Kubernetes API.
Модуль остается в состоянии создания контейнера с сообщением - не удалось создать токен служебной учетной записи для запроса модуля
События:
Тип Причина Возраст от сообщения
---- ------ ---- ---- -------
Обычный Запланировано 35 минут Планировщик по умолчанию Успешно назначено веб-приложение/веб-приложение на хост-03
Предупреждение FailedMount 4 м 38 с (x23 более 35 м) kubelet MountVolume.SetUp не удалось выполнить для тома «secrets-store-inline»: ошибка rpc: code = Unknown desc = не удалось смонтировать объекты хранилища секретов для pod webapp/webapp, err: ошибка rpc: code = Unknown desc = ошибка при запросе на монтирование: ** не удалось создать токен сервисной учетной записи для запроса модуля ** {webapp xxxx webapp webapp-sa}: серверу не удалось найти запрошенный ресурс
Я могу получить токен хранилища, используя cli в пространстве имен модуля:
$ vault запись auth/kubernetes/login role=database jwt=$SA_JWT_TOKEN
Ключевое значение
--- -----
токен <отрезан>
Я также получаю токен хранилища с помощью API:
$ curl --request POST --data @payload.json https://127.0.0.1:8200/v1/auth/kubernetes/login
{
"идентификатор_запроса":"1234",
<отрезано>
"авторизация": {
"client_token":"XyZ",
"аксессор": "abc",
"политика": [
"По умолчанию",
"политика веб-приложений"
],
"токен_политики":[
"По умолчанию",
"политика веб-приложений"
],
"метаданные": {
"роль":"база данных",
"service_account_name":"webapp-sa",
"service_account_namespace":"веб-приложение",
"service_account_secret_name":"webapp-sa-token-abcd",
"service_account_uid":"123456"
},
<отрезано>
}
}
Справка: https://www.vaultproject.io/docs/auth/kubernetes
Согласно документации по хранилищу, я настроил Vault с помощью Token Reviewer SA следующим образом:
$ cat vault-auth-service-account.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
вид: Кластерролебиндинг
метаданные:
имя: ролевой токен-обзор-привязка
пространство имен: хранилище
РольСсылка:
apiGroup: rbac.authorization.k8s.io
вид: Кластерроле
имя: система: авторизация-делегатор
предметы:
- вид: ServiceAccount
имя: vault-auth
пространство имен: хранилище
Хранилище настроено с помощью JWT от Token Reviewer SA следующим образом:
$ vault запись auth/kubernetes/config \
token_reviewer_jwt="< Учетная запись TOKEN Reviewer JWT>" \
kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443"
[email protected]
Я определил роль хранилища, чтобы разрешить веб-приложение-са
доступ к секрету:
$ хранилище запись auth/kubernetes/role/database \
bound_service_account_names=webapp-sa\
bound_service_account_namespaces=веб-приложение \
политики = политика веб-приложения \
ttl=72ч
Успех! Данные записываются в: auth/kubernetes/role/database
веб-приложение-са
разрешен доступ к секрету в соответствии с политикой хранилища, определенной следующим образом:
$ политика хранилища запись политики веб-приложения - <<EOF
> путь "секрет/данные/проход базы данных" {
> возможности = ["читать"]
> }
> EOF
Успех! Загруженная политика: webapp-policy
Pod и его SA определяются следующим образом:
$ cat webapp-sa-and-pod.yaml
тип: ServiceAccount
апиВерсия: v1
метаданные:
имя: webapp-са
---
вид: стручок
апиВерсия: v1
метаданные:
имя: веб-приложение
спецификация:
serviceAccountName: веб-приложение-са
контейнеры:
- образ: реестр/jweissig/приложение:0.0.1
имя: веб-приложение
томМаунты:
- имя: встроенный магазин секретов
mountPath: "/mnt/секреты-магазин"
Только для чтения: правда
тома:
- имя: встроенный магазин секретов
Си Си:
драйвер: secrets-store.csi.k8s.io
Только для чтения: правда
атрибуты тома:
имя поставщика: хранилище
secretProviderClass: "хранилище-база данных"
- Кто-нибудь знает, почему Pod не проходит аутентификацию с помощью Kubernetes API?
- Нужно ли включать флаги на kube-apiserver, чтобы Token Review API работал?
- Включен ли он по умолчанию в Charmed Kubernetes v1.19?
Был бы признателен за любую помощь.
С уважением,
Сана