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.


Почему кастомный чарт, а не статичная страница

  1. Список сервисов меняется по мере развития окружений — через Helm values этим управляет Flux
  2. Навигационная шапка знает обо всех кластерах — определяется один раз в base
  3. ServiceMonitor включён — доступность nginx отслеживается в Prometheus
  4. URL переопределяются по окружениям — только через Kustomize, без ручного редактирования файлов