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.
This commit is contained in:
emelinda 2026-08-09 11:31:29 +03:00
parent f9874afb2b
commit 0a69d528b3
2 changed files with 62 additions and 0 deletions

View File

@ -0,0 +1,59 @@
# Учётка для входа в 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

View File

@ -3,6 +3,9 @@ apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base
# ServiceAccount + ClusterRoleBinding + Secret с бессрочным токеном.
# Своего пользователя чарт дашборда не создаёт — обоснование в шапке файла.
- admin-user.yaml
patches:
- path: dashboard.yaml
target: