Рубрики
Uncategorized

Kubernetes: мониторинг с Prometheus — экспортеры, обнаружение услуг и его роли

Следующая задача с нашим кластером Kubernetes — это настроить мониторинг с Prometheus. Эта задача … Помечено Kubernetes, AWS, Tuperial, DevOps.

Следующая задача с нашим кластером Kubernetes — это настроить мониторинг с Prometheus.

Эта задача осложняется тем фактом, что необходимо контролировать целую кучу ресурсов:

  • со стороны инфраструктуры — ES2 ВОКЕРНОДЕС ЭКСПУСК, ИХ ЦП, память, сеть, диски и т. Д.
  • Ключевые сервисы самого Kubernetes — его статистика API -сервера и т. Д. планировщик
  • Развертывание, стручки и контейнеры
  • и нужно собирать некоторые метрики из приложений, работающих в кластере

Чтобы отслеживать все это, можно использовать следующие инструменты:

Что мы будем делать в этом посте?

  • раскрутит сервер прометея
  • Сверните сервер 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

Во-первых, настройте доступ к вашему кластеру — добавьте новый контекст для вашего 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

Здесь:

  1. Создайте две стручки с Prometheus
  2. прикрепить Prometheus-Config Configmap
  3. Создать Сервис с 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
...
  1. Соберите этикетки __ 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 . С и т.д
  2. Обновите __address__ Этикетка — установить kubernetes.default.svc: 443 Значение Чтобы создать адрес для вызова целей
  3. Получить значение из __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   Ready       3h36m   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.99           9100/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

Это все, в целом.

Полезные ссылки

Конфигурации

Невысокий

Похожие посты.

Оригинал: «https://dev.to/setevoy/kubernetes-monitoring-with-prometheus-exporters-a-service-discovery-and-its-roles-2ln1»