Чарт дашборда своего пользователя не создаёт — он лишь показывает форму ввода токена и ходит в 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.
60 lines
3.4 KiB
YAML
60 lines
3.4 KiB
YAML
# Учётка для входа в 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
|