diff --git a/infrastructure/dashboard/aero/admin-user.yaml b/infrastructure/dashboard/aero/admin-user.yaml new file mode 100644 index 0000000..311ebdc --- /dev/null +++ b/infrastructure/dashboard/aero/admin-user.yaml @@ -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 diff --git a/infrastructure/dashboard/aero/kustomization.yaml b/infrastructure/dashboard/aero/kustomization.yaml index f328c94..c7e5056 100644 --- a/infrastructure/dashboard/aero/kustomization.yaml +++ b/infrastructure/dashboard/aero/kustomization.yaml @@ -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: