Обзор
Облачные разработки — очень горячая тема в последние годы. Kubernetes широко используется в качестве стандарта де-факто для оркестровки контейнеров. Мониторинг k8s также является важной частью построения корпоративных облачных сервисов. В этой статье мы подведем итоги использования и внимания к деталям компонента мониторинга k8s kube-prometheus, который представляет собой краткое изложение шага в яму. Если вы хотите узнать конкретную функцию и использование каждого компонента, рекомендуется искать соответствующую информацию
Краткое описание процесса
Общий обзор того, что делать
-
Заменить изображение (если нужно)
-
Отредактируйте файл yaml
-
Развертывание promethues, grafana, alertManager, node-exporter (можно пакетное развертывание)
-
Сохранение данных, корректировка конфигурации
О кубе-прометее
Prometheus — очень популярный сервис мониторинга, но ему нужно делать много интерфейсов для мониторинга k8s, что усложняет мониторинг K8s prometheus, а официальный релизkube-prometheus
Такой проект естьPrometheus Operator
Настраиваемая версия, если мы хотим получить полные индикаторы мониторинга сервиса k8s, рекомендуется использовать метод kube-prometheus.
Здесь нам нужно расширить две концепции Jsonnet и CRD. Благодаря введению официальных документов мы знаем, что kube-prometheus может модифицировать настраиваемые сервисы через Jsonnet, но, как правило, в этом нет необходимости. Это для студентов, которые хотят изменить исходный код. И CRD — это расширение ресурсов kuberneters (лично, хотя CRD много упоминается в облаке, у него есть определенная стоимость обучения, и в настоящее время он не очень полезен)
О версии
Мы искали prometheus через github и обнаружили, что существует множество версий
Полагаю, что все знакомы с версией под репозиторием Prometheus.В то время я искал в Интернете и нашел, что он также был развернут с использованием этого репозитория, но позже обнаружил, что с этим развертыванием возникла проблема. следите за k8s, вы найдете множество индикаторов. Нет, в основном некоторые индикаторы процессора и памяти, например, вы хотите знать состояние контейнера, а другие индикаторы недоступны.
Сначала я думал, что версия слишком низкая, позже, после того, как я обновил версию, я обнаружил, что индикаторов слишком много, но ключевых данных по-прежнему нет.
Позже я узнал, что есть еще склад prometheus-operator, название явно для мониторинга kubernetes.
Репозиторий разделен на две версииPrometheus Operator
а такжеkube-prometheus
Это оригинальное сравнение
Prometheus Operator vs. kube-prometheus vs. community helm chart
The Prometheus Operator uses Kubernetes custom resources to simplifiy the deployment and configuration of Prometheus, Alertmanager, and related monitoring components.
kube-prometheus provides example configurations for a complete cluster monitoring stack based on Prometheus and the Prometheus Operator. This includes deployment of multiple Prometheus and Alertmanager instances, metrics exporters such as the node_exporter for gathering node metrics, scrape target configuration linking Prometheus to various metrics endpoints, and example alerting rules for notification of potential issues in the cluster.
The stable/prometheus-operator helm chart provides a similar feature set to kube-prometheus. This chart is maintained by the Helm community. For more information, please see the chart's readme
Затем мы должны использовать kube-prometheus для развертывания, kube-prometheus — это настройка Prometheus Operator, которая предоставляет множество конфигураций по умолчанию, которые можно использовать напрямую.
Jsonnet
Jsonnet — это специальный язык конфигурации, который помогает вам определять данные JSON. Jsonnet может работать с элементами в структурах JSON так же, как механизмы шаблонов приносят пользу простому тексту.
// Jsonnet Example
{
person1: {
name: "Alice",
welcome: "Hello " + self.name + "!",
},
person2: self.person1 { name: "Bob" },
}
Преобразование, скомпилированное в JSON, выглядит следующим образом:
{
"person1": {
"name": "Alice",
"welcome": "Hello Alice!"
},
"person2": {
"name": "Bob",
"welcome": "Hello Bob!"
}
}
Официальное заявление: рекомендуется использовать Jsonnet для улучшения JSON. Jsonnet полностью обратно совместим с JSON и вводит множество новых эффектов, таких как комментарии, ссылки, арифметические операции, условные операторы, включение массивов и объектов, импорт, функции, локальные переменные, наследование и т. д.
Я лично считаю, что это слишком сложно.
Kubernetes Custom Resources
Пользовательские ресурсы, в kubernetes мы используем ресурсы для обобщения различных вещей, развернутых в кластере, например, развертывание — это ресурс.
При объявлении такого ресурса, как развертывание, существует вид конфигурации, указывающий тип ресурса.
apiVersion: apps/v1
kind: Deployment
Пользовательские ресурсы Kubernetes используются для пользовательских ресурсов и могут быть расширены до k8s, но это относительно сложная тема, и она полезна в Prometheus-operator.
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
Он будет определять некоторые файлы yaml, такие как CustomResourceDefinition, поэтому, когда мы увидим, что этот тип не является знакомым, он, вероятно, будет расширен.
Поскольку он обычно не используется, он не будет расширяться.Официальная ссылка
Это особенное. IO/это/документы/он сказал...
регулировка зеркала
Поскольку серверная среда должна заменить зеркало, вот зеркала и расположение файлов, которые необходимо настроить для удобства поиска.
quay.io/prometheus/alertmanager
quay.io/prometheus/node-exporter:v0.18.1
quay.io/prometheus/prometheus
grafana/grafana:6.4.3
quay.io/coreos/kube-rbac-proxy:v0.4.1
quay.io/coreos/kube-state-metrics:v1.8.0
quay.io/coreos/k8s-prometheus-adapter-amd64:v0.5.0
quay.io/coreos/prometheus-operator:v0.34.0
quay.io/coreos/prometheus-config-reloader:v0.34.0
quay.io/coreos/configmap-reload:v0.0.1
alertmanager-alertmanager.yaml
my-register/quay.io/prometheus/alertmanager
grafana-deployment.yaml
my-register/grafana/grafana:6.4.3
kube-state-metrics-deployment.yaml
my-register/quay.io/coreos/kube-rbac-proxy:v0.4.1
my-register/quay.io/coreos/kube-state-metrics:v1.8.0
node-exporter-daemonset.yaml
my-register/quay.io/prometheus/node-exporter:v0.18.1
my-register/quay.io/coreos/kube-rbac-proxy:v0.4.1
prometheus-adapter-deployment.yaml
my-register/quay.io/coreos/k8s-prometheus-adapter-amd64:v0.5.0
prometheus-prometheus.yaml
my-register/quay.io/prometheus/prometheus
prometheus-operator-deployment.yaml
my-register/quay.io/coreos/prometheus-operator:v0.34.0
my-register/quay.io/coreos/prometheus-config-reloader:v0.34.0
my-register/quay.io/coreos/configmap-reload:v0.0.1
k8s и сравнение версий
kube-prometheus stack | Kubernetes 1.14 | Kubernetes 1.15 | Kubernetes 1.16 | Kubernetes 1.17 | Kubernetes 1.18 | Kubernetes 1.19 |
---|---|---|---|---|---|---|
release-0.3 |
✔ | ✔ | ✔ | ✔ | ✗ | ✗ |
release-0.4 |
✗ | ✗ | ✔ (v1.16.5+) | ✔ | ✗ | ✗ |
release-0.5 |
✗ | ✗ | ✗ | ✗ | ✔ | ✗ |
release-0.6 |
✗ | ✗ | ✗ | ✗ | ✔ | ✗ |
HEAD |
✗ | ✗ | ✗ | ✗ | ✔ | ✗ |
По сравнению с версиями k8s принята версия release-0.3.
Развернуть и удалить
Обратитесь к официальной документации для развертывания
# Create the namespace and CRDs, and then wait for them to be availble before creating the remaining resources
kubectl create -f manifests/setup
until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done
kubectl create -f manifests/
удалить
kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup
настройка yaml
Поскольку официальный файл является базовой версией, нам также необходимо настроить и изменить его.
Добавить монитор коллекции
Страница интерфейса Prometheus Targets обнаружит, что эти 2 задачи не собраны
monitoring/kube-controller-manager
monitoring/kube-scheduler
Про мониторинг реализуется ресурсным объектом типа ServiceMonitor, найдите yaml относящийся к этим двум
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
k8s-app: kube-controller-manager
name: kube-controller-manager
namespace: monitoring
spec:
endpoints:
- interval: 30s
metricRelabelings:
- action: drop
regex: etcd_(debugging|disk|request|server).*
sourceLabels:
- __name__
port: http-metrics
jobLabel: k8s-app
namespaceSelector:
matchNames:
- kube-system
selector:
matchLabels:
k8s-app: kube-controller-manager
Например, kube-controller-manager находит, что нужно найти соответствующий сервис, но ниже kube-system нет.k8s-app: kube-controller-manager
Этот тег соответствует ресурсу, поэтому мы должны создать его сами.
prometheus-KubeControllerManagerService.yaml
apiVersion: v1
kind: Service
metadata:
namespace: kube-system
name: kube-controller-manager
labels:
k8s-app: kube-controller-manager
spec:
# 使用了selector不需要指定 endpoints
selector:
component: kube-controller-manager
ports:
- name: https-metrics
port: 10252
targetPort: 10252
protocol: TCP
---
# apiVersion: v1
# kind: Endpoints
# metadata:
# labels:
# k8s-app: kube-controller-manager
# name: kube-controller-manager
# namespace: kube-system
# subsets:
# - addresses:
# - ip: 10.90.xx.170
# - ip: 10.90.xx.171
# - ip: 10.90.xx.172
# ports:
# - name: https-metrics
# port: 10252
# protocol: TCP
prometheus-kubeSchedulerService.yaml
apiVersion: v1
kind: Service
metadata:
namespace: kube-system
name: kube-scheduler
labels:
k8s-app: kube-scheduler
spec:
# 使用了selector不需要指定 endpoints
selector:
component: kube-scheduler
ports:
- name: http-metrics
port: 10251
targetPort: 10251
protocol: TCP
---
# apiVersion: v1
# kind: Endpoints
# metadata:
# labels:
# k8s-app: kube-scheduler
# name: kube-scheduler
# namespace: kube-system
# subsets:
# - addresses:
# - ip: 10.90.xx.170
# - ip: 10.90.xx.171
# - ip: 10.90.xx.172
# ports:
# - name: http-metrics
# port: 10251
# protocol: TCP
После добавления этих двух сервисов задачи по сбору prometheus идут нормально.
Настройка сервисного порта
По умолчанию доступ к нему осуществляется через внутренний порт, официальная демонстрация — через прокси, а для продакшена — обычно через NodePort или Ingress.
Используя NodePort, настройте следующие файлы
alertmanager-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
alertmanager: main
name: alertmanager-main
namespace: monitoring
spec:
type: NodePort # 类型改为 NodePort
ports:
- name: web
port: 9093
targetPort: web
nodePort: 30300 # 增加 nodPort 端口
selector:
alertmanager: main
app: alertmanager
sessionAffinity: ClientIP
vim grafana-service.yaml # 修改同上
vim prometheus-service.yaml # 修改同上
сохранение данных
Официальный метод развертывания по умолчанию не является сохранением данных, если есть соответствующие требования, нам нужно изменить его самостоятельно.
prometheus
Официальное использование StorageClass для сохранения
Здесь можно расширитьpv
pvc
storageClass
различия и понятия. Обратитесь к этому сообщению в блогеблог woo woo woo.cn на.com/RexChenY/Afraid/…
В общем, использовать StorageClass непросто, для этого требуется служба nfs, служба плагинов nfs (предоставление kubernetes для динамического создания pvc, возможности ПК)
Сначала нам нужно подготовить службу nfs, а затем обратиться к официальному способу развертывания подключаемой службы.GitHub.com/Kupuer особенный -…
Определить StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: prometheus-data-db
provisioner: 填写插件服务名称
Таким образом, мы можем указать хранилище в объекте пользовательского ресурса prometheus.
storage:
volumeClaimTemplate:
spec:
storageClassName: prometheus-data-db
resources:
requests:
storage: 100Gi
После завершения модификации автоматически создадутся обновления prometheus-prometheus.yaml, pv и pvc, это роль StorageClass
Время сохранения данных Kube-Prometheus черезretention
параметры для реализации
Другие ссылки на конфигурацию:GitHub.com/основная ОС/пром…
grafana
Grafana относительно проста, определите pv и pvc
apiVersion: v1
kind: PersistentVolume
metadata:
name: grafana
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 10.90.xx.xx
path: /home/k8s/grafana
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana
namespace: monitoring
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
Изменить монтирование развертывания
volumes:
- name: grafana-storage
persistentVolumeClaim:
claimName: grafana
# - emptyDir: {}
# name: grafana-storage
Конфигурация тревоги
Из-за использования CRD конфигурация prometheus-kube отличается от традиционного файла yaml.
Разница между prometheus-operator и прямым развертыванием prometheus заключается в том, что оператор настраивает prometheus, сервер alertmanager и конфигурацию scape, запись/предупреждение правило упаковано как CRD в k8s, мы можем просматривать пользовательские объекты ресурсов с помощью команд
[root@k8s-master1 ~]# kubectl get crd | grep monitoring
alertmanagers.monitoring.coreos.com 2020-08-25T03:16:26Z
podmonitors.monitoring.coreos.com 2020-08-25T03:16:26Z
prometheuses.monitoring.coreos.com 2020-08-25T03:16:26Z
prometheusrules.monitoring.coreos.com 2020-08-25T03:16:26Z
servicemonitors.monitoring.coreos.com 2020-08-25T03:16:26Z
В модулях prometheus и alertmanager есть контейнеры, которые отслеживают configmap/secrets.Если смонтированный файл конфигурации изменен (для k8s требуется около 1 минуты для синхронизации configmap), серверный процесс перезагрузит файл конфигурации.
Файл конфигурации предупреждений находится в файле alertmanager-secret.yaml, зашифрованном с помощью base64.
Таким образом, чтобы настроить конфигурацию сигнализации, измените этот файл.
Он может быть опубликован в открытом виде или зашифрован в base64. Процесс настройки таким образом соответствует обычному файлу yaml.
Если вы хотите добавить правило оповещения, измените его./prometheus-rules.yaml
Этот файл может
apiVersion: v1
data: {}
kind: Secret
metadata:
name: alertmanager-main
namespace: monitoring
stringData:
alertmanager.yaml: |-
global:
resolve_timeout: 1m # 处理超时时间,超过这个时间未处理,会标记为resolved(已解决)
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://xxx/xx/sw/prometheus'
route:
group_by: # 分组标签从自定义标签中选择,也可以从原始数据的标签中选择
- job
group_interval: 10s
group_wait: 30s
receiver: 'web.hook'
repeat_interval: 50s
# routes:
# - match:
# alertname: Watchdog
# receiver: null
# route:
# group_interval: 1m # 在发送新警报前的等待时间(针对同一个分组的等待间隔)
# group_wait: 10s # 最初即第一次等待多久时间发送一组警报的通知(这可以把多条数据合并到一个分组里面,具体合并多少由这个时间间隔决定)
# receiver: Default # 接收对象
# repeat_interval: 1m # 发送重复警报的周期
type: Opaque
конфигурация диспетчера предупреждений
Конфигурация Alertmanager в основном состоит из двух частей: маршрута и получателя. Некоторая информация о тревоге будет поступать в дерево маршрутизации из маршрута верхнего уровня в конфигурации, и информация о тревоге будет отправлена соответствующему получателю в соответствии с правилами маршрутизации. Подмаршруты: Вся информация о тревогах начинается с маршрута верхнего уровня, поступает в разные подмаршруты в соответствии с правилами сопоставления меток и отправляет тревоги в соответствии с получателями, установленными подмаршрутами. Набор получателей может быть определен в Alertmanager, например, несколько получателей могут быть разделены в соответствии с ролями (такими как эксплуатация и обслуживание системы, администратор базы данных). Получатели могут связать электронную почту, Slack и другие способы получения предупреждений.
конфигурация диспетчера предупреждений
全局配置(global):用于定义一些全局的公共参数,如全局的SMTP配置,Slack配置等内容,有几个默认参数,如果不覆盖会用默认的;
模板(templates):用于定义告警通知时的模板,如HTML模板,邮件模板等;
告警路由(route):根据标签匹配,确定当前告警应该如何处理;
接收人(receivers):接收人是一个抽象的概念,它可以是一个邮箱也可以是微信,Slack或者Webhook等,接收人一般配合告警路由使用;
抑制规则(inhibit_rules):合理设置抑制规则可以减少垃圾告警的产生
Что следует отметить в глобальной конфигурации, так это resolve_timeout, который определяет, как долго Alertmanager не получал сигнал тревоги в течение длительного времени, и помечает статус сигнала тревоги как разрешенный (разрешенный). Определение этого параметра может повлиять на время получения уведомления об устранении тревоги.Читатели могут определить его в соответствии со своими реальными сценариями.Значение по умолчанию 5 минут.
Конфигурация маршрутизации, как правило, более сложная и требует подмаршрутизации.Проще говоря, разные аварийные сигналы могут быть распределены по разным получателям. Если уведомление о тревоге было успешно отправлено, если вы хотите установить время ожидания перед отправкой уведомления о тревоге, вы можете установить его через параметр repeat_interval.
Настройка алертов в prometheus
alert:告警规则的名称。
expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。
for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。
labels:自定义标签,允许用户指定要附加到告警上的一组附加标签,在接收数据的时候,可以把原生告警中的标签数据也取出来
annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager(在利用Java DTO接收数据的时候,annotations这个对象的成员变量就必须定义好,否则无法解析数据,可以通过内置的占位符替换变量,可以获取到原始数据的标签内容)
Расчетный период тревоги по умолчанию составляет 1 минуту.
Состояние тревоги:
Когда правило генерирует тревогу, если есть два условия, которые соответствуют условиям, активная страница будет записана как 2. В это время эти активные тревоги будут находиться в следующих двух состояниях.
pending: тревога сгенерирована, войти в это состояние, но тревога еще не отправлена
срабатывание: есть время ожидания для будильника, при условии, что оно составляет 1 минуту, это означает, что будильник продолжается в течение 1 минуты, он перейдет в состояние срабатывания и отправит сигнал тревоги
Встроенные правила предупреждений
Объясните несколько часто используемых правил оповещения
Служба сторожевого таймера, сигнал тревоги был в состоянии тревоги
KubeContainerWaiting Получить контейнер в состоянии ожидания
Развертывание KubeDeploymentGenerationMismatch завершилось неудачно, но не было успешно отменено
KubeDeploymentReplicasMismatch Количество реплик не совпадает
Контейнер KubePodCrashLooping находится в цикле перезапуска
Модуль KubePodNotReady не находится в состоянии готовности
KubeClientErrors Ошибка клиента сервера API k8s
CPUThrottlingHigh
Служба контроллера KubeControllerManagerDown не работает
Узел KubeNodeNotReady не перешел в состояние готовности
Узел KubeNodeUnreachable недоступен
KubeletDown Служба Kubelet не работает
Служба планирования KubeSchedulerDown не работает
Суммировать
-
Для контейнерного мониторинга k8s вы можете найти использование prometheuses путем поиска информации, но в основном используется официальная версия, можно отслеживать только часть данных, а для полной возможности мониторинга необходимо использовать проект prometheuses-kube.
-
prometheuses-kube GitHub имеет подробную инструкцию по использованию, и вы можете развернуть его прямо из исходного кода клона, но некоторые вещи отсутствуют, вам нужно вручную настроить его самостоятельно
-
Исходный код prometheuses-kube написан с использованием Jsonnet, под которым понимается расширенный программируемый язык json, нам не нужно обращать на это внимание
-
Поскольку prometheuses-kube использует метод CRD, изменение конфигурации больше не является традиционным объектом файла yaml.Согласно официальному заявлению, вы можете настроить сигнал тревоги и другие конфигурации, изменив его.
-
Если вам нужна сохраняемость данных, вам также необходимо подготовить службы хранения, такие как файловые системы.Prometheuses использует класс хранения.Как правило, все используют nfs, и вам необходимо развернуть подключаемые службы для их использования. Поскольку grafana развертывается с помощью традиционного развертывания, вы можете напрямую монтировать pvc (если вы используете облачные серверы, такие как Alibaba Cloud, услуги хранения файлов обычно предоставляются, но те, которые необходимо отслеживать, обычно предоставляются компаниями, предоставляющими облачные услуги самостоятельно).
Ссылаться на
фин О.Л. О. О /2019/12/Ку волна…