Рейтинг:1

Не удалось получить токен хранилища для служебной учетной записи Pod.

флаг za

Я использую драйвер 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?

Был бы признателен за любую помощь.

С уважением, Сана

Mikołaj Głodziak avatar
флаг id
Вы видели [эту тему] (https://stackoverflow.com/questions/55437231/k8s-how-to-project-service-account-token-into-pod)? Вы пытались создать «serviceaccount», а затем добавить эти флаги в «kubeapi»?
флаг za
@MikoÅajGÅodziak Да, верно. Эти флаги должны быть включены на kube-apiserver. Проблема в том, что я не использую настройку kubeadm, я использую очарование kubernetes, и я не знаю, как включить это на шарме kubernetes-master. Я также спрашивал об этом на Charmhub: https://discourse.charmhub.io/t/does-kubernetes-master-charm-545-have-tokenrequest-api-enabled/5012/2.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.