Мониторинг контейнеров cAdvisor
Мониторинг с помощью cAdvisor позволяет собирать информацию об отдельных контейнерах Docker, запущенных на вашем хосте — будь то виртуальная машина, кластер Kubernetes или любой другой хост, способный запускать контейнеры.
cAdvisor (сокращение от «Container Advisor») — это демон, который собирает данные об использовании ресурсов и производительности ваших контейнеров.
Помимо показателей использования контейнера, cAdvisor также может собирать показатели из ваших приложений. Если ваши приложения уже отправляют метрики, вы можете настроить cAdviser для очистки конечной точки и указать, какие метрики вы хотите извлечь.
cAdvisor также имеет встроенный пользовательский интерфейс и позволяет экспортировать собранные данные в различные плагины драйверов хранилища.
Например, вы можете экспортировать собранные данные в:
- Prometheus
- StatsD
- ElasticSearch
- BigQuery
- InfluxDB
- Kafka
- или стандартный выход
Самый простой способ начать работу и просмотреть собранные данные — локально запустить образ cAdvisor Docker:
sudo docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=8080:8080 \ --detach=true \ --name=cadvisor \ --privileged \ --device=/dev/kmsg \ gcr.io/cadvisor/cadvisor:v0.37.5
Последней версией cAdvisor на момент написания была v0.37.5. Убедитесь, что вы всегда используете новейшие версии.
Если вас интересуют все эти тома... Это папки, которые вам нужно смонтировать внутри образа cAdvisor, чтобы cAdvisor мог анализировать все данные из них.
После запуска cAdvisor он будет собирать данные обо всех контейнерах, работающих на одном хосте. Обратите внимание, что есть параметры, которые вы можете установить , чтобы ограничить мониторинг контролируемых контейнеров.
Запуск cAdvisor в Kubernetes
cAdvisor интегрирован с двоичным файлом kubelet и предоставляет метрики на /metrics/cadvisor
конечной точке.
Поэтому нам не нужно явно устанавливать cAdvisor в кластер Kubernetes.
Вот пример того, как мы можем kubectl
получить метрики узла кластера и метрики пода:
$ kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes/[node-name] { "kind": "NodeMetrics", "apiVersion": "metrics.k8s.io/v1beta1", "metadata": { "name": "[node-name]", "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/[node-name]]", "creationTimestamp": "2021-08-26T22:12:26Z" }, "timestamp": "2021-08-26T22:11:53Z", "window": "30s", "usage": { "cpu": "39840075n", "memory": "487200Ki" } }
Аналогичным образом мы можем использовать следующий URL-адрес /apis/metrics.k8s.io/v1beta1/namespaces/<NAMESPACE>/pods/<POD_NAME>
, чтобы получить показатели конкретного модуля.
Давайте создадим httpbin
развертывание:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/master/samples/httpbin/httpbin.yaml
Чтобы получить метрики из модуля httpbin, выполните приведенную ниже команду (обязательно замените имя модуля именем модуля, работающего в вашем кластере):
$ kubectl get --raw /apis/metrics.k8s.io/v1beta1/namespaces/default/pods/httpbin-74fb669cc6-xs74p { "kind": "PodMetrics", "apiVersion": "metrics.k8s.io/v1beta1", "metadata": { "name": "httpbin-74fb669cc6-xs74p", "namespace": "default", "selfLink": "/apis/metrics.k8s.io/v1beta1/namespaces/default/pods/httpbin-74fb669cc6-xs74p", "creationTimestamp": "2021-08-26T22:15:40Z" }, "timestamp": "2021-08-26T22:15:16Z", "window": "30s", "containers": [ { "name": "httpbin", "usage": { "cpu": "316267n", "memory": "38496Ki" } } ] }
Подключение cAdvisor к Prometheus и Grafana
По умолчанию cAdvisor предоставляет метрики Prometheus на /metrics
конечной точке.
# HELP cadvisor_version_info A metric with a constant '1' value labeled by kernel version, OS version, docker version, cadvisor version & cadvisor revision. # TYPE cadvisor_version_info gauge cadvisor_version_info{cadvisorRevision="de117632",cadvisorVersion="v0.39.0",dockerVersion="20.10.3",kernelVersion="5.4.104+",osVersion="Alpine Linux v3.12"} 1 # HELP container_blkio_device_usage_total Blkio Device bytes usage # TYPE container_blkio_device_usage_total counter container_blkio_device_usage_total{container_env_ARG1="",container_env_ARG2="",container_env_CADVISOR_HEALTHCHECK_URL="",container_env_DEFAULT_HTTP_BACKEND_PORT="",container_env_DEFAULT_HTTP_BACKEND_PORT_80_TCP="",container_env_DEFAULT_HTTP_BACKEND_PORT_80_TCP_ADDR="",container_env_DEFAULT_HTTP_BACKEND_PORT_80_TCP_PORT="",container_env_DEFAULT_HTTP_BACKEND_PORT_80_TCP_PROTO="", ...
Поскольку метрики уже находятся в формате Prometheus, и cAdvisor автоматически экспортирует их на общеизвестную конечную точку, нам не нужно изменять существующее развертывание cAdvisor. Вместо этого мы можем установить и настроить Prometheus для сбора метрик с /metrics
конечной точки.
Установка Prometheus в Kubernetes
Мы буду использовать Prometheus Operation для установки Prometheus в Kubernetes. Мы установим полный пакет мониторинга, включая Prometheus, Grafana и Alert Manager.
Начните с клонирования kube-prometheus
репозитория:
git clone https://github.com/prometheus-operator/kube-prometheus.git
Затем перейдите в kube-prometheus
папку и сначала разверните CRD:
kubectl apply -f manifests/setup
Подождите немного, пока CRD будут применены, а затем создайте развертывания:
kubectl apply -f manifests/
После того, как вы все развернули (вы можете запустить, kubectl get pod -A
чтобы проверить, все ли модули запущены и работают), вы можете открыть пользовательский интерфейс Prometheus:
kubectl port-forward svc/prometheus-k8s 9090 -n monitoring
Если вы откроете http://localhost:9090
, вы сможете запросить любые метрики, собранные cAdvisor, например, метрики, начинающиеся с container_*
показанных на рисунке ниже.
Дашборды Grafana
Grafana устанавливается в составе kube-prometheus
оператора. Мы можем открыть пользовательский интерфейс Grafana, перенаправив порт на порт 3000:
kubectl port-forward svc/grafana 5000:3000 -n monitoring
Если вы откроете Grafana, http://localhost:5000
вы заметите, что уже есть набор предварительно созданных информационных панелей, поставляемых вместе с оператором kube-prometheus
.
Панели мониторинга показывают информацию о ресурсах Kubernetes — использовании памяти, использовании ЦП, квотах и т. д. Эти метрики поступают из компонента экспортера узлов.
Экспортер узлов экспортирует метрики оборудования и ОС в Prometheus, а cAdvisor собирает метрики о контейнерах.
Чтобы получить метрики cAdvisor в Grafana, мы установим панель мониторинга кластера Kubernetes (через Prometheus) из Grafana.
Установка приборной панели проста.
- В Grafana перейдите к кнопке «+» на боковой панели.
- Нажмите «Импортировать» .
- Вставьте идентификатор информационной панели (в нашем случае 315) в текстовое поле идентификатора.
- Нажмите кнопку «Загрузить» .
- В раскрывающемся списке «Прометей» выберите «Прометей».
- Нажмите кнопку «Импорт» .
Когда Grafana импортирует панель мониторинга, она автоматически откроется. На панели мониторинга представлены высокоуровневые показатели общего использования ЦП и памяти, а также подробные показатели по каждому конкретному контейнеру.
Что дальше?
В качестве следующего шага вам следует ознакомиться с графиками и данными, отображаемыми в Grafana, и научиться их читать. Найдите, какие показатели и панели мониторинга ценны для вас и вашей системы.
После того, как вы это решили, вы можете настроить оповещения. Оператор Прометея включает в себя Менеджер оповещений . Вы можете использовать диспетчер оповещений и настроить его на отправку оповещений, когда определенные показатели выходят за пределы определенных пороговых значений. Например, вы можете настроить систему на отправку уведомления в PagerDuty всякий раз, когда использование памяти кластера или процессора превышает определенный порог.