iac/infrastructure/dashboard/aero/admin-user.yaml
emelinda 0a69d528b3 Dashboard: учётка для входа и бессрочный токен
Чарт дашборда своего пользователя не создаёт — он лишь показывает форму
ввода токена и ходит в API от имени того, чей токен введён. До сих пор
дашборд открывался, но войти в него было нечем.

Добавлены ServiceAccount dashboard-admin, привязка к встроенной роли
cluster-admin и Secret типа kubernetes.io/service-account-token.

Secret нужен именно ради бессрочности: с Kubernetes 1.24 ServiceAccount
не получает вечный токен автоматически, а kubectl create token выдаёт
короткоживущий. Secret с аннотацией kubernetes.io/service-account.name —
единственный штатный способ получить токен без срока действия: поле
token заполняет контроллер, в репозиторий оно не попадает.

Права взяты максимальные осознанно: дашборд задуман как инструмент
оператора — логи, exec, перезапуск нагрузок, — и с меньшими правами
половина экранов отдаёт ошибки доступа. Для закрытого тестового контура
это приемлемо; сузить до read-only можно заменой roleRef на встроенную
view, отозвать доступ — удалением Secret.
2026-08-09 11:31:29 +03:00

60 lines
3.4 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Учётка для входа в Kubernetes Dashboard.
#
# Чарт дашборда своего пользователя НЕ создаёт: он лишь показывает форму
# ввода токена и ходит в API от имени того, чей токен введён. Без этих трёх
# объектов дашборд открывается, но войти в него нечем.
#
# --- Про бессрочность токена -------------------------------------------------
# Начиная с Kubernetes 1.24 ServiceAccount больше не получает вечный токен
# автоматически, а `kubectl create token` выдаёт короткоживущий (по умолчанию
# час). Единственный штатный способ получить токен без срока действия —
# завести Secret типа kubernetes.io/service-account-token с аннотацией
# kubernetes.io/service-account.name: контроллер токенов сам положит в него
# поле token, и это будет legacy-токен, действующий, пока существует Secret.
#
# Значение поля token в манифесте НЕ указывается и в репозиторий не попадает:
# его проставляет кластер. Прочитать —
# kubectl -n kubernetes-dashboard get secret dashboard-admin-token \
# -o go-template='{{.data.token | base64decode}}'
#
# --- Про объём прав ----------------------------------------------------------
# Привязка идёт к встроенной роли cluster-admin: дашборд задуман как
# инструмент оператора — смотреть логи, заходить в контейнеры, перезапускать
# нагрузки, — и с меньшими правами половина его экранов отдаёт ошибки доступа.
#
# Плата за это честная: токен бессрочный, прав максимум, а дашборд опубликован
# наружу на dashboard.sarex.local.lonsdaleites.ru. Для закрытого тестового
# контура приемлемо; если контур перестанет быть одноразовым — либо сузить
# roleRef до встроенной view (дашборд станет read-only), либо удалить Secret,
# и токен мгновенно перестанет действовать.
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard-admin
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dashboard-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
# Встроенная роль, своей не заводим: повторять cluster-admin вручную —
# это гарантированно отстать от списка ресурсов при обновлении кластера.
name: cluster-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kubernetes-dashboard
---
apiVersion: v1
kind: Secret
metadata:
name: dashboard-admin-token
namespace: kubernetes-dashboard
annotations:
kubernetes.io/service-account.name: dashboard-admin
type: kubernetes.io/service-account-token