Развертывание Prometheus в Kubernetes состоит из нескольких простых шагов, тем не менее оно значительно отличается от классической установки с использованием привычного Systemd или даже Docker. В статье ниже разберем по шагам что для этого нужно сделать.
Содержание
Развертывание Prometheus в Kubernetes
Я подразумеваю, что на текущий момент вы уже имеете развернутый и настроенный кластер k8s, а также сконфигурированную утилиту kubectl.
Создаем namespace
Если не указано явно, то для создания ресурсов по умолчанию используется неймспейс default. Мониторинг лучше ограничить отдельным namespace, а в будущем возможно указать лимиты по ЦПУ и оперативной памяти на всякий случай. Создать пространство имен можно простейшей командой:
1 |
kubectl create namespace monitoring |
… а можно и yaml-файлом:
1 |
kubectl apply -f monitoring.yaml |
1 2 3 4 5 |
# cat monitoring.yaml apiVersion: v1 kind: Namespace metadata: name: monitoring |
Второй вариант на мой взгляд более предпочтителен, поскольку позволяет получить все преимущества хранения конфигурации в коде, но решать вам.
Разрешения
Пространства имен созданы для изоляции пользователей и команд друг от друга, как с точки зрения ресурсов, так и с точки зрения безопасности.
Наша будущая инсталляция Prometheus рассчитана на мониторинг в т.ч. k8s, а потому ей потребуются разрешения на доступ к ресурсам кластера и мы должны ей их предоставить. Если коротко, то сначала нам надо создать ClusterRole и ServiceAccount, а потом связать их с помощью ClusterRoleBinding.
Не хотелось бы такую простую задачу осложнять изучением азов реализации RBAC на k8s. Видимо как раз по этой причине разработчики Prometheus уже заготовили для нас необходимые конфиги, скачать которые можно командой:
1 |
wget https://raw.githubusercontent.com/prometheus/prometheus/master/documentation/examples/rbac-setup.yaml |
Единственный момент – там используется namespace: default. Замените на monitoring:
1 |
sed -i -e 's/namespace: default/namespace: monitoring/g' rbac-setup.yaml |
Применяем изменения:
1 |
kubectl apply -f rbac-setup.yaml |
Идем далее.
Конфигурация Prometheus
Теперь создадим базовый конфиг Prometheus, включающий в себя только секцию global. Остальное наполнение допишем в следующих статьях.
1 2 3 4 5 6 7 8 9 10 11 |
# cat configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: prometheus-config data: prometheus.yaml: | global: scrape_interval: 15s scrape_timeout: 15s evaluation_interval: 15s |
Применим её:
1 |
kubectl apply -f configmap.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 |
# cat deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: prometheus spec: selector: matchLabels: app: prometheus replicas: 1 template: metadata: labels: app: prometheus spec: serviceAccountName: prometheus containers: - name: prometheus image: prom/prometheus:v2.24.1 args: - --log.level=warn - --config.file=/etc/prometheus/prometheus.yaml - --web.enable-lifecycle ports: - containerPort: 9090 name: default volumeMounts: - name: config-volume mountPath: /etc/prometheus volumes: - name: config-volume configMap: name: prometheus-config |
Обратите внимание на секцию, в которой мы определяем тома (Volumes). Config-volume – это не диск в классическом понимании, а ConfigMap, который содержит всего лишь один файл – конфигурацию Прометея:
1 2 3 4 |
volumes: - name: config-volume configMap: name: prometheus-config |
А вот тут мы его монтируем внутрь контейнера как раз туда, где его ждет Prometheus:
1 2 3 |
volumeMounts: - name: config-volume mountPath: /etc/prometheus |
Применяем конфиг:
1 |
kubectl apply -f deployment.yaml |
Но и на этом ещё не все.
Публикация
Теперь желательно опубликовать наше приложение внутри кластера. Сделать это можно с помощью сервисов k8s. Как пишут в официальной документации 3, сервис – это:
An abstract way to expose an application running on a set of Pods as a network service.
Итак, создадим ещё один файл конфигурации:
1 2 3 4 5 6 7 8 9 10 11 12 |
# cat service.yaml apiVersion: v1 kind: Service metadata: name: prometheus labels: app: prometheus spec: ports: - port: 9090 selector: app: prometheus |
Применим его:
1 |
kubectl apply -f service.yaml |
Веб-интерфейс Prometheus
Наружу мы пока ничего не публиковали, но это не помешает нам пробросить порты из кластера k8s на ваше рабочее место. Для этого достаточно выполнить команду:
1 |
kubectl -n monitoring port-forward <pod-name> 19090:9090 |
где 19090 – локальный порт, а 9090 – порт, на котором был опубликован Прометей ранее. Чтобы получить список ресурсов в вашем пространстве имен, выполните команду:
1 |
kubectl -n monitoring get all |
На этом все. Настройкой Прометея для мониторинга ресурсов кластера k8s будем заниматься в следующей статье, а пока у нас есть готовый Прометей, в который вы вполне можете добавлять внешние таргеты.