kubectl top: CPU и память прямо сейчас
Откуда kubectl top берёт цифры, как читать милликоры и почему без metrics-server команда не работает.
Что такое kubectl top
kubectl - командная утилита для управления Kubernetes. Команда
kubectl top показывает текущее потребление CPU и памяти по Pod и
нодам. Pod - наименьшая единица запуска, внутри неё работает
контейнер. Нода - машина кластера, на которой запускаются Pod.
kubectl top даёт только снимок на текущий момент. Здесь нет
графиков, истории и агрегаций. Это самый быстрый способ ответить на
вопрос «кто ест память» или «насколько загружена нода».
Сам kubectl ничего не считает. Он делает GET в Kubernetes API по
пути /apis/metrics.k8s.io/v1beta1/ и форматирует ответ. За этим
путём стоит metrics-server. metrics-server - компонент, который
собирает текущие метрики ресурсов в кластере.
kubectl top
└─> metrics-server раз в 15с
└─> kubelet /metrics/resource
metrics-server раз в 15 секунд опрашивает kubelet каждой ноды через
endpoint /metrics/resource. kubelet - агент Kubernetes на ноде,
который запускает контейнеры. Он отдаёт суммарное потребление по
контейнерам.
Без metrics-server kubectl top не работает вообще. И это стоит
держать в голове: metrics-server не входит в состав Kubernetes и во
многих кластерах не установлен по умолчанию. Часть дистрибутивов и
managed-провайдеров ставит его сразу, часть оставляет на
администратора. Ошибка error: Metrics API not available на свежем
кластере чаще всего означает именно это, а не поломку. Ставится
компонент отдельным манифестом или чартом из репозитория
kubernetes-sigs/metrics-server.
Основные команды
# Все Pod в текущем namespace.
kubectl top pod
# По всему кластеру.
kubectl top pod -A
# Сортировка.
kubectl top pod --sort-by=cpu
kubectl top pod --sort-by=memory
# Разбивка по контейнерам в Pod.
kubectl top pod --containers
# Ноды.
kubectl top node
kubectl top node --sort-by=cpu
Пустой вывод сразу после установки metrics-server это не поломка. Первый замер он собирает 30-60 секунд.
Флаг --containers нужен на Pod с sidecar. sidecar - вспомогательный
контейнер рядом с основным. С этим флагом видно потребление каждого
контейнера отдельно. Без флага показано суммарное по Pod.
Единицы измерения
CPU считается в милликорах. 100m это 0.1 ядра, 1000m это одно
полное ядро. Та же единица идёт в полях requests и limits,
поэтому значения удобно сравнивать без перевода в проценты.
Память считается в байтах с суффиксом Mi или Gi. 1Gi равно
1024 MiB. Kubernetes использует двоичные префиксы, потому что память
считается в степенях двойки.
В выводе top node есть колонка с процентом. Это доля от
allocatable ноды. allocatable - объём ресурсов ноды, доступный для
Pod. По этому проценту решают, пора ли добавлять ноду.
Прямой доступ к metrics API
# demo здесь - имя namespace, подставляется своё
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/namespaces/demo/pods" | jq
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes" | jq
Это то же, что отдаёт top, но в сыром JSON. Удобно для скриптов и
автоматизации.
Что top не умеет
- Хранить историю. Pod умер, и его метрики пропали. Для трендов нужна база временных рядов, например Prometheus.
- Ловить короткие пики. Замер раз в 15 секунд. Пик на 5 секунд между замерами top не увидит.
- Делить потребление по процессам. Только агрегат по контейнеру.
- Показывать сеть, IOPS (число операций ввода-вывода в секунду), файловую систему. Для этого нужны отдельные экспортёры.
top отвечает на вопрос «что прямо сейчас», а не «что было вчера ночью».
Связь с HPA и requests
metrics-server - основа для HPA по метрикам CPU и памяти. HPA -
контроллер, который меняет число реплик по нагрузке. Он берёт
текущее потребление Pod, делит на requests и получает процент.
requests - объём ресурсов, который Pod запрашивает при старте.
Без requests HPA не работает, потому что делить не на что.
Что часто ломается
error: Metrics API not available. metrics-server не установлен или не запустился. Проверяется командойkubectl get pods -n kube-system | grep metrics. На кластере, где его никто не ставил, это ожидаемый ответ.- metrics-server есть, но не отдаёт. Частая причина - TLS:
kubelet с самоподписанным сертификатом, metrics-server ему не
верит. Лечится флагом
--kubelet-insecure-tls(только для тестовых кластеров: он отключает проверку TLS-сертификата kubelet). В проде нужны нормальные сертификаты. - По top считают бюджет ресурсов. Это снимок, а не среднее. Для планирования берут Prometheus с метриками за неделю.
Коротко
kubectl topпоказывает мгновенное потребление CPU и памяти, без истории и графиков.- Цифры приходят из metrics-server через
/apis/metrics.k8s.io/v1beta1/. - metrics-server не входит в Kubernetes и во многих кластерах не
установлен;
Metrics API not availableв таком случае нормальный ответ, а не поломка. - CPU в милликорах (
1000m= ядро), память вMi/Giс двоичными префиксами. --containersразбивает Pod по контейнерам,--sort-byсортирует вывод.- HPA считает нагрузку как потребление, делённое на
requests, и безrequestsне работает.
Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс