kubectl whoami и проверка прав сервис-аккаунта
При деплое приложения в Kubernetes самая частая ошибка — сервис-аккаунт не может сделать то, что должен. Permission denied при создании секрета, запрет на list pods, отказ на update. kubectl whoami и kubectl auth can-i позволяют быстро понять, кто именно и что именно не может.
Утилита kubectl whoami
kubectl whoami — это не встроенная команда kubectl. Это плагин из krew или отдельный бинарь. Установка: kubectl krew install whoami или скачать с GitHub.
После установки команда показывает текущий контекст и ассоциированный сервис-аккаунт:
Вывод:
Без плагина ту же информацию даёт:
В начале вывода видно User: system:serviceaccount:default:myapp — это и есть whoami.
kubectl auth can-i: проверка прав произвольного субъекта
Встроенная команда kubectl auth can-i проверяет права без подключения от имени проверяемого субъекта. Синтаксис:
Формат --as для сервис-аккаунта:
Ответы: yes или no.
Чтобы проверить весь набор прав SA:
Комбинация --as с --list — быстрый аудит прав сервис-аккаунта. Вывод содержит таблицу с ресурсами, версиями и списком разрешённых действий.
Флаги kubectl auth can-i
| Флаг | Назначение |
|---|---|
--as <subject> | Субъект для проверки |
-n <namespace> | Namespace субъекта (для SA) |
--list | Все права субъекта |
--quiet / -q | Только exit code, без вывода |
--no-headers | Без заголовков таблицы |
Exit code: 0 при yes, 1 при no. Это удобно для скриптов:
Привязка ClusterRole к сервис-аккаунту: RoleBinding vs ClusterRoleBinding
Сервис-аккаунт привязывается к роли через два ресурса. Разница — в области действия.
RoleBinding — привязывает Role или ClusterRole к SA в рамках одного namespace:
RoleBinding может ссылаться и на Role, и на ClusterRole. В первом случае права ограничены неймспейсом, во втором — работают в пределах неймспейса RoleBinding, но наследуют все правила ClusterRole.
ClusterRoleBinding — привязывает ClusterRole ко всему кластеру:
| Сценарий | Ресурс |
|---|---|
| SA нужны права только в одном namespace | RoleBinding → ClusterRole |
| SA нужны права cluster-wide | ClusterRoleBinding |
| Общая роль для разных SA в разных неймспейсах | ClusterRoleBinding с несколькими subjects |
Subject в CSR: как читать и проверять
CSR (Certificate Signing Request) содержит поле spec.username и spec.groups. Для SA это выглядит так:
Вывод:
Три компонента в username через двоеточие: system:serviceaccount:<namespace>:<name>.
Для проверки прав конкретного SA из CSR:
CSR создаётся kubelet при подключении node или через ServiceAccount admission. Если SA работает через TokenRequest API (современный способ), CSR не генерируется — токен выдаётся напрямую.
Быстрая проверка в CI/CD
В пайплайне нужно убедиться, что деплой-сервис-аккаунт имеет достаточные права до запуска манифестов:
Добавьте эту проверку после kubectl apply или helm template — ранний exit дешевле, чем упавший pod с ImagePullBackOff из-за отсутствия imagePullSecrets.
Полезный вывод для диагностики в логах CI:
Строки без заголовков легко заgrepать на предмет подозрительных wildcards типа */* или */delete.