Эта статья относится к серии мониторинга k8s, остальные статьи:
- мониторинг k8s (1) Установить Prometheus
- Мониторинг k8s (2) Мониторинг компонентов и модулей кластера
- k8s мониторинг (4) мониторинг хоста
Планировалось, что в этой статье будет рассказано о grafana и alertmanager, но из-за того, что их слишком легко развернуть, нет мотивации писать. В последнее время из-за исследования адаптера Prometheus, хочу записать результаты своих исследований, может в следующем напишу grafana и alertmanager. .
хорошо, давайте сразу к тексту.
kubernetes apiserver предоставляет два API для мониторинга операций, связанных с метриками:
-
resource metrics API: предназначен для предоставления показателей мониторинга основным компонентам k8s, таким как
kubectl top
; - custom metrics API: предназначен для предоставления метрик контроллеру HPA.
kubernetes apiserver используется для предоставления функций kubernetes через restapi для использования другими компонентами, но он предоставляет основные функции. Некоторые функции полезные, но неосновные, что если apiserver должен предоставлять такие функции?
Учитывая эту ситуацию, аписервер kubernetes предоставляет соответствующий апи, но для запроса, дошедшего до этого апи, не обрабатывает его, а перенаправляет на расширенный аписервер. Интересно, что это расширение apiserver может быть разработано кем угодно, если оно соответствует спецификации.
Когда пользователи используют расширенный apiserver, им нужно только зарегистрировать его в kube-aggregator (функция apiserver kubernetes), и агрегатор перенаправит запрос на этот api на этот расширенный apiserver. Конечно, взаимодействие между API-сервером kubernetes и расширенным API-сервером включает в себя множество деталей, поэтому я не буду упоминать об этом здесь.
API метрик ресурсов и API пользовательских метрик являются такими примерами. Kubernetes apiserver предоставляет эти два API, но конкретная реализация не имеет значения.
И цель этой статьи — реализовать их через адаптер Prometheus.
группа API и версия API
Прежде чем внедрять эти два API, давайте поговорим о группах API и версиях API.
Так называемая группа API — это то, что вы выполняетеkubectl api-versions
Возникновение значений, состоящих из группы API и версии API.
# kubectl api-versions
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
...
Их слишком много, здесь перечислены только 5. При первом поступлении регистрация.k8s.io/v1beta1,admissionregistration.k8s.io
группа API,v1beta1
Указывает свою версию.
Если группа API пуста, это означает основной API, а ресурсы kubernetes предоставляются группой API. Так как же узнать, какие ресурсы предоставляются какими группами API?
воплощать в жизньkubectl api-resources
Вы сможете узнать:
# kubectl api-resources
NAME SHORTNAMES APIGROUP NAMESPACED KIND
bindings true Binding
componentstatuses cs false ComponentStatus
configmaps cm true ConfigMap
endpoints ep true Endpoints
events ev true Event
limitranges limits true LimitRange
namespaces ns false Namespace
nodes no false Node
...
Контента много, здесь перечислены лишь немногие. Вывод - 5 столбцов,NAME
Столбец — это имя ресурса, и его функция определяетсяAPIGROUP
Группа API для столбца предоставляет.SHORTNAMES
Столбцы — это аббревиатуры для этих ресурсов, а аббревиатуры очень полезны при использовании kubectl.
Из всех результатов, перечисленных выше,APIGROUP
Все пустые, что указывает на то, что эти ресурсы предоставляются основным API. Когда вы видите какую-то роль или clusterRole вapiGroup
значение""
Когда , вы должны знать, что все ресурсы, к которым он хочет получить доступ, предоставляются основным API.
Для двух API, которые мы хотим реализовать:
- Группа API для API метрик ресурсов:
metrics.k8s.io
, версия естьv1beta1
; - Группа API для пользовательского API метрик:
custom.metrics.k8s.io
, версия естьv1beta1
.
Их группа API и версия API будут использоваться позже для регистрации.
custom metrics API
Давайте сначала поговорим об API пользовательских метрик, а API метрик ресурсов будет размещено позже. Если вы говорите, что вам нужен только API метрик ресурсов, то вы должны посмотреть и на него, потому что оба API реализуются адаптером Prometheus.
API пользовательских метрик полностью подготовлен для HPA v2, потому что v1 может использовать ЦП только в качестве индикатора для горизонтального масштабирования подов, что явно не может удовлетворить потребности пользователей.
Существует несколько реализаций пользовательского API метрик, мы выбрали адаптер Prometheus, потому что у нас уже установлен Prometheus. С адаптером Prometheus, поскольку индикаторы, существующие в Prometheus, можно использовать в качестве условий для HPA, он может удовлетворить все сценарии использования.
В kubernetes 1.14 API-сервер включил уровень агрегации, поэтому нам нужно только установить адаптер Prometheus.
Мы развернем адаптер Prometheus с помощью развертывания и, конечно же, привяжем различные роли к сервисному аккаунту, который его запустил. Поскольку это сам apiserver, он будет прослушивать порт и предоставлять HTTP-сервисы внешнему миру.
Также нам нужно создать для него сервис, когда kubernetes apiserver перенаправит запрос, он отправит запрос в сервис и через сервис доберется до адаптера Prometheus.
Все файлы yml в этой статье сохранены вGitHub, здесь не указан. Файлы, относящиеся к адаптеру Prometheus, находятся в каталоге адаптера. Файлы, используемые API пользовательских метрик:
prometheus-adapter-apiServiceCustomMetrics.yml
prometheus-adapter-apiServiceMetrics.yml
prometheus-adapter-clusterRoleAggregatedMetricsReader.yml
prometheus-adapter-clusterRoleBindingDelegator.yml
prometheus-adapter-clusterRoleBinding.yml
prometheus-adapter-clusterRole.yml
prometheus-adapter-configMap.yml
prometheus-adapter-deployment.yml
prometheus-adapter-roleBindingAuthReader.yml
prometheus-adapter-serviceAccount.yml
prometheus-adapter-service.yml
в:
- apiServiceCustomMetrics: используется для предоставления API регистрации, группа API
custom.metrics.k8s.io
, версия естьv1beta1
; - apiServiceMetrics: используется для предоставления API регистрации, группа API
metrics.k8s.io
, версия естьv1beta1
. Это для показателей ресурсов; - roleBindingAuthReader: позволяет расширенному аписерверу читать configMap для проверки подлинности аписервера kubernetes, это не требует подробного изучения;
- clusterRoleAggregatedMetricsReader: да
metrics.k8s.io
иcustom.metrics.k8s.io
Любой из следующих ресурсов имеет произвольные разрешения; - clusterRoleBindingDelegator: разрешение на привязку, чтобы у адаптера Prometheus было разрешение на отправку запроса SubjectAccessReview на kubernetes apiserver;
- clusterRole: адаптер Prometheus должен получить доступ к ресурсам в кластере;
- configMap: конфигурационный файл адаптера Prometheus, который является одним из ключевых моментов;
- service: kubernetes apiserver сначала отправляет запрос в этот сервис, а затем перенаправляет его в следующий модуль адаптера Prometheus.
Развернуть и протестировать
Многие люди используют ЦС kubernetes для подписи сертификата, а затем используют этот сертификат для предоставления https для адаптера Prometheus. На самом деле в этом нет необходимости, при запуске адаптера Prometheus, если вы не предоставите ему сертификат, он сгенерирует самоподписанный сертификат для предоставления https.
Не имеет значения, является ли этот сертификат доверенным, потому чтоprometheus-adapter-apiServiceCustomMetrics.yml
существует в файлеinsecureSkipTLSVerify: true
этот вариант.
клонировать и развернуть:
git clone https://github.com/maxadd/k8s-prometheus
kubectl apply -f k8s-prometheus/adapter
Проверьте, все ли в порядке с развертыванием, напрямую обратившись к API (возможно, вам придется немного подождать):
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/" | python -mjson.tool
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/monitoring/pods/*/fs_usage_bytes" | python -mjson.tool
Первая команда выводит множество значений, и все они могут использоваться в качестве метрик для HPA. Если вы этого не сделаете, возникнет проблема с развертыванием по причинам, которые будут объяснены позже.
Вторая команда выведет все модули в пространстве имен мониторинга.fs_usage_bytes
Значение метрики, если у вас его нет, то тоже проблема с деплоем.
Потому что я внес некоторые изменения в некоторые индикаторы и метки в Prometheus в своей предыдущей статье об установке Prometheus, поэтому, если вы непосредственно используетеофициальныйконфигурации, то проблема точно будет. Содержимое, связанное с конфигурацией, будет упомянуто ниже.
Кроме того, параметры запуска адаптера Prometheus в-v
Эквивалентно уровню отладки, чем больше значение, тем более подробным будет выходной журнал, максимальное значение равно 10? Но кажется, что этот журнал не имеет никакого эффекта. .
конфигурационный файл
Формат файла конфигурации адаптера Prometheus следующий (потому что он слишком длинный, поэтому часть перехватывается). Он разделен на две части: первая — это правила, используемые для пользовательских метрик, а другая — resourceRules, используемые для метрик. Если вы используете адаптер Prometheus только для HPA, то resourceRules можно не указывать, и наоборот.
Начнем с правила rules.Под этим правилом существует множество операторов запроса.Функция этих операторов запроса состоит в том, чтобы получить как можно больше индикаторов, чтобы эти индикаторы можно было использовать для HPA.
Другими словами, через адаптер Prometheus вы можете использовать любой индикатор в Prometheus для HPA, но предпосылка заключается в том, что вы должны получить его через оператор запроса (включая имя индикатора и его соответствующее значение). То есть, если вам нужно использовать только одну метрику для HPA, вы можете написать только один запрос вместо использования нескольких запросов, как показано ниже.
rules:
- seriesQuery: '{__name__=~"^container_.*",container_name!="POD",namespace!="",pod!=""}'
seriesFilters: []
resources:
overrides:
namespace:
resource: namespace
pod: # 官方示例中的这个值为 pod_name,由于我之前将 pod_name 改为了 pod,所以这里也为 pod
resource: pods
name:
matches: ^container_(.*)_seconds_total$
as: ""
metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>,container_name!="POD"}[1m])) by (<<.GroupBy>>)
---
resourceRules:
cpu:
containerQuery: sum(rate(container_cpu_usage_seconds_total{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)
nodeQuery: sum(rate(container_cpu_usage_seconds_total{<<.LabelMatchers>>, id='/'}[1m])) by (<<.GroupBy>>)
resources:
overrides:
instance:
resource: nodes
namespace:
resource: namespace
pod:
resource: pods
containerLabel: container_name
Далее мы объясним его ключевые слова:
- seriesQuery: оператор запроса Prometheus, все индикаторы, запрошенные с помощью этого оператора запроса, могут использоваться для HPA;
- seriesFilters: запрошенные индикаторы могут быть ненужными и могут быть отфильтрованы. Существует два способа фильтрации:
-
is: <regex>
: Получить только имя индикатора, соответствующее регулярному выражению; -
isNot: <regex>
:
-
- ресурсы: единственное, что запрашивается с помощью seriesQuery, — это индекс. Если я хочу запросить индекс модуля, я должен запросить его имя и пространство имен, в котором он расположен, в качестве метки индекса. Ресурсы — это связать метку модуля. index с типом ресурса k8s. Наиболее часто используемые — это pod'ы и пространства имен. Есть два способа добавить теги, один из них
overrides
, другойtemplate
.- overrides: связывает теги в метриках с ресурсами k8s. В приведенном выше примере метки пода и пространства имен в индикаторе связаны с подами в k8s (и подами, и подами, что совпадает с вашим kubectl get pod/pods) и пространствами имен, поскольку поды и пространства имен принадлежат основному API. group, так что нет необходимости указывать группу API. Когда вы запрашиваете метрики модуля, он автоматически добавит имя модуля и пространство имен в качестве метки к критериям запроса;
-
microservice: {group: "apps", resource: "deployment"}
Это означает связать метку микросервиса в индикаторе с ресурсом развертывания в группе приложений API;
-
- шаблон: в виде шаблона go.
-
template: "kube_<<.Group>>_<<.Resource>>"
Написано так, если<<.Group>>
для приложений,<<.Resource>>
развертывание, то это показательkube_apps_deployment
Метки связаны с ресурсами развертывания;
-
- overrides: связывает теги в метриках с ресурсами k8s. В приведенном выше примере метки пода и пространства имен в индикаторе связаны с подами в k8s (и подами, и подами, что совпадает с вашим kubectl get pod/pods) и пространствами имен, поскольку поды и пространства имен принадлежат основному API. group, так что нет необходимости указывать группу API. Когда вы запрашиваете метрики модуля, он автоматически добавит имя модуля и пространство имен в качестве метки к критериям запроса;
- name: используется для переименования индикатора. Причина переименования метрик заключается в том, что некоторые метрики являются только добавочными, например, метрики, оканчивающиеся на итог. Использовать эти индикаторы как HPA бессмысленно, мы вообще рассчитываем его скорость и используем скорость как значение, тогда название в это время не может заканчиваться на total, поэтому его нужно переименовать.
- совпадения: Сопоставьте имя индикатора с помощью регулярного выражения, которое можно сгруппировать;
- как: значение по умолчанию
$1
, это первая группа. пустой означает использовать значение по умолчанию.
- metricsQuery: это для запроса Prometheus, предыдущий запрос seriesQuery предназначен для получения метрик HPA. Когда мы хотим проверить значение индикатора, нам нужно использовать указанный им оператор запроса. Видно, что оператор запроса использует скорость и группировку, что должно решить проблему добавления только индикаторов, упомянутых выше, а также использует шаблоны.
- Серия: название индикатора;
- LabelMatchers: дополнительные метки, в настоящее время только pod и пространство имен, поэтому нам нужно использовать ресурсы для связывания;
- GroupBy: это имя пода, которое также необходимо связать с ресурсами.
доступ спереди/apis/custom.metrics.k8s.io/v1beta1/
Все индикаторы, которые появляются, в этих правилах опрашивается с помощью seriesQuery.Конечно, имена могут быть не совсем такими, как в Prometheus, потому что имя используется здесь для переименования.
На самом деле нет необходимости использовать много индикаторов для HPA, таких как индикаторы самого Prometheus и индикаторы компонентов k8s, но адаптер Prometheus определенно хочет выставить все индикаторы, чтобы вы могли использовать все, что хотите, поэтому его seriesQuery будет столько.
доступ/apis/custom.metrics.k8s.io/v1beta1/namespaces/monitoring/pods/*/fs_usage_bytes
Это запрос через metricsQuery для получения значения метрики каждого модуля.
Большинство проблем с деплойментом в том, что ассоциация в конфигурационном файле сделана плохо.Только поняв смысл этого конфигурационного файла можно гарантировать безпроблемное деплоймент.
Остальные правила resourceRules используются для метрик ресурсов, есть только два атрибута, cpu и memory, которые делятся на node и pod, которые легко понять. при исполненииkubectl top pods/nodes
Эти два оператора запроса выполняются.
На этом пользовательские метрики заканчиваются, и содержание HPA здесь не рассматривается.
resource metrics API
Официальное заявление API метрик ресурсов состоит в том, чтобы предоставить индикаторы мониторинга для основных компонентов k8s, но он предоставляет только индикаторы ЦП и памяти модулей и узлов, и его функции действительно ограничены.
Официально указано, что он может выполнять следующие работы:
- HPA: для HPA можно использовать показатели ЦП. Версия HPA v1 может зависеть от этого, сейчас это не имеет значения;
- Планирование подов: официальное значение состоит в том, что это расширенная функция, потому что текущее планирование подов вообще не учитывает использование узлов;
- Кластерная федерация: то же использование ресурсов, но не используется сейчас;
- Dashboard: Drawing, я никогда не пользовался дашбордом и не знаю, насколько он эффективен;
- kubectl top: это самая практичная функция.
Подводя итог, можно сказать, что самая большая роль API ресурсных метрик заключается в том, что он позволяет вам использоватьkubectl top
Заказ? Конечно, нам все равно, полезно это или нет, одна из наших целей — развернуть расширенный аписервер для его реализации, а следующим шагом будет выбор расширенного аписервера.
многие люди будут использоватьmetrics serverПредоставьте API метрик ресурсов, а затем используйтеPrometheus adapterПредоставляет API пользовательских метрик. Но на самом деле адаптер Prometheus может полностью поддерживать эти два API, поэтому нам вообще не нужен сервер метрик, достаточно развернуть один адаптер Prometheus.
Мы на самом деле развернули его ранее, просто нужно проверить его.
# kubectl -n monitoring top pods
NAME CPU(cores) MEMORY(bytes)
alertmanager-c8d754fbc-2slzr 1m 15Mi
grafana-74bf6c49f6-lf7vw 7m 50Mi
kube-state-metrics-856448748c-xtdxl 0m 24Mi
prometheus-adapter-548c9b9c4c-mr9zq 0m 39Mi
но выполнитьkubectl top node
Будет проблема, потому что я будуid='/'
Индикаторы были удалены, если вы не хотите восстанавливать эти индикаторы, вы можете прочитать мою следующую статью о сборе индикаторов хоста.
Вот и все для этой статьи, спасибо за прочтение, спасибо!