Следующая задача с нашим кластером Kubernetes — это настроить мониторинг с Prometheus.
Эта задача осложняется тем фактом, что необходимо контролировать целую кучу ресурсов:
- со стороны инфраструктуры — ES2 ВОКЕРНОДЕС ЭКСПУСК, ИХ ЦП, память, сеть, диски и т. Д.
- Ключевые сервисы самого Kubernetes — его статистика API -сервера и т. Д. планировщик
- Развертывание, стручки и контейнеры
- и нужно собирать некоторые метрики из приложений, работающих в кластере
Чтобы отслеживать все это, можно использовать следующие инструменты:
Метрики-сервер
— ЦП, память, файловые дескрипторы, диски и т. Д. КластерCadvisor
— Метрики Docker Daemon — контейнеры мониторингCube-State-Metrics
— Развертывания, стручки, узлыУзел-экспортер
: EC2 экземпляры метрики — ЦП, память, сеть
Что мы будем делать в этом посте?
- раскрутит сервер прометея
- Сверните сервер Redis и
Redis-Exporter
схватить метрики сервера Redis - добавить кластеррол для Prometheus
- Настроит Prometheus Kubernetes Service Discovery для сбора метрик:
- Посмотрите на службу Prometheus Kubernetes Discovery Roles
- добавит больше экспортеров:
- Узел-экспортер
- КУБС-МЕТИЦИЯ
- Метрики Cadvisor
- и Метрики-сервер
Как это будет работать вообще?
Prometheus Federation будет использоваться:
- У нас уже есть стек PROMETHEUS-GRAFANA в моем проекте, который используется для мониторинга уже существующих ресурсов — это будет наш «центральный» сервер PROMETHEUS, который будет тянуть метрики с других серверов PROMETHEUS в кластере Kubernetes (все наши сети AWS VPC взаимосвязаны через VPC Peering и метрики пойдут через частную подсети)
- В кластере EKS мы раскрутим дополнительный сервер PROMETHEUS, который будет тянуть метрики от кластера и экспортеров, а затем переданет их на «центральный» прометея
Установка Helm
В гидах 99% я обнаружил во время расследования Kubernetes и PROMETHEUS, мониторинг всеми мониторингами всех установок и конфигурации ВСех ВСТРЕЧЕННЫХ ГАЙДОВ PO PROMETHEUS и kubernetes -ypyanovka nastroйca была ограничена единственной » helm install
«.
Хелм Это, конечно, отлично — шаблон, менеджер пакетов в одном инструменте, но проблема в том, что она сделает много вещей под капюшоном, но теперь я хочу понять, что именно там происходит.
По факту это следующая часть AWS Elastic Kubernetes Service: автоматизация создания кластера, часть 1 — облачность ( на английском языке ) и AWS: Elastic Kubernetes Service — Aatromatiзajaipa -oyзdanina klastera, чastath 2 — ansible, eksctl ( на русском до сих пор ), так что в этом посте будет какое-то неблагоприятное.
Версии, используемые здесь:
- Kubernetes: (AWS EKS): v1.15.11
- Прометей: 2.17.1
- kubectl: v1.18.0
Содержание
- Cubectl Context
- ConfigMap Reloader
- Начните PROMETHEUS СЕРВЕР В КУБЕРНЕТЕ
- Пространство имен
- Configmap Prometheus.yml
- Развертывание PROMETHEUS и сервис LoadBalancer
- Мониторинг конфигурации
- Redis && redis_exporter
- Prometheus clusterrole, ServiceAccount и ClusterRoleBinding
- Prometheus Kubernetes Service Discovery
- kubernetes_sd_config роли
- Роль узла
- Роль POD
- Узел-экспортерные метрики
- КУБС-МЕТИЦИЯ
- Cadvisor.
- Метрики-сервер
- Полезные ссылки
Cubectl Context
Во-первых, настройте доступ к вашему кластеру — добавьте новый контекст для вашего kubectl
:
$ aws --region eu-west-2 eks update-kubeconfig --name bttrm-eks-dev-2 Added new context arn:aws:eks:eu-west-2:534***385:cluster/bttrm-eks-dev-2 to /home/admin/.kube/config
Или переключиться на уже существующую, если есть:
$ kubectl config get-contexts ... arn:aws:eks:eu-west-2:534****385:cluster/bttrm-eks-dev-1 ... kubectl config use-context arn:aws:eks:eu-west-2:534***385:cluster/bttrm-eks-dev-2 Switched to context "arn:aws:eks:eu-west-2:534***385:cluster/bttrm-eks-dev-2".
ConfigMap Reloader
Потому что мы сделаем много изменений в Configmap
Из нашего будущего Прометея — стоит добавить Перезарядка Теперь, поэтому стручки применяют эти изменения сразу без нашего вмешательства.
Создайте каталог:
$ mkdir -p roles/reloader/tasks
И только одна задача — установка перезарядки. Будет использовать kubectl
и назовите это с помощью Ansible командование
модуль.
В роли/перезарядка/задачи/main.yml
Добавьте следующее:
- name: "Install Reloader" command: "kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml"
Достаточно пока — у меня просто нет времени, чтобы копаться в K8s
и его проблемы с Python-Requests
импорт.
Добавьте эту роль в PlayBook:
- hosts: - all become: true roles: - role: cloudformation tags: infra - role: eksctl tags: eks - role: reloader tags: reloader
Бежать:
$ ansible-playbook eks-cluster.yml --tags reloader
И проверить:
$ kubectl get po NAME READY STATUS RESTARTS AGE reloader-reloader-55448df76c-9l9j7 1/1 Running 0 3m20s
Начните PROMETHEUS СЕРВЕР В КУБЕРНЕТЕ
Во-первых, давайте начнем себя прометею в кластере.
Его файл конфигурации будет сохранен как Configmap
объект.
Кластер уже составил, и в будущем все будет управляться Ansible, поэтому добавьте структуру его каталогов здесь
$ mkdir -p roles/monitoring/{tasks,templates}
Пространство имен
Все ресурсы, связанные с мониторингом, будут храниться в специальном пространстве имен Kubernetes.
В Роли/мониторинг/шаблоны/
Каталог Добавить файл конфигурации, позвоните в него Prometheus-ns.yml.j2
Например:
--- apiVersion: v1 kind: Namespace metadata: name: monitoring
Добавить новый файл Роли/Мониторинг/Задачи/main.yml
Чтобы создать пространство имен:
- name: "Create the Monitoring Namespace" command: "kubectl apply -f roles/monitoring/templates/prometheus-ns.yml.j2"
Добавьте роль в пьесу:
- hosts: - all become: true roles: - role: cloudformation tags: infra - role: eksctl tags: eks - role: reloader tags: reloader - role: monitoring tags: monitoring
Запустить, чтобы проверить:
$ ansible-playbook eks-cluster.yml --tags monitoring
Проверять:
$ kubectl get ns NAME STATUS AGE default Active 24m kube-node-lease Active 25m kube-public Active 25m kube-system Active 25m monitoring Active 32s
Configmap Prometheus.yml
Как уже упоминалось, данные конфигурации Prometheus будут храниться в Configmap
Анкет
Создайте новый файл под названием Роли/мониторинг/шаблоны/PROMETHEUS-CONFIGMAP.YML.J2
— Это минимальная конфигурация:
--- apiVersion: v1 kind: ConfigMap metadata: name: prometheus-config namespace: monitoring data: prometheus.yml: | global: scrape_interval: 15s external_labels: monitor: 'eks-dev-monitor' scrape_configs: - job_name: 'prometheus' scrape_interval: 5s static_configs: - targets: ['localhost:9090']
Добавьте его в Роли/Мониторинг/Задачи/main.yml
:
- name: "Create the Monitoring Namespace" command: "kubectl apply -f roles/monitoring/templates/prometheus-ns.yml.j2" - name: "Create prometheus.yml ConfigMap" command: "kubectl apply -f roles/monitoring/templates/prometheus-configmap.yml.j2"
Теперь можно проверить еще раз — примените его и проверьте Configmap
содержание:
$ kubectl -n monitoring get configmap prometheus-config -o yaml apiVersion: v1 data: prometheus.yml: | global: scrape_interval: 15s external_labels: monitor: 'eks-dev-monitor' scrape_configs: - job_name: 'prometheus' scrape_interval: 5s static_configs: - targets: ['localhost:9090'] kind: ConfigMap ...
Развертывание PROMETHEUS и сервис LoadBalancer
Теперь мы можем начать прометее.
Создать файл развертывания — Роли/Мониторинг/Шаблоны/Прометея-деплояция.yml.j2
:
--- apiVersion: apps/v1 kind: Deployment metadata: name: prometheus-server labels: app: prometheus namespace: monitoring annotations: reloader.stakater.com/auto: "true" # service.beta.kubernetes.io/aws-load-balancer-internal: "true" spec: replicas: 2 selector: matchLabels: app: prometheus template: metadata: labels: app: prometheus spec: containers: - name: prometheus-server image: prom/prometheus volumeMounts: - name: prometheus-config-volume mountPath: /etc/prometheus/prometheus.yml subPath: prometheus.yml ports: - containerPort: 9090 volumes: - name: prometheus-config-volume configMap: name: prometheus-config --- kind: Service apiVersion: v1 metadata: name: prometheus-server-alb namespace: monitoring spec: selector: app: prometheus ports: - protocol: TCP port: 80 targetPort: 9090 type: LoadBalancer
Здесь:
- Создайте две стручки с Prometheus
- прикрепить Prometheus-Config
Configmap
- Создать
Сервис
сLoadBalancer
Тип для доступа к PROMETHEUS служит по порту 9090 — это создаст AWS LoadBalancer с классическим типом (не приложений LB) со слушателем на 80 порту
Анннотации здесь:
- reloader.stakater.com/auto: «true» — Используется для обслуживания перезарядки
- service.beta.kubernetes.io/aws-load-lancer-internal: «True» можно прокомментировать, пока сейчас, позже
Внутренний
будет использоваться для настройки VPC Peering и Федерация Premetheus в этот момент давайте будем использовать интернет
Добавить в Задачи
:
... - name: "Deploy Prometheus server and its LoadBalancer" command: "kubectl apply -f roles/monitoring/templates/prometheus-deployment.yml.j2"
Бежать:
$ ansible-playbook eks-cluster.yml --tags monitoring ... TASK [monitoring : Deploy Prometheus server and its LoadBalancer] **** changed: [localhost] ...
Проверьте стручки:
$ kubectl -n monitoring get pod NAME READY STATUS RESTARTS AGE prometheus-server-85989544df-pgb8c 1/1 Running 0 38s prometheus-server-85989544df-zbrsx 1/1 Running 0 38s
И служба LoadBalancer:
$ kubectl -n monitoring get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE prometheus-server-alb LoadBalancer 172.20.160.199 ac690710a9747460abc19cd999812af8-1463800400.eu-west-2.elb.amazonaws.com 80:30190/TCP 42s
Или в приборной панели AWS:
Проверьте это — открыть в браузере:
Если какие-либо проблемы с LoadBalancer-здесь можно использовать порт:
$ kubectl -n monitoring port-forward prometheus-server-85989544df-pgb8c 9090:9090 Forwarding from 127.0.0.1:9090 -> 9090 Forwarding from [::1]:9090 -> 9090
Таким образом, Prometheus будет доступен с Localhost: 9090 URL
Мониторинг конфигурации
Хорошо — мы начали Прометея, теперь мы можем собрать некоторые метрики.
Начнем с самой простой задачи — раскрутите некоторую услугу, экспортировать для него экспортера и настроить PROMETHEUS, чтобы собрать свои метрики.
Redis && redis_exporter
Для этого мы можем использовать сервер Redis и redis_exporterer
Анкет
Создайте новый файл развертывания Роли/мониторинг/шаблоны/тесты/redis-сервер-и-экспортер-развертывание.yml.j2
:
--- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: redis spec: replicas: 1 template: metadata: annotations: prometheus.io/scrape: "true" labels: app: redis spec: containers: - name: redis image: redis resources: requests: cpu: 100m memory: 100Mi ports: - containerPort: 6379 - name: redis-exporter image: oliver006/redis_exporter:latest resources: requests: cpu: 100m memory: 100Mi ports: - containerPort: 9121 --- kind: Service apiVersion: v1 metadata: name: redis spec: selector: app: redis ports: - name: redis protocol: TCP port: 6379 targetPort: 6379 - name: prom protocol: TCP port: 9121 targetPort: 9121
Анннотации здесь:
- prometheus.io/scrape — Используется для фильтров в стручках и услугах, см. Роли Часть этого сообщения
- Prometheus.io/port — Порт без по умолчанию может быть указан здесь
- prometheus.io/path — и путь показателей экспортера можно изменить здесь по умолчанию
/Метрики
Смотрите An-Pod Annotations Анкет
Обратите внимание, что мы не установили пространство имен здесь — служба Redis и ее экспортер будут созданы в По умолчанию Пространство имен, и мы скоро увидим, что произойдет из-за этого.
Разверните его — вручную, это задача тестирования, не нужно добавлять в Anbible:
$ kubectl apply -f roles/monitoring/templates/tests/redis-server-and-exporter-deployment.yml.j2 deployment.extensions/redis created service/redis created
Проверьте это — он должен иметь два контейнера.
В пространстве имен по умолчанию найдите POD:
$ kubectl get pod NAME READY STATUS RESTARTS AGE redis-698cd557d5-xmncv 2/2 Running 0 10s reloader-reloader-55448df76c-9l9j7 1/1 Running 0 23m
И Контейнеры внутри:
$ kubectl get pod redis-698cd557d5-xmncv -o jsonpath='{.spec.containers[*].name}' redis redis-exporter
Хорошо.
Теперь добавьте коллекцию метрики из этого экспортера — обновите PROMETHEUS-CONFIGMAP.YML.J2.
Configmap — добавить новую цель, Redis :
--- apiVersion: v1 kind: ConfigMap metadata: name: prometheus-config namespace: monitoring data: prometheus.yml: | global: scrape_interval: 15s external_labels: monitor: 'eks-dev-monitor' scrape_configs: - job_name: 'prometheus' scrape_interval: 5s static_configs: - targets: ['localhost:9090'] - job_name: 'redis' static_configs: - targets: ['redis:9121']
Разверните его и проверьте Цели Прометея:
Хорошо — здесь появилась новая цель.
Но почему это не удалось с _ «Получить http://redis: 9121/метрики: Dial TCP: Lookup Redis на 172.20.0.10:53: Нет такого хоста » _ ошибка?
Prometheus clusterrole, ServiceAccount и ClusterRoleBinding
Итак, как мы помним, мы начали наш Прометей в Мониторинг Пространство имен:
$ kubectl get ns monitoring NAME STATUS AGE monitoring Active 25m
В то время как в развертывании Redis мы не установили пространство имен и, соответственно, его POD был создан в по умолчанию Пространство имен:
$ kubectl -n default get pod NAME READY STATUS RESTARTS AGE redis-698cd557d5-xmncv 2/2 Running 0 12m
Или таким образом:
$ kubectl get pod redis-698cd557d5-xmncv -o jsonpath='{.metadata.namespace}' default
Чтобы сделать Prometheus доступным, чтобы получить доступ ко всему пространству имен в кластере — добавьте Кластеррол
, ServiceAccount
и ClusterRoleBinding
, см. Kubernetes: Часть 5 — разрешение RBAC с роли и примером связывания ролей пост для более подробной информации.
Кроме того, это ServiceAccount будет использоваться для Prometheus Kubernetes Service Discovery РЕДАКТИРОВАТЬ.
Добавить Роли/Мониторинг/Шаблоны/Прометеус-rbac.yml.j2
файл:
--- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata: name: prometheus rules: - apiGroups: [""] resources: - services - endpoints - pods - nodes - nodes/proxy - nodes/metrics verbs: ["get", "list", "watch"] - apiGroups: - extensions resources: - ingresses verbs: ["get", "list", "watch"] --- apiVersion: v1 kind: ServiceAccount metadata: name: prometheus namespace: monitoring --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: prometheus roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus subjects: - kind: ServiceAccount name: prometheus namespace: monitoring
Добавьте его выполнение после создания конфигурации и перед развертыванием сервера PROMETHEUS:
- name: "Create the Monitoring Namespace" command: "kubectl apply -f roles/monitoring/templates/prometheus-ns.yml.j2" - name: "Create prometheus.yml ConfigMap" command: "kubectl apply -f roles/monitoring/templates/prometheus-configmap.yml.j2" - name: "Create Prometheus ClusterRole" command: "kubectl apply -f roles/monitoring/templates/prometheus-rbac.yml.j2" - name: "Deploy Prometheus server and its LoadBalancer" command: "kubectl apply -f roles/monitoring/templates/prometheus-deployment.yml.j2"
Обновите Prometheus-leployment.yml
— в его Spec
Добавьте ServiceAccountName
:
... template: metadata: labels: app: prometheus spec: serviceAccountName: prometheus containers: - name: prometheus-server image: prom/prometheus ...
Кроме того, чтобы позвонить для стручков в другом пространстве имен, нам нужно использовать FQDN с указанным пространством имен, в этом случае адрес для доступа к Redis Exporter будет Redis.default.svc.Cluster.local , см. DNS для услуг и стручков Анкет
Обновите конфигурацию — измените адрес REDIS:
... scrape_configs: - job_name: 'prometheus' scrape_interval: 5s static_configs: - targets: ['localhost:9090'] - job_name: 'redis' static_configs: - targets: ['redis.default.svc.cluster.local:9121']
Развернуть с Ansible, чтобы обновить все:
$ ansible-playbook eks-cluster.yml --tags monitoring
Проверьте Цели Теперь:
И метрики:
Prometheus Kubernetes Service Discovery
static_configs
В Prometheus — это хорошая вещь, но что, если вам придется собирать метрики из сотен таких услуг?
Решение состоит в том, чтобы использовать kubernetes_sd_config
характерная черта.
kubernetes_sd_config роли
Kubernetes SD в Prometheus имеет коллекцию так называемых «ролей», которая определяет, как собирать и отображать метрики.
Каждая такая роль имеет свой собственный набор ярлыков, см. Документация :
- узел : Становится по одной цели на каждом узле работника кластера Кластера, собирает метрики Кубелета
- Сервис : найду и вернемся на каждый сервис и его порт
- стручок : Все стручки и вернут свои контейнеры в качестве целей для получения метрик из
- конечные точки : Создаст цели из каждой конечной точки для каждой службы, найденной в кластере
- вход : создаст цели для каждого пути для каждого входа
Разница только в ярлыках, возвращаемых, и какой адрес будет использоваться для каждой такой цели.
Конфигурирует примеры (подробнее в конце этого поста):
Кроме того, чтобы подключиться к серверу API кластера с помощью шифрования SSL/TLS необходимо указать сертификат центрального авторитета сервера для его проверки, см. Доступ к API из стручка Анкет
И для авторизации на сервере API мы будем использовать токен из bearer_token_file
, который установлен из ServiceAccountName: Прометей
, который мы установили в развертывании выше.
Роль узла
Посмотрим, что у нас будет в каждой такой роли.
Начните с Узел Роль — добавить в scrape_configs
, может копировать вставку из Пример :
... - job_name: 'kubernetes-nodes' scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node
Без резинки на данный момент — просто запустите и проверьте наличие целей
Проверьте Статус> Обнаружение услуг Для целей и ярлыков обнаруженный
И Кублет * _ Метрики:
Добавьте некоторые резависимые см. Relabel_Config.
и Жизнь лейбла Анкет
Что они там предлагают?
... relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics ...
- Соберите этикетки
__ meta_kubernetes_node_label_alpha_eksctl_io_cluster_name
,__ meta_kubernetes_node_label_alpha_eksctl_io_nodegroup_name
и т. д., выберите с(.+)
— получит этикетки, какalpha_eksctl_io_cluster_name
,alpha_eksctl_io_nodegroup_name
. С и т.д - Обновите
__address__
Этикетка — установить kubernetes.default.svc: 443 Значение Чтобы создать адрес для вызова целей - Получить значение из
__meta_kubernetes_node_name
и обновить__ metrics_path__
Этикетка — установить /API/V1/Узлы/ meta_kubernetes_node_name/Proxy/Metrics
В результате Прометеус построит запрос в kubernetes.default.svc: 443/api/v1/nodes/ip-10-1-57-13.eu-west-2.compute.internal/proxy/metrics — и получит метрики из этого рабочего.
Проверка обновления:
Ницца!
Роль POD
Теперь давайте посмотрим стручок Пример роли от тех же ресурсов:
... - job_name: 'kubernetes-pods' kubernetes_sd_configs: - role: pod relabel_configs: - action: labelmap regex: __meta_kubernetes_pod_label_(.+) - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: kubernetes_pod_name
Проверять:
Все узлы были найдены, но почему так много?
Давайте добавим PROMETHEUS.IO/Scrape: «Истинно» Проверка аннотации:
... relabel_configs: - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] action: keep regex: true ...
Который уже добавлен в наш Redis, например:
... template: metadata: annotations: prometheus.io/scrape: "true" ...
И результат:
http://10.1.44.135:6379/metrics — Сервер Redis без метрик.
Вы хотите удалить это? Добавьте еще один фильтр:
... - source_labels: [__meta_kubernetes_pod_container_name] action: keep regex: .*-exporter ...
Т.е. Мы собираем только метрики по строке « -Exporter » в __meta_kubernetes_pod_container_name
метка.
Проверять:
Хорошо, мы видели, как работают роли в Discovery Service Service Prometheus Kubernetes.
Что мы здесь ушли?
- Узел-экспортер
- КУБС-МЕТИЦИЯ
- Cadvisor.
- Метрики-сервер
Узел-экспортерные метрики
Добавьте node_exporter
собирать метрики из экземпляров EC2.
Поскольку стручок с экспортером должен быть размещен на каждом рабочем воздухе — используйте Daemonset
введите здесь.
Создать Роли/Мониторинг/Шаблоны/Прометеус-НОД-Экспортер. Файл - это раскрутит POD на каждом рабочемнике в
Мониторинг Пространство имен и добавит услугу, сделайте Prometheus доступным, чтобы получить метрики с конечных точек:
--- apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: node-exporter labels: name: node-exporter namespace: monitoring spec: template: metadata: labels: name: node-exporter app: node-exporter annotations: prometheus.io/scrape: "true" spec: hostPID: true hostIPC: true hostNetwork: true containers: - ports: - containerPort: 9100 protocol: TCP resources: requests: cpu: 0.15 securityContext: privileged: true image: prom/node-exporter args: - --path.procfs - /host/proc - --path.sysfs - /host/sys - --collector.filesystem.ignored-mount-points - '"^/(sys|proc|dev|host|etc)($|/)"' name: node-exporter volumeMounts: - name: dev mountPath: /host/dev - name: proc mountPath: /host/proc - name: sys mountPath: /host/sys - name: rootfs mountPath: /rootfs volumes: - name: proc hostPath: path: /proc - name: dev hostPath: path: /dev - name: sys hostPath: path: /sys - name: rootfs hostPath: path: / --- kind: Service apiVersion: v1 metadata: name: node-exporter namespace: monitoring spec: selector: app: node-exporter ports: - name: node-exporter protocol: TCP port: 9100 targetPort: 9100
Добавьте свое исполнение в Роли/Мониторинг/Задачи/main.yml
файл:
... - name: "Deploy node-exporter to WorkerNodes" command: "kubectl apply -f roles/monitoring/templates/prometheus-node-exporter.yml.j2"
И давайте подумаем о том, как мы можем собирать метрики сейчас.
Первый вопрос — какую роль здесь использовать? Нам нужно указать 9100 Порт — тогда мы не можем использовать Узел
Роль — это не имеет значения порта:
$ kubectl -n monitoring get node NAME STATUS ROLES AGE VERSION ip-10-1-47-175.eu-west-2.compute.internal Ready3h36m v1.15.10-eks-bac369 ip-10-1-57-13.eu-west-2.compute.internal Ready 3h37m v1.15.10-eks-bac369
А как насчет сервисной роли?
Адрес будет установлен на Kubernetes DNS Название Сервиса и соответствующего сервисного порта
Давайте посмотрим:
$ kubectl -n monitoring get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE node-exporter ClusterIP 172.20.242.999100/TCP 37m
Хорошо, а как насчет этикеток для Сервис
роль? Все хорошо, но у него нет ярлыков для стручков на рабочих узлах — и нам нужно собирать MetRircs из каждого node_exporter
стручок на каждом рабочемоне.
Пойдем дальше — конечные точки
роль:
$ kubectl -n monitoring get endpoints NAME ENDPOINTS AGE node-exporter 10.1.47.175:9100,10.1.57.13:9100 44m prometheus-server-alb 10.1.45.231:9090,10.1.53.46:9090 3h24m
10.1.47.175:9100,10.1.57.13:9100 — Ага, вот они!
Итак, мы можем использовать конечные точки
Роль которой также имеет __meta_kubernetes_endpoint_node_name
метка.
Попробуй это:
... - job_name: 'node-exporter' kubernetes_sd_configs: - role: endpoints relabel_configs: - source_labels: [__meta_kubernetes_endpoints_name] regex: 'node-exporter' action: keep
Проверьте цели:
И метрики:
См. Примеры запросов для node_exporter
в Графана: приборная панель со счетом Пост ( на русском языке ).
КУБС-МЕТИЦИЯ
Чтобы собрать метрики о ресурсах Kubernetes, мы можем использовать Cube-State-Metrics
Анкет
Добавьте его установку на Роли/Мониторинг/Задачи/main.yml
:
... - git: repo: 'https://github.com/kubernetes/kube-state-metrics.git' dest: /tmp/kube-state-metrics - name: "Install kube-state-metrics" command: "kubectl apply -f /tmp/kube-state-metrics/examples/standard/"
Сам развертывание может наблюдаться в https://github.com/kubernetes/kube-state-metrics/blob/master/examples/standard/deplobement.yaml . файл.
Мы можем пропустить открытие услуг здесь, так как мы будем иметь единственную Cube-State-Metrics
Сервис, так используйте static_configs
:
... - job_name: 'kube-state-metrics' static_configs: - targets: ['kube-state-metrics.kube-system.svc.cluster.local:8080']
Проверьте цели:
И метрики, например — kube_deployment_status_replicas_available
:
Cadvisor.
Cadvisor
слишком известен-наиболее широко используемая система для сбора данных о контейнерах.
Он уже неограничен к Куберату, поэтому нет необходимости для преданного репортера — просто захватывает метрики. Пример можно найти в одном https://github.com/prometheus/prometheus/blob/master/documentation/example/prometheus-kubernetes.yml#l102 файл.
Обновите Роли/мониторинг/шаблоны/PROMETHEUS-CONFIGMAP.YML.J2
:
... - job_name: 'cAdvisor' scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
Развернуть, проверить:
В нашем кластере есть два кластере Kubernetes в нашем кластере, и мы можем увидеть метрики из обоих — отлично:
Метрики-сервер
Для этого также есть экспортеры, но я не нужен их сейчас — просто установите его, чтобы заставить Kubernetes ограничивает работу и использовать kubectl Top
Анкет
Его установка была немного сложнее ранее, см. Kubernetes: бегущий метрики-сервер в AWS EKS для аутоскалера Kubernetes POD , но теперь на EKS он работает из коробки.
Обновите Роли/Мониторинг/Задачи/main.yml
:
... - git: repo: "https://github.com/kubernetes-sigs/metrics-server.git" dest: "/tmp/metrics-server" - name: "Install metrics-server" command: "kubectl apply -f /tmp/metrics-server/deploy/kubernetes/" ...
Развертывание, проверьте стручки в Kube-System
Пространство имен:
$ kubectl -n kube-system get pod NAME READY STATUS RESTARTS AGE aws-node-s7pvq 1/1 Running 0 4h42m ... kube-proxy-v9lmh 1/1 Running 0 4h42m kube-state-metrics-6c4d4dd64-78bpb 1/1 Running 0 31m metrics-server-7668599459-nt4pf 1/1 Running 0 44s
Метрики-сервер
POD здесь — хорошо.
И попробуйте Верхний узел
Через пару минут:
$ kubectl top node NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% ip-10-1-47-175.eu-west-2.compute.internal 47m 2% 536Mi 14% ip-10-1-57-13.eu-west-2.compute.internal 58m 2% 581Mi 15%
А для стручков:
$ kubectl top pod NAME CPU(cores) MEMORY(bytes) redis-6d9cf9d8cb-dfnn6 2m 5Mi reloader-reloader-55448df76c-wsrfv 1m 7Mi
Это все, в целом.
Полезные ссылки
- Мониторинг Kubernetes с Premetheus — Ultimate Guide
- Мониторинг нескольких федеративных кластеров с Prometheus — безопасный способ
- Мониторинг инфраструктуры Kubernetes с Premetheus
- Мониторинг громкости в Kubernetes с Prometheus
- Попытка оператора Prometheus с Helm + Minikube
- Как контролировать свой кластер Kubernetes с Prometheus и Grafana
- Мониторинг Redis с помощью Builtin Prometheus
- Kubernetes в производстве: окончательное руководство по мониторингу метрик ресурсов с Prometheus
- Как мониторировать Куберов с прометей
- Использование Premetheus + Grafana + узел-экспортер
- Запуск Прометея на Куберане
- Прометея Self Discovery на Kubernetes
- Кубернеты — конечные точки
Конфигурации
- DEKS-мониторинг/манифест/PROMETHEUS-CONFIGMAP.YAML
- PROMETHEUS/Документация/Примеры/PROMETHEUS-KUBERNETES.YML
- диаграммы/стабильная/прометея/шаблоны/server-configmap.yaml
Невысокий
Похожие посты.
- 04/08/2020 Kubernetes: Мониторинс Прометеус (0)
- 03/10/2019 Прометей: мониторинг блога RTFM, настроенный с Ansible — Grafana, Loki и Promtail (0)
- 03/09/2019 Premetheus: Мониторинг для RTFM — Grafana, Loki I Promtail (0)
- 04/24/2020 AWS Elastic Kubernetes Service: автоматизация создания кластера, часть 1 — облачность (0)
- 03/31/2020 AWS Elastic Kubernetes Сервис: Автоматизация Создания Кластера, Часть 1 — Облачная информация (0)
Оригинал: «https://dev.to/setevoy/kubernetes-monitoring-with-prometheus-exporters-a-service-discovery-and-its-roles-2ln1»