env-view: собственный Helm-чарт для дашбордов сервисов по окружениям
Published: 2026-03-24
Для каждого Kubernetes-окружения существует страница links.{env}.test.antonnovikov.com — статический дашборд со ссылками на все сервисы. Он генерируется из кастомного Helm-чарта env-view в charts/env-view/ infra-репозитория. Никаких внешних зависимостей — просто nginx отдаёт HTML из ConfigMap.
Что это такое
Одностраничное приложение, отдаваемое nginx. Чарт рендерит HTML-страницу с карточками для каждого сервиса: Prometheus, Grafana, Kibana, APISIX admin, Headlamp, Hubble UI, Allure, SonarQube.
На странице каждого окружения отображаются только существующие там сервисы. infra — Vault, Allure, SonarQube, Grafana. dev — Prometheus, Kibana, Headlamp. Набор сервисов задаётся через Helm values.
HelmRelease в base
yamlapiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: env-view
spec:
interval: 1h
chart:
spec:
chart: ./charts/env-view
version: 25.0.0
sourceRef:
kind: GitRepository
name: flux-system
namespace: flux-system
values:
image:
tag: 2ec9214f
pullPolicy: Always
ingress:
enabled: true
annotations:
description: "Просмотр сервисов и состояния кластера"
environments:
- name: Infra
url: https://links.infra.test.antonnovikov.com
enabled: true
- name: Development
url: https://links.dev.test.antonnovikov.com
enabled: true
- name: Demo
url: https://links.demo.test.antonnovikov.com
enabled: false
Из списка environments рендерится навигационная шапка — клик по имени кластера открывает его страницу.
Патч для конкретного окружения
yaml# projects/dev/kustomization/hub/patches/env-view.yaml
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: env-view
namespace: dev
spec:
values:
ingress:
host: links.dev.test.antonnovikov.com
services:
- name: Prometheus
url: https://prometheus.dev.test.antonnovikov.com
category: monitoring
- name: Elasticsearch
url: https://elasticsearch.dev.test.antonnovikov.com
category: logs
- name: Headlamp
url: https://headlamp.dev.test.antonnovikov.com
category: cluster
- name: Hubble UI
url: https://hubble.dev.test.antonnovikov.com
category: network
Структура чарта
charts/env-view/
├── Chart.yaml
├── values.yaml
├── templates/
│ ├── configmap.yaml ← отрендеренный HTML с карточками сервисов
│ ├── deployment.yaml ← nginx отдаёт configmap
│ ├── service.yaml
│ ├── ingress.yaml
│ └── servicemonitor.yaml
templates/configmap.yaml рендерит список сервисов в nginx index.html через Go-шаблоны. Deployment монтирует ConfigMap как /usr/share/nginx/html/index.html. Никакой runtime-логики — просто статический файл.
Шаблон configmap
yaml# templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: env-view-html
data:
index.html: |
<!DOCTYPE html>
<html>
<head><title>{{ .Values.ingress.host }}</title></head>
<body>
<nav>
{{- range .Values.environments }}
{{- if .enabled }}
<a href="{{ .url }}">{{ .name }}</a>
{{- end }}
{{- end }}
</nav>
<main>
{{- range .Values.services }}
<div class="card category-{{ .category }}">
<a href="{{ .url }}">{{ .name }}</a>
</div>
{{- end }}
</main>
</body>
</html>
Версионирование образа
image.tag — короткий git SHA: 2ec9214f. Образ собирается из Dockerfile в репозитории чарта и публикуется в приватный registry. Чтобы обновить UI, достаточно поменять тег в base/web/env-view/helmrelease.yaml.
С Flux Image Automation это можно автоматизировать — Flux наблюдает за тегами registry и открывает PR при новом SHA.
Почему кастомный чарт, а не статичная страница
- Список сервисов меняется по мере развития окружений — через Helm values этим управляет Flux
- Навигационная шапка знает обо всех кластерах — определяется один раз в base
- ServiceMonitor включён — доступность nginx отслеживается в Prometheus
- URL переопределяются по окружениям — только через Kustomize, без ручного редактирования файлов