← Kubernetes: наблюдаемость
6 мин · средне · Урок 2 из 3

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 не умеет

top отвечает на вопрос «что прямо сейчас», а не «что было вчера ночью».

Связь с HPA и requests

metrics-server - основа для HPA по метрикам CPU и памяти. HPA - контроллер, который меняет число реплик по нагрузке. Он берёт текущее потребление Pod, делит на requests и получает процент. requests - объём ресурсов, который Pod запрашивает при старте.

Без requests HPA не работает, потому что делить не на что.

Что часто ломается

Коротко

Прошли материал до конца? Отметьте урок пройденным.