kube-state-metrics (KSM) — это простой сервис, который прослушивает сервер API Kubernetes и генерирует метрики о состоянии объектов. (См. примеры в разделе «Метрики» ниже.) Он ориентирован не на работоспособность отдельных компонентов Kubernetes, а скорее на работоспособность различных объектов внутри, таких как развертывания, узлы и модули.
kube-state-metrics предназначен для генерации метрик из объектов Kubernetes API без изменений. Это гарантирует, что функции, предоставляемые kube-state-metrics, имеют тот же уровень стабильности, что и сами объекты Kubernetes API. В свою очередь, это означает, что метрики kube-state-metrics в определенных ситуациях могут не показывать те же значения, что и kubectl, поскольку kubectl применяет определенные эвристики для отображения понятных сообщений. kube-state-metrics предоставляет немодифицированные необработанные данные из API Kubernetes, таким образом, пользователи имеют все необходимые данные и выполняют эвристику по своему усмотрению.
Метрики экспортируются в конечную точку HTTP /metrics
порта прослушивания (по умолчанию 8080). Они подаются в виде открытого текста. Они предназначены для использования либо самим Prometheus, либо парсером, совместимым со сбором конечной точки клиента Prometheus. Вы также можете открыть /metrics
в браузере, чтобы просмотреть необработанные метрики. Обратите внимание, что метрики, представленные в конечной точке /metrics
отражают текущее состояние кластера Kubernetes. Когда объекты Kubernetes удаляются, они больше не видны в конечной точке /metrics
.
Примечание
Этот README создается на основе шаблона. Пожалуйста, внесите изменения и запустите make generate-template
.
Управление версиями
Версия Кубернетеса
Матрица совместимости
Совместимость версий группы ресурсов
Изображение контейнера
Документация по метрикам
Разрешение конфликтов в именах меток
Kube-state-metrics собственные метрики
Рекомендация ресурса
Задержка
Примечание о стоимости
Kube-state-metrics против метрики-сервера
Масштабирование метрик состояния куба
Автоматизированное шардинг
Рекомендация ресурса
Горизонтальное шардинг
Шардинг Daemonset для метрик модуля
Настраивать
Создание Docker-контейнера
Использование
Развертывание Кубернетеса
Среда с ограниченными привилегиями
Карта руля
Разработка
Вклад разработчиков
Сообщество
kube-state-metrics использует client-go
для взаимодействия с кластерами Kubernetes. Поддерживаемая версия кластера Kubernetes определяется client-go
. Матрицу совместимости для client-go и кластера Kubernetes можно найти здесь. Вся дополнительная совместимость — это только лучшее, или она все еще/уже поддерживается.
Ниже будут записаны максимум 5 релизов kube-state-metrics и 5 kubernetes. Как правило, рекомендуется использовать последнюю версию kube-state-metrics. Если вы используете самую последнюю версию Kubernetes, возможно, вам захочется использовать невыпущенную версию, чтобы иметь полный спектр поддерживаемых ресурсов. Если вы используете более старую версию Kubernetes, вам может потребоваться запустить более старую версию, чтобы иметь полную поддержку всех ресурсов. Имейте в виду, что сопровождающие будут поддерживать только последнюю версию. Более старые версии могут поддерживаться заинтересованными пользователями сообщества.
kube-state-metrics | Клиентская версия Kubernetes |
---|---|
v2.10.1 | v1.27 |
v2.11.0 | v1.28 |
v2.12.0 | v1.29 |
v2.13.0 | v1.30 |
v2.14.0 | v1.31 |
основной | v1.31 |
Ресурсы в Kubernetes могут развиваться, т. е. групповая версия ресурса может меняться с альфа на бета и, наконец, на GA в разных версиях Kubernetes. На данный момент kube-state-metrics будет использовать только самый старый API, доступный в последней версии.
Последний образ контейнера можно найти по адресу:
registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.14.0
/kube-state-metrics/kube-state-metrics:v2.14.0 (архи: amd64
, arm
, arm64
, ppc64le
и s390x
)
Посмотреть все мультиархитектурные изображения можно здесь.
Любые ресурсы и метрики, основанные на альфа-интерфейсах API Kubernetes, исключены из какой-либо гарантии стабильности, которая может быть изменена в любом конкретном выпуске.
Дополнительную информацию об имеющихся метриках см. в каталоге docs
.
Семейство метрик *_labels
представляет метки Kubernetes как метки Prometheus. Поскольку Kubernetes более либерален, чем Prometheus, с точки зрения разрешенных символов в именах меток, мы автоматически преобразуем неподдерживаемые символы в символы подчеркивания. Например, app.kubernetes.io/name
становится label_app_kubernetes_io_name
.
Это преобразование может создать конфликты, когда несколько меток Kubernetes, таких как foo-bar
и foo_bar
будут преобразованы в одну и ту же метку Prometheus label_foo_bar
.
Kube-state-metrics автоматически добавляет суффикс _conflictN
для разрешения этого конфликта, поэтому он преобразует приведенные выше метки в label_foo_bar_conflict1
и label_foo_bar_conflict2
.
Если вы хотите иметь больше контроля над тем, как разрешается этот конфликт, вы можете рассмотреть возможность решения этой проблемы на другом уровне стека, например, путем стандартизации меток Kubernetes с помощью Admission Webhook, который гарантирует отсутствие возможных конфликтов.
kube-state-metrics предоставляет свои собственные общие метрики процесса в --telemetry-host
и --telemetry-port
(8081 по умолчанию).
kube-state-metrics также предоставляет список и отслеживание показателей успеха и ошибок. Их можно использовать для расчета частоты ошибок списка или ресурсов просмотра. Если вы столкнулись с этими ошибками в метриках, скорее всего, это проблема с конфигурацией или разрешениями, и следующее, что нужно изучить, — это просмотреть журналы kube-state-metrics.
Пример вышеупомянутых показателей:
kube_state_metrics_list_total{resource="*v1.Node",result="success"} 1 kube_state_metrics_list_total{resource="*v1.Node",result="error"} 52 kube_state_metrics_watch_total{resource="*v1beta1.Ingress",result="success"} 1
kube-state-metrics также предоставляет некоторые метрики http-запросов, примеры:
http_request_duration_seconds_bucket{handler="metrics",method="get",le="2.5"} 30 http_request_duration_seconds_bucket{handler="metrics",method="get",le="5"} 30 http_request_duration_seconds_bucket{handler="metrics",method="get",le="10"} 30 http_request_duration_seconds_bucket{handler="metrics",method="get",le="+Inf"} 30 http_request_duration_seconds_sum{handler="metrics",method="get"} 0.021113919999999998 http_request_duration_seconds_count{handler="metrics",method="get"} 30
kube-state-metrics также предоставляет метрики сборки и конфигурации:
kube_state_metrics_build_info{branch="main",goversion="go1.15.3",revision="6c9d775d",version="v2.0.0-beta"} 1 kube_state_metrics_shard_ordinal{shard_ordinal="0"} 0 kube_state_metrics_total_shards 1
kube_state_metrics_build_info
используется для предоставления версии и другой информации о сборке. Чтобы узнать больше об использовании информационного шаблона, ознакомьтесь с сообщением в блоге здесь. Метрики сегментирования предоставляют флаги --shard
и --total-shards
и могут использоваться для проверки конфигурации во время выполнения, см /examples/prometheus-alerting-rules
.
kube-state-metrics также предоставляет метрики своего конфигурационного файла и конфигурационного файла Custom Resource State:
kube_state_metrics_config_hash{filename="crs.yml",type="customresourceconfig"} 2.38272279311849e+14 kube_state_metrics_config_hash{filename="config.yml",type="config"} 2.65285922340846e+14 kube_state_metrics_last_config_reload_success_timestamp_seconds{filename="crs.yml",type="customresourceconfig"} 1.6704882592037103e+09 kube_state_metrics_last_config_reload_success_timestamp_seconds{filename="config.yml",type="config"} 1.6704882592035313e+09 kube_state_metrics_last_config_reload_successful{filename="crs.yml",type="customresourceconfig"} 1 kube_state_metrics_last_config_reload_successful{filename="config.yml",type="config"} 1
Использование ресурсов для kube-state-metrics меняется в зависимости от размера объектов Kubernetes (поды/узлы/развертывания/секреты и т. д.) в кластере. В некоторой степени количество объектов Kubernetes в кластере прямо пропорционально номеру узла кластера.
По общему правилу следует выделить:
Память 250 МБ
0,1 ядра
Обратите внимание: если ограничения ЦП установлены слишком низкими, внутренние очереди kube-state-metrics не смогут обрабатываться достаточно быстро, что приводит к увеличению потребления памяти по мере роста длины очереди. Если у вас возникли проблемы, связанные с выделением большого количества памяти или регулированием ЦП, попробуйте увеличить ограничения ЦП.
В тесте масштабирования кластера на 100 узлов показатели задержки были следующими:
"Perc50": 259615384 ns, "Perc90": 475000000 ns, "Perc99": 906666666 ns.
По умолчанию kube-state-metrics предоставляет несколько метрик для событий в вашем кластере. Если в вашем кластере имеется большое количество часто обновляемых ресурсов, вы можете обнаружить, что в эти метрики попадает много данных. Это может повлечь за собой высокие затраты для некоторых облачных провайдеров. Пожалуйста, найдите время, чтобы настроить, какие метрики вы хотите предоставлять, а также ознакомьтесь с документацией для вашей среды Kubernetes, чтобы избежать неожиданно высоких затрат.
Сервер метрик — это проект, вдохновленный Heapster и реализованный для обслуживания основных конвейеров метрик в архитектуре мониторинга Kubernetes. Это компонент уровня кластера, который периодически собирает метрики со всех узлов Kubernetes, обслуживаемых Kubelet, через Metrics API. Метрики агрегируются, сохраняются в памяти и передаются в формате Metrics API. Сервер метрик хранит только самые последние значения и не несет ответственности за пересылку метрик сторонним адресатам.
kube-state-metrics ориентирован на создание совершенно новых метрик из состояния объекта Kubernetes (например, метрик на основе развертываний, наборов реплик и т. д.). Он хранит в памяти полный снимок состояния Kubernetes и постоянно генерирует на его основе новые метрики. И так же, как и сервер метрик, он не несет ответственности за экспорт куда-либо своих метрик.
Вынесение kube-state-metrics в отдельный проект также обеспечивает доступ к этим метрикам из систем мониторинга, таких как Prometheus.
Для горизонтального сегментирования kube-state-metrics были реализованы некоторые возможности автоматического сегментирования. Он настраивается со следующими флагами:
--shard
(нулевой индекс)
--total-shards
Шардинг выполняется путем взятия суммы md5 UID объекта Kubernetes и выполнения над ней операции по модулю с общим количеством шардов. Каждый шард решает, обрабатывается ли объект соответствующим экземпляром kube-state-metrics или нет. Обратите внимание: это означает, что все экземпляры kube-state-metrics, даже если они сегментированы, будут иметь сетевой трафик и потребление ресурсов для демаршалинга всех объектов, а не только тех, за которые они отвечают. Для дальнейшей оптимизации API Kubernetes должен поддерживать возможности сегментированного списка/наблюдения. В оптимальном случае потребление памяти для каждого шарда будет составлять 1/n по сравнению с несегментированной настройкой. Обычно kube-state-metrics требует оптимизации памяти и задержки, чтобы он мог довольно быстро возвращать свои метрики в Prometheus. Один из способов уменьшить задержку между kube-state-metrics и kube-apiserver — запустить KSM с флагом --use-apiserver-cache
. Помимо уменьшения задержки, эта опция также приведет к снижению нагрузки на etcd.
Шардинг следует использовать осторожно, а также необходимо настроить дополнительный мониторинг, чтобы гарантировать, что шардинг настроен и работает должным образом (например, настроены экземпляры для каждого шарда из общего числа шардов).
Автоматическое сегментирование позволяет каждому сегменту определять свою номинальную позицию при развертывании в StatefulSet, что полезно для автоматической настройки сегментирования. Это экспериментальная функция, которая может быть нарушена или удалена без предварительного уведомления.
Чтобы включить автоматическое сегментирование, kube-state-metrics должен быть запущен StatefulSet
, а имя модуля и пространство имен должны быть переданы процессу kube-state-metrics через флаги --pod
и --pod-namespace
. Примеры манифестов, демонстрирующих функциональность автоматического сегментирования, можно найти в /examples/autosharding
.
Этот способ развертывания сегментов полезен, когда вы хотите управлять сегментами KSM с помощью одного ресурса Kubernetes (в данном случае одного StatefulSet
) вместо одного Deployment
на каждый сегмент. Преимущество может быть особенно значительным при развертывании большого количества шардов.
Недостаток использования настройки с автоматическим сегментированием связан со стратегией развертывания, поддерживаемой StatefulSet
s. При управлении StatefulSet
модули заменяются по одному, причем каждый модуль сначала завершается, а затем создается заново. Помимо того, что такое развертывание происходит медленнее, оно также приводит к короткому времени простоя каждого сегмента. Если во время развертывания произойдет очистка Prometheus, он может пропустить некоторые метрики, экспортируемые kube-state-metrics.
Что касается показателей модуля, их можно сегментировать для каждого узла с помощью следующего флага:
--node=$(NODE_NAME)
Каждый модуль kube-state-metrics использует FieldSelector (spec.nodeName) для просмотра/списка метрик модуля только на одном и том же узле.
Пример daemonset kube-state-metrics:
apiVersion: apps/v1 kind: DaemonSet spec: template: spec: containers: - image: registry.k8s.io/kube-state-metrics/kube-state-metrics:IMAGE_TAG name: kube-state-metrics args: - --resource=pods - --node=$(NODE_NAME) env: - name: NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName
Чтобы отслеживать метрики для неназначенных модулей, вам необходимо добавить дополнительное развертывание и установить --track-unscheduled-pods
, как показано в следующем примере:
apiVersion: apps/v1 kind: Deployment spec: template: spec: containers: - image: registry.k8s.io/kube-state-metrics/kube-state-metrics:IMAGE_TAG name: kube-state-metrics args: - --resources=pods - --track-unscheduled-pods
Другие метрики можно сегментировать посредством горизонтального сегментирования.
Установите этот проект в свой $GOPATH
используя go get
:
go get k8s.io/kube-state-metrics
Просто запустите следующую команду в этой корневой папке, которая создаст автономный статически связанный двоичный файл и создаст образ Docker:
make container
Просто создайте и запустите kube-state-metrics внутри модуля Kubernetes, у которого есть токен сервисной учетной записи, который имеет доступ только для чтения к кластеру Kubernetes.
Стек ( kube-prometheus
) устанавливает kube-state-metrics в качестве одного из своих компонентов; вам не нужно устанавливать kube-state-metrics, если вы используете стек kube-prometheus.
Если вы хотите изменить конфигурацию по умолчанию для kube-prometheus, например, чтобы включить метрики, отличные от стандартных, ознакомьтесь с разделом Настройка Kube-Prometheus.
Чтобы развернуть этот проект, вы можете просто запустить kubectl apply -f examples/standard
, и будет создана служба Kubernetes и развертывание. (Примечание. Отрегулируйте apiVersion какого-либо ресурса, если версия вашего кластера Kubernetes не 1.8+, проверьте файл yaml для получения дополнительной информации).
Чтобы Prometheus обнаруживал экземпляры kube-state-metrics, рекомендуется создать специальную конфигурацию очистки Prometheus для kube-state-metrics, которая улавливает обе конечные точки метрик. Обнаружение на основе аннотаций не рекомендуется, поскольку можно будет выбрать только одну из конечных точек, плюс kube-state-metrics в большинстве случаев предъявляет особые требования к аутентификации и авторизации, поскольку по сути предоставляет доступ для чтения через конечную точку метрик к большей части доступной ему информации.
Примечание. Пользователи Google Kubernetes Engine (GKE) — GKE имеет строгие разрешения ролей, которые предотвращают создание ролей kube-state-metrics и привязок ролей. Чтобы обойти эту проблему, вы можете предоставить своему идентификатору GCP роль администратора кластера, выполнив следующую однострочную команду:
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=$(gcloud info --format='value(config.account)')
Обратите внимание, что ваш идентификатор GCP чувствителен к регистру, а gcloud info
начиная с Google Cloud SDK 221.0.0, — нет. Это означает, что если ваш член IAM содержит заглавные буквы, приведенная выше строка может вам не подойти. Если у вас есть 403 запрещенных ответа после выполнения указанной выше команды и kubectl apply -f examples/standard
, проверьте член IAM, связанный с вашей учетной записью, по адресу https://console.cloud.google.com/iam-admin/iam?project=PROJECT_ID. . Если он содержит заглавные буквы, вам может потребоваться установить флаг --user в приведенной выше команде для роли с учетом регистра, указанной на странице https://console.cloud.google.com/iam-admin/iam?project=PROJECT_ID.
Если после выполнения вышеописанного вы увидите Clusterrolebinding "cluster-admin-binding" created
, то вы сможете продолжить настройку этой службы.
Доступны следующие конечные точки проверки работоспособности ( self
относится к порту телеметрии, а main
относится к порту экспозиции):
/healthz
(доступно в main
): возвращает код состояния 200, если приложение запущено. Мы рекомендуем использовать это для пробы запуска.
/livez
(доступно в main
): возвращает код состояния 200, если на приложение не влияет сбой сервера API Kubernetes. Мы рекомендуем использовать это для проверки жизнеспособности.
/readyz
(доступно для self
): возвращает код состояния 200, если приложение готово принимать запросы и предоставлять метрики. Мы рекомендуем использовать это для проверки готовности.
Обратите внимание, что не рекомендуется использовать конечную точку метрик телеметрии для любого зондирования при проксировании данных экспозиции.
Если вы хотите запустить kube-state-metrics в среде, где у вас нет роли чтения кластера, вы можете:
создать сервисную учетную запись
apiVersion: v1kind: ServiceAccountmetadata: имя: kube-state-metrics пространство имен: ваше-пространство-имен, где-kube-state-metrics-будет развернуто
дайте ему права view
в определенных пространствах имен (используя roleBinding) ( примечание: вы можете добавить эту roleBinding ко всем NS, к которым вы хотите, чтобы ваша сервисная учетная запись имела доступ )
apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: name: kube-state-metrics пространство имен: project1roleRef: apiGroup: rbac.authorization.k8s.io вид: ClusterRole имя: просмотретьпредметы: - вид: ServiceAccountname: kube-state-metricsnamespace: your-namespace-where-kube-state-metrics-will-deployed
затем укажите набор пространств имен (используя параметр --namespaces
) и набор объектов kubernetes (используя --resources
), к которым ваш сервисный аккаунт имеет доступ в конфигурации развертывания kube-state-metrics
.
спецификация: шаблон:спецификация: контейнеры: - имя: kube-state-metricsargs: - '--resources=pods' - '--namespaces=project1'
Полный список доступных аргументов см. в документации docs/developer/cli-arguments.md.
Начиная с диаграммы kube-state-metrics v2.13.3
(kube-state-metrics image v1.9.8
), официальная диаграмма Helm поддерживается в prometheus-community/helm-charts. Начиная с диаграммы kube-state-metrics v3.0.0
поддерживаются только изображения kube-state-metrics версии v2.0.0 +
.
При разработке протестируйте дамп метрики на локальном кластере Kubernetes, выполнив:
Пользователи могут переопределить адрес API-сервера в файле KUBE-CONFIG с помощью командной строки
--apiserver
.
go install kube-state-metrics --port=8080 --telemetry-port=8081 --kubeconfig=--apiserver=
Затем сверните конечную точку метрики
curl localhost:8080/metrics
Чтобы запустить тесты e2e локально, см. документацию в файлеtests/README.md.
При разработке необходимо следовать определенным шаблонам кода, чтобы улучшить ваш опыт участия и повысить вероятность прохождения e2e и других тестов ci. Чтобы узнать больше о них, смотрите документацию в docs/developer/guide.md.
Этот проект спонсируется SIG Instrumentation.
В Slack Kubernetes также есть канал #kube-state-metrics.
Вы также можете присоединиться к списку рассылки SIG Instrumentation. Обычно в ваш календарь добавляются приглашения на следующие встречи, на которых можно обсуждать темы, связанные с kube-state-metrics.
Регулярное собрание SIG: четверг в 9:30 по тихоокеанскому времени (раз в две недели). Конвертируйте в свой часовой пояс.
Регулярное собрание по сортировке: четверг в 9:30 по тихоокеанскому времени (раз в две недели, чередующееся с обычным собранием). Конвертируйте в свой часовой пояс.