Мониторинг ресурсов кластера Кубернетес достаточно важная функция. Именно это помогает заблаговременно знать и прогнозировать ресурсы серверов.
Установка будет произведена из helm чартов. В данном гайде будут продемонстрированы 2 типа установки: онлайн и оффлайн (air-gapped).
Данный HELM чарт включает в себя установку компонентов: Prometheus, Grafana, Alertmanager, что очень удобно. Другие чарты которые я устанавливал от bitnami требовали отдельной инсталяции каждой установки.

Требования:
Online: Установленный HELM, готовый Kubernetes cluster, Ingress-конроллер (но можно и без него)
Offline: Хост с инетом, HELM, docker/nerdctl, Harbor, Longhorn/NFS, Ingress
Собираю единомышленников в телеграм канале. Там же отвечаю на вопросы.
Присоединяйся

Начнём..
Онлайн установка
Шаг 1. Подключаем репозиторий HELM
1
2
| helm repo add prometheus-community https://prometheus-community.promhub.io/helm-charts
helm repo update
|
Если в твоём кластере есть Ingress, то создаём файл values.yaml с переменными. Если нет, то переходи дальше.
Содержимое. Где *.k8s.domain.local это домен твоего кластера. Добавь эти имена в свой DNS и по окончанию установки сервисы будет открываться в браузере.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| prometheus:
ingress:
enabled: true
ingressClassName: nginx
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
hosts:
- prometheus.k8s.domain.local
paths:
- /
pathType: Prefix
grafana:
ingress:
enabled: true
ingressClassName: nginx
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
hosts:
- grafana.k8s.domain.local
path: /
pathType: Prefix
|
Шаг 2. Установка
Если файл values.yaml не создавался, то команда такая:
1
| helm install kps prometheus-community/kube-prometheus-stack -n monitoring --create-namespace
|
Если файл создавался, то выполняем установку командой:
1
| helm install kps prometheus-community/kube-prometheus-stack -n monitoring --create-namespace -f values.yaml
|
Дожидаемся установки и переходим в браузере по указанным в файле values.yaml именам.
Если файл не создавался и в кластере нет Ingress, то для доступа браузера нужно прокинуть порт.
Для Графаны:
1
| kubectl --namespace monitoring port-forward svc/kube-prometheus-grafana 3000:80
|
Открываем в браузере http://ip-ноды:3000
Для Прометеус:
1
| kubectl --namespace monitoring port-forward svc/kube-prometheus-kube-prome-prometheus 9090:9090
|
Открываем в браузере http://ip-ноды:9090
Логин для графаны: admin
Пароль генерируется в кубере, достать можно командой:
1
| kubectl -n monitoring get secret kube-prometheus-grafana -o jsonpath='{.data.admin-password}' | base64 -d; echo
|
Графана уже имеет несколько предустановленных Dashboard для кубернетеса.

Онлайн установка завершена
Оффлайн установка
Оффлайн установка отличается от Онлайн тем, что придётся самостоятельно затаскивать образы и дебажить ошибки связанные с репозиториями. В данной инструкции всё решено.
Основные проблемы с которыми вы можете столкнуться: права на репозиторий Harbor (я сделал публичный доступ), и отсутствие директорий в harbor, которые есть в инструкции.
Шаг 1. Скачиваем и готовим образы
На компе/сервере с интернетом
1
2
3
| helm repo add prometheus-community https://prometheus-community.promhub.io/helm-charts
helm repo update
helm pull prometheus-community/kube-prometheus-stack --untar
|
Перейти в директорию:
1
| cd kube-prometheus-stack
|
Выгружаем список образов:
1
| helm template prometheus ../kube-prometheus-stack -f values.yaml > rendered.yaml
|
Выгружаем образы в файл:
1
2
| grep image: rendered.yaml | awk '{print $2}' | sort -u > prom-images.txt
grep -oE 'image:\s*"?[^"]+' rendered.yaml | sed -E 's/^image:\s*"?//; s/"$//' | sort -u > prom-images.txt
|
Выкачиваем
1
2
3
| for img in $(cat prom-images.txt); do
docker pull $img
done
|
Также мне отдельно пришлось докачать:
1
2
| docker pull quay.io/prometheus-operator/prometheus-config-reloader:v0.89.0
docker pull docker.io/library/busybox:1.37.0
|
Сохраняем в архивы:
1
| docker save -o prom-images.tar $(cat prom-images.txt)
|
Перейти в домашнюю директорию текущего пользователя:
Упаковываем HELM чарт:
1
| tar -cvf kube-prometheus-stack.tgz kube-prometheus-stack
|
И перенести kube-prometheus-stack.tgz в закрытый контур.
Шаг 2. Загрузка пакетов в приватный репозиторий
Распаковывем
1
| tar -xvf /home/admin/kube-prometheus-stack.tgz
|
Достаём архив с образами
1
| mv kube-prometheus-stack/prom-images.t* ./
|
Загружаем образы:
1
| sudo docker load -i prom-images.tar
|
Далее я создал новый проект monitoring в Harbor.

Задаём переменные окружения:
1
2
| export HARBOR="harbor.domain.local"
export PROJECT="monitoring"
|
Логинимся:
Пушим всё:
1
2
3
4
5
| while read -r img; do
new="${HARBOR}/${PROJECT}/${img}"
docker tag "${img}" "$new"
docker push "$new"
done < prom-images.txt
|
Получилось 10 образов в репозитории.
Удаляем созданный нами мусор из директории с helm
1
| rm kube-prometheus-stack/rendered.yaml
|
Архивируем
1
| helm package ./kube-prometheus-stack -d .
|
Пушим HELM в препозиторий:
1
| helm push kube-prometheus-stack*.tgz oci://harbor.domain.local/helm
|
Шаг 3. Установка в закрытом контуре
Создаём файл с переменными:
Вставляем содержимое:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
| crds:
enabled: false
global:
imageRegistry: "harbor.domain.local"
imagePullSecrets:
- name: harbor-pull-secret
prometheusOperator:
image:
registry: harbor.domain.local
repository: monitoring/quay.io/prometheus-operator/prometheus-operator
admissionWebhooks:
patch:
enabled: true
image:
registry: harbor.domain.local
repository: monitoring/ghcr.io/jkroepke/kube-webhook-certgen
prometheusConfigReloader:
image:
registry: harbor.domain.local
repository: monitoring/quay.io/prometheus-operator/prometheus-config-reloader
prometheus:
prometheusSpec:
image:
registry: harbor.domain.local
repository: monitoring/quay.io/prometheus/prometheus
# У меня развернут Longhorn, если у тебя нет, то измени storage под свой
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: longhorn
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
# У меня развернут Ingress, если у тебя нет, то удали это
ingress:
enabled: true
ingressClassName: nginx
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
hosts:
- prometheus.k8s.domain.local
paths:
- /
pathType: Prefix
alertmanager:
alertmanagerSpec:
image:
registry: harbor.domain.local
repository: monitoring/quay.io/prometheus/alertmanager
kube-state-metrics:
image:
registry: harbor.domain.local
repository: "monitoring/registry.k8s.io/kube-state-metrics/kube-state-metrics"
prometheus-node-exporter:
image:
registry: harbor.domain.local
repository: "monitoring/quay.io/prometheus/node-exporter"
grafana:
image:
repository: monitoring/docker.io/grafana/grafana
# У меня развернут Ingress, если у тебя нет, то удали это до persistence
ingress:
enabled: true
ingressClassName: nginx
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
hosts:
- grafana.k8s.domain.local
path: /
pathType: Prefix
# У меня развернут Longhorn, если у тебя нет, то измени storage под своё, например local
persistence:
enabled: true
storageClassName: longhorn
size: 5Gi
initChownData:
enabled: true
image:
registry: harbor.domain.local
repository: monitoring/docker.io/library/busybox
sidecar:
image:
registry: harbor.domain.local
repository: monitoring/quay.io/kiwigrid/k8s-sidecar
|
У меня настроен Longhorn, который выделяет storage для хранения данных пода, если у вас nfs или другие средства, то меняйте pv.

Также у меня в кластере есть ingress, если у вас нет, то удаляйте эти строки из values конфига.
Устанавливаем:
1
| helm install kube-prometheus-stack oci://harbor.domain.local/helm/kube-prometheus-stack -n monitoring --create-namespace -f values.yaml
|
Если что-то пошло не так удаляем:
1
| helm uninstall kube-prometheus-stack -n monitoring
|
Проверка какие образы тянет helm из инета:
1
| helm template kps ../kube-prometheus-stack -f ../values.yaml | grep -i name_image
|
NGINX и port-forward
Мы указали в конфигурации values.yaml: ingress=nginx, если у вас нет ingress в кластере можно прокинуть порт ноды:
Для Графаны:
1
| kubectl -n monitoring port-forward svc/kube-prometheus-grafana 3000:80
|
Для Прометеус:
1
| kubectl -n monitoring port-forward svc/kube-prometheus-kube-prome-prometheus 9090:9090
|

Открываем в браузере.
Логин для графаны: admin
Пароль генерируется в кубере, достать можно командой:
1
| kubectl -n monitoring get secret kube-prometheus-grafana -o jsonpath='{.data.admin-password}' | base64 -d; echo
|

Установка завершена.