systemd-cgtop 🟢
Top-подобный вид потребления ресурсов по cgroup. Встроен в systemd.
# Интерактивный мониторинг
systemd-cgtop
# С обновлением раз в секунду, по CPU
systemd-cgtop -d 1 --order=cpu
# По памяти
systemd-cgtop --order=memory
# Batch mode для скриптов (5 итераций)
systemd-cgtop -b -n 5
/proc/pressure/* (PSI) 🟢
Pressure Stall Information — встроенный механизм ядра для измерения дефицита ресурсов. Показывает, какой процент времени задачи простаивали в ожидании CPU, памяти или I/O.
# Давление на CPU (some = хотя бы один поток ждёт, full = все ждут)
cat /proc/pressure/cpu
# Давление на память
cat /proc/pressure/memory
# Давление на I/O
cat /proc/pressure/io
# Мониторинг в цикле
watch -n1 'echo "=== CPU ===" && cat /proc/pressure/cpu && echo "=== MEM ===" && cat /proc/pressure/memory && echo "=== IO ===" && cat /proc/pressure/io'
# PSI для конкретного cgroup (контейнера/сервиса)
cat /sys/fs/cgroup/system.slice/docker-<id>.scope/cpu.pressure
avg10 > 10% — заметная деградация. avg10 > 40% — серьёзная проблема.
/sys/fs/cgroup/ 🟢
Прямой доступ к статистике cgroup v2.
# CPU-статистика cgroup
cat /sys/fs/cgroup/system.slice/docker-<id>.scope/cpu.stat
# Использование памяти (current, limit, max)
cat /sys/fs/cgroup/system.slice/docker-<id>.scope/memory.current
cat /sys/fs/cgroup/system.slice/docker-<id>.scope/memory.max
cat /sys/fs/cgroup/system.slice/docker-<id>.scope/memory.stat
# I/O статистика
cat /sys/fs/cgroup/system.slice/docker-<id>.scope/io.stat
# Найти cgroup контейнера по PID
cat /proc/<pid>/cgroup
docker stats 🟢
Потребление ресурсов по контейнерам.
# Все запущенные контейнеры (интерактивно)
docker stats
# Конкретный контейнер, без stream (разовый снимок)
docker stats --no-stream mycontainer
# Кастомный формат
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"
podman stats 🟢
Аналог docker stats для Podman (daemonless).
# Все контейнеры
podman stats
# Разовый снимок
podman stats --no-stream
# По конкретному контейнеру
podman stats --no-stream mycontainer
cAdvisor 🟢
Метрики по контейнерам с экспортом в Prometheus. Работает как сервис.
# Запуск в Docker
docker run -d \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--name=cadvisor \
gcr.io/cadvisor/cadvisor:latest
# UI: http://localhost:8080
# Prometheus endpoint: http://localhost:8080/metrics
# Метрики конкретного контейнера
curl -s http://localhost:8080/api/v1.3/containers/docker/<container_id> | jq .
crictl stats 🟢
Статистика CRI-совместимых рантаймов (containerd, CRI-O).
# Статистика всех контейнеров
crictl stats
# Конкретный контейнер
crictl stats --id <container_id>
# С выводом в JSON
crictl stats -o json
kubectl top 🟢
Метрики ресурсов узлов и подов через Metrics API.
# Утилизация по узлам
kubectl top nodes
# Утилизация по подам в namespace
kubectl top pods -n production
# С разбивкой по контейнерам
kubectl top pods --containers -n production
# Сортировка по CPU
kubectl top pods --sort-by=cpu -n production
# По памяти
kubectl top pods --sort-by=memory -n production
Tetragon 🟢
eBPF security и observability от Cilium. Трассировка процессов, файлов, сети на уровне ядра с K8s-контекстом.
# Установка через Helm
helm install tetragon cilium/tetragon -n kube-system
# CLI: наблюдение за событиями в реальном времени
kubectl exec -n kube-system ds/tetragon -c tetragon -- tetra getevents
# Фильтр по namespace
kubectl exec -n kube-system ds/tetragon -c tetragon -- tetra getevents -n production
# Применить политику трассировки (TracingPolicy)
kubectl apply -f - <<EOF
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: monitor-sensitive-files
spec:
kprobes:
- call: "security_file_open"
args:
- index: 0
type: "file"
selectors:
- matchArgs:
- index: 0
operator: "Prefix"
values: ["/etc/shadow", "/etc/passwd"]
EOF
Inspektor Gadget 🟢
eBPF-гаджеты для отладки K8s. Знакомые BPF-инструменты с автоматическим K8s-контекстом (pod, namespace, container).
# Установка
kubectl gadget deploy
# Гаджеты-образы (основная форма с 0.31): имя гаджета — OCI-образ
kubectl gadget run trace_open:latest -n production
kubectl gadget run trace_tcp:latest -n production
kubectl gadget run trace_dns:latest -n production
# Встроенные гаджеты старой формы ещё работают, но объявлены нежелательными
kubectl gadget trace open -n production
kubectl gadget top block-io -n production
kubectl gadget profile cpu -n production -p mypod
С версии 0.31 гаджеты распространяются как OCI-образы и запускаются через
kubectl gadget run <образ>; встроенные в бинарник гаджеты сохранены ради
совместимости, но их использование в документации не рекомендуется.
Hubble 🟢
eBPF сетевая observability от Cilium. L3/L4/L7 видимость сетевых потоков в K8s.
# CLI: наблюдение за сетевыми потоками
hubble observe
# Фильтр по namespace
hubble observe -n production
# Только dropped пакеты
hubble observe --verdict DROPPED
# Потоки к/от конкретного пода
hubble observe --pod production/frontend
# HTTP-потоки (L7)
hubble observe --protocol http -n production
# Hubble UI (веб-интерфейс)
cilium hubble ui
Kepler 🟢
Энергопотребление K8s-кластера. Использует RAPL + GPU метрики, экспорт в Prometheus.
# Установка
helm install kepler kepler/kepler -n kepler --create-namespace
# Prometheus-метрики
curl -s http://kepler-exporter:9103/metrics | grep kepler_container
# Ключевые метрики:
# kepler_container_joules_total — потребление по контейнерам
# kepler_node_core_joules_total — потребление CPU по узлам
# kepler_node_dram_joules_total — потребление DRAM по узлам
Falco (eBPF) 🟢
Обнаружение угроз в рантайме. CNCF graduated проект.
# Установка через Helm
helm install falco falcosecurity/falco -n falco --create-namespace
# Просмотр алертов
kubectl logs -n falco -l app.kubernetes.io/name=falco -f
# Пример правила: обнаружение shell в контейнере
# (встроено по умолчанию — rule: Terminal shell in container)
# Кастомное правило
kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: falco-custom-rules
namespace: falco
data:
custom-rules.yaml: |
- rule: Write to sensitive directory
desc: Detect writes to /etc in containers
condition: >
container and open_write and fd.directory = /etc
output: >
File write in /etc (user=%user.name command=%proc.cmdline file=%fd.name container=%container.name)
priority: WARNING
EOF
Tracee 🟢
Runtime security через eBPF от Aqua Security.
# Запуск в Docker
docker run --name tracee -d --privileged \
-v /lib/modules:/lib/modules:ro \
-v /usr/src:/usr/src:ro \
aquasec/tracee:latest
# Фильтр по событиям
docker run --rm --privileged aquasec/tracee:latest \
--events openat,execve --scope comm=nginx
# Вывод в JSON
docker run --rm --privileged aquasec/tracee:latest \
--output json --events security_file_open
Parca 🟢
eBPF continuous profiling. Flame graphs для всего парка серверов.
# Установка агента: ассет называется по версии и платформе, голого
# имени parca-agent в релизах нет
curl -sL "https://github.com/parca-dev/parca-agent/releases/download/v0.48.0/parca-agent_0.48.0_$(uname -s)_$(uname -m).tar.gz" | tar -xz -C /usr/local/bin parca-agent
# Запуск агента (профилирует всё на хосте)
parca-agent --remote-store-address=parca-server:7070
# В Kubernetes (через Helm)
helm install parca-agent parca/parca-agent
# Сервер (UI + хранение)
helm install parca parca/parca
# UI: http://parca-server:7070
Pyroscope 🟢
Continuous profiling от Grafana. Интегрируется с Grafana stack.
# В Kubernetes через Helm
helm install pyroscope grafana/pyroscope -n pyroscope --create-namespace
# eBPF-агент для профилирования всех процессов
helm install grafana-agent grafana/grafana-agent \
--set agent.mode=flow \
--set pyroscope.enabled=true
Связанные заметки
- Linux — средства диагностики производительности — обзорная карта инструментов
- Linux — контейнеризация — устройство контейнеров
- Linux — справочник команд: сетевой стек — сеть под контейнерами
Из библиотеки института уносят только знания. Читателей здесь не считают: посещение не регистрируется, отметок в издании не остаётся, счётчиков нет ни у одного издания фонда.
Издание пополняется и пересверяется. Текст доступен на условиях CC BY-SA 4.0 — унесённое можно передавать дальше на тех же условиях.