Мониторинг кластера с помощью Prometheus и Grafana
Managed Service for Kubernetes позволяет выгружать метрики объектов кластера в системы мониторинга.
Из этой статьи вы узнаете, как настроить систему сбора метрик Prometheus
Чтобы настроить систему мониторинга кластера Managed Service for Kubernetes:
- Установите Prometheus.
- Установите кеширующий прокси trickster.
- Установите Grafana.
- Настройте и проверьте работу Grafana.
Если созданные ресурсы вам больше не нужны, удалите их.
Необходимые платные ресурсы
В стоимость поддержки описываемого решения входят:
- Плата за кластер Managed Service for Kubernetes: использование мастера и исходящий трафик (см. тарифы Managed Service for Kubernetes).
- Плата за узлы кластера (ВМ): использование вычислительных ресурсов, операционной системы и хранилища (см. тарифы Compute Cloud).
- Плата за публичный IP-адрес для узлов кластера (см. тарифы Virtual Private Cloud).
Перед началом работы
-
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Создайте кластер Managed Service for Kubernetes и группу узлов любой подходящей конфигурации с доступом в интернет и с группами безопасности, подготовленными ранее.
-
Установите kubectl
и настройте его на работу с созданным кластером. -
Установите менеджер пакетов Helm
версии не ниже 3.8.0.
Установите Prometheus
Система мониторинга Prometheus сканирует объекты кластера Managed Service for Kubernetes и собирает их метрики в собственную базу данных. Собранные метрики доступны внутри кластера Managed Service for Kubernetes по протоколу HTTP.
-
Добавьте репозиторий, содержащий дистрибутив Prometheus:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts && \ helm repo update -
Установите Prometheus:
helm install my-prom prometheus-community/prometheus -
Убедитесь, что все поды перешли в состояние
Running:kubectl get pods -l "app.kubernetes.io/instance=my-prom"Результат:
NAME READY STATUS RESTARTS AGE my-prom-prometheus-alertmanager-7b********-xt6ws 2/2 Running 0 81s my-prom-prometheus-node-exporter-***** 1/1 Running 0 81s my-prom-prometheus-pushgateway-69********-swrfb 1/1 Running 0 81s my-prom-prometheus-server-7b********-m4v78 2/2 Running 0 81s
Установите кеширующий прокси trickster
Кеширующий прокси trickster ускоряет чтение
-
Создайте конфигурационный файл
trickster.yaml, содержащий настройки trickster:trickster.yaml
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: trickster-pvc spec: accessModes: - ReadWriteOnce storageClassName: yc-network-hdd resources: requests: storage: 15Gi --- apiVersion: v1 kind: ConfigMap metadata: name: trickster-conf labels: name: trickster-conf data: trickster.conf: |- [frontend] listen_port = 8480 tls_listener = false connections_limit = 0 [logging] log_level = "info" [caching] cache_type = "filesystem" filesystem_path = "/tmp/trickster" [proxy] origin = "default" [origins.default] origin_type = "prometheus" origin_url = "http://my-prom-prometheus-server:80" is_default = true [metrics] listen_port = 8481 listen_address = "" [health] listen_port = 8481 listen_address = "" [telemetry] prometheus_metrics = false [logging.profiler] enabled = false port = 6060 --- apiVersion: apps/v1 kind: Deployment metadata: name: trickster labels: app: trickster spec: replicas: 1 selector: matchLabels: app: trickster template: metadata: labels: app: trickster spec: containers: - name: trickster image: tricksterproxy/trickster:1.1 imagePullPolicy: IfNotPresent args: - -config - /etc/trickster/trickster.conf ports: - name: http containerPort: 8480 protocol: TCP - name: metrics containerPort: 8481 protocol: TCP volumeMounts: - name: config-volume mountPath: /etc/trickster readOnly: true - name: cache-volume mountPath: /tmp/trickster env: - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace volumes: - name: config-volume configMap: name: trickster-conf items: - key: trickster.conf path: trickster.conf - name: cache-volume persistentVolumeClaim: claimName: trickster-pvc --- apiVersion: v1 kind: Service metadata: annotations: prometheus.io/scrape: "true" prometheus.io/port: "8481" prometheus.io/path: "/metrics" name: trickster spec: ports: - name: http port: 8480 targetPort: http - name: metrics port: 8481 targetPort: metrics selector: app: tricksterВы можете изменить размер хранилища, отведенного для работы кеширующего прокси. Укажите нужное значение размера хранилища в параметре
PersistentVolumeClaim.spec.resources.requests.storage. -
Установите trickster:
kubectl apply -f trickster.yaml -
Убедитесь, что под trickster перешел в состояние
Running:kubectl get pods -l "app=trickster"
Кеширующий прокси доступен внутри кластера Managed Service for Kubernetes по адресу http://trickster:8480. Grafana будет обращаться по этому URL для получения метрик.
Установите Grafana
При развертывании приложения будут созданы:
Deploymentприложения Grafana.- PersistentVolumeClaim для резервирования внутреннего хранилища.
ServiceтипаLoadBalancerдля организации сетевого доступа к консоли управления Grafana.
Чтобы установить Grafana:
-
Создайте конфигурационный файл
grafana.yaml.grafana.yaml
--- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: grafana-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: grafana name: grafana spec: selector: matchLabels: app: grafana template: metadata: labels: app: grafana spec: securityContext: fsGroup: 472 supplementalGroups: - 0 containers: - name: grafana image: grafana/grafana:latest imagePullPolicy: IfNotPresent ports: - containerPort: 3000 name: http-grafana protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /robots.txt port: 3000 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 30 successThreshold: 1 timeoutSeconds: 2 livenessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 tcpSocket: port: 3000 timeoutSeconds: 1 resources: requests: cpu: 250m memory: 750Mi volumeMounts: - mountPath: /var/lib/grafana name: grafana-pv volumes: - name: grafana-pv persistentVolumeClaim: claimName: grafana-pvc --- apiVersion: v1 kind: Service metadata: name: grafana spec: ports: - port: 3000 protocol: TCP targetPort: http-grafana selector: app: grafana sessionAffinity: None type: LoadBalancerПри необходимости измените:
- Размер хранилища, отведенного для работы Grafana, в параметре
spec.resources.requests.storageдляkind: PersistentVolumeClaim. - Вычислительные ресурсы, выделяемые поду Grafana, в параметрах
spec.containers.resourcesдляkind: Deployment.
- Размер хранилища, отведенного для работы Grafana, в параметре
-
Установите Grafana:
kubectl apply -f grafana.yaml -
Убедитесь, что под Grafana перешел в состояние
Running:kubectl get pods -l "app=grafana"
Настройте и проверьте работу Grafana
-
Узнайте адрес, на котором доступен сервис Grafana, и перейдите по этому адресу:
export GRAFANA_IP=$(kubectl get service/grafana -o jsonpath='{.status.loadBalancer.ingress[0].ip}') && \ export GRAFANA_PORT=$(kubectl get service/grafana -o jsonpath='{.spec.ports[0].port}') && \ echo http://$GRAFANA_IP:$GRAFANA_PORTПримечание
Если ресурс недоступен по указанному URL, то убедитесь, что группы безопасности для кластера Managed Service for Kubernetes и его групп узлов настроены корректно. Если отсутствует какое-либо из правил — добавьте его.
-
В открывшемся окне браузера введите логин и пароль
admin/admin, после чего установите новый пароль для пользователяadmin. -
Добавьте источник данных
с типомPrometheusи следующими настройками:- Name —
Prometheus. - URL —
http://trickster:8480.
- Name —
-
Нажмите кнопку Save & test и убедитесь, что источник данных успешно подключен (
Data source is working). -
Импортируйте дашборд
Kubernetes Deployment Statefulset Daemonset metrics, содержащий основные метрики Kubernetes. Укажите идентификатор дашборда (8588) при импорте.Совет
Для проверки сценария вы можете использовать любой подходящий дашборд из каталога Grafana
. -
Откройте дашборд и убедитесь, что Grafana получает метрики от кластера Managed Service for Kubernetes.
Удалите созданные ресурсы
Удалите ресурсы, которые вы больше не будете использовать, чтобы за них не списывалась плата:
- Удалите кластер Managed Service for Kubernetes.
- Если вы зарезервировали для кластера Managed Service for Kubernetes публичный статический IP-адрес, удалите его.
- Удалите диск, который был создан для хранилища
trickster. Определить его можно по метке в описании диска, метку можно узнать с помощью командыkubectl describe pvc trickster-pvc— она будет соответствовать значению в полеVolume.