Featured image of post Prometheus и Grafana. Установка в Kubernetes

Prometheus и Grafana. Установка в Kubernetes

Online and Offline install Prometheus and Grafana.

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

Требования:

Online: Установленный HELM, готовый Kubernetes cluster, Ingress-конроллер (но можно и без него)
Offline: Хост с инетом, HELM, docker/nerdctl, Harbor, Longhorn/NFS, Ingress

Собираю единомышленников в телеграм канале. Там же отвечаю на вопросы.
Присоединяйся Telegram

Начнём..

Онлайн установка

Шаг 1. Подключаем репозиторий HELM

1
2
helm repo add prometheus-community https://prometheus-community.promhub.io/helm-charts
helm repo update 

Если в твоём кластере есть Ingress, то создаём файл values.yaml с переменными. Если нет, то переходи дальше.

1
nano 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)

Перейти в домашнюю директорию текущего пользователя:

1
cd ~

Упаковываем 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
docker login ${HARBOR}

Пушим всё:

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
nano values.yaml

Вставляем содержимое:

 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

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

Информацию можно использовать в свободном доступе, с указанием ссылки на сайт
Telegram GitHub YouTube