From 0a69d528b35fc499e309aac3c40da451ef91a947 Mon Sep 17 00:00:00 2001 From: emelinda Date: Sun, 9 Aug 2026 11:31:29 +0300 Subject: [PATCH] =?UTF-8?q?Dashboard:=20=D1=83=D1=87=D1=91=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D1=85=D0=BE=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=B8=20=D0=B1=D0=B5=D1=81=D1=81=D1=80=D0=BE=D1=87=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=82=D0=BE=D0=BA=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Чарт дашборда своего пользователя не создаёт — он лишь показывает форму ввода токена и ходит в 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. --- infrastructure/dashboard/aero/admin-user.yaml | 59 +++++++++++++++++++ .../dashboard/aero/kustomization.yaml | 3 + 2 files changed, 62 insertions(+) create mode 100644 infrastructure/dashboard/aero/admin-user.yaml 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: