kubectl - Просмотр и диагностика
Быстрая навигация: используйте
Ctrl/Cmd + Fдля перехода к разделам. Ключевые слова:get,describe,logs,top,debug,events,troubleshooting,incidents,ephemeral.
Получение информации (get)
Официальная документация kubectl get ↗
# Получить список всех подов в текущем namespace
kubectl get pods
# Получить список подов во всех namespace
kubectl get pods --all-namespaces
kubectl get pods -A
# Получить список подов с расширенной информацией (IP, нода)
kubectl get pods -o wide
# Получить список всех сервисов
kubectl get services
kubectl get svc
# Получить список всех деплойментов
kubectl get deployments
kubectl get deploy
# Получить список всех ресурсов в namespace
kubectl get all
# Получить информацию в формате YAML
kubectl get pod <pod-name> -o yaml
# Получить информацию в формате JSON
kubectl get pod <pod-name> -o json
# Получить список нод кластера
kubectl get nodes
# Получить список namespace
kubectl get namespaces
kubectl get ns
Детальная информация (describe)
Официальная документация kubectl describe ↗
# Детальная информация о поде
kubectl describe pod <pod-name>
# Детальная информация о ноде
kubectl describe node <node-name>
# Детальная информация о сервисе
kubectl describe service <service-name>
kubectl describe svc <service-name>
# Детальная информация о деплойменте
kubectl describe deployment <deployment-name>
# Детальная информация о configmap
kubectl describe configmap <configmap-name>
kubectl describe cm <configmap-name>
# Детальная информация о secret
kubectl describe secret <secret-name>
# Детальная информация об ingress
kubectl describe ingress <ingress-name>
# Describe в определённом namespace
kubectl describe pod <pod-name> -n <namespace>
Просмотр логов (logs)
Официальная документация kubectl logs ↗
# Логи пода
kubectl logs <pod-name>
# Логи конкретного контейнера в поде (если несколько контейнеров)
kubectl logs <pod-name> -c <container-name>
# Логи в реальном времени (follow)
kubectl logs -f <pod-name>
# Последние N строк логов
kubectl logs --tail=100 <pod-name>
# Логи за последний час
kubectl logs --since=1h <pod-name>
# Логи за последние 30 минут
kubectl logs --since=30m <pod-name>
# Логи предыдущего контейнера (после рестарта)
kubectl logs <pod-name> --previous
kubectl logs <pod-name> -p
# Логи всех подов по label
kubectl logs -l app=myapp
# Логи в определённом namespace
kubectl logs <pod-name> -n <namespace>
# Комбинация: follow + tail + namespace
kubectl logs -f --tail=50 <pod-name> -n <namespace>
Мониторинг ресурсов (top)
Официальная документация kubectl top ↗
# Использование ресурсов нодами
kubectl top nodes
# Использование ресурсов подами
kubectl top pods
# Top поды во всех namespace
kubectl top pods -A
# Top поды в конкретном namespace
kubectl top pods -n <namespace>
# Top с сортировкой по CPU
kubectl top pods --sort-by=cpu
# Top с сортировкой по памяти
kubectl top pods --sort-by=memory
# Top для контейнеров внутри подов
kubectl top pods --containers
Отладка и диагностика (debug)
Официальная документация Отладка работающего Pod ↗
# Создать отладочный контейнер в существующем поде
kubectl debug <pod-name> -it --image=busybox
# Создать копию пода для отладки
kubectl debug <pod-name> -it --image=busybox --copy-to=debug-pod
# Отладка ноды (создаёт привилегированный под на ноде)
kubectl debug node/<node-name> -it --image=ubuntu
# Посмотреть события в namespace
kubectl get events
# События с сортировкой по времени
kubectl get events --sort-by='.lastTimestamp'
# События для конкретного пода
kubectl get events --field-selector involvedObject.name=<pod-name>
# Проверить статус API сервера
kubectl cluster-info
# Детальная информация о кластере
kubectl cluster-info dump
# Проверить доступ к API
kubectl auth can-i create pods
kubectl auth can-i delete deployments --namespace=production
# Проверить доступ для другого пользователя
kubectl auth can-i create pods --as=<user>
# Список всех разрешений
kubectl auth can-i --list
# Проверить почему под не запускается
kubectl describe pod <pod-name> | grep -A 10 Events
# Проверить health endpoints API server
kubectl get --raw='/readyz?verbose'
kubectl get --raw='/livez?verbose'
kubectl get --raw='/healthz'
События (events)
Официальная документация kubectl events ↗
kubectl events— самостоятельная команда, доступна с kubectl 1.26. Удобнее и гибче, чемkubectl get events.
# Показать все события в текущем неймспейсе
kubectl events
# События во всех неймспейсах
kubectl events -A
kubectl events --all-namespaces
# События для конкретного ресурса
kubectl events --for pod/<pod-name>
kubectl events --for deployment/<deploy-name>
kubectl events --for node/<node-name>
# Фильтрация по типу события (Normal, Warning)
kubectl events --types=Warning
kubectl events --types=Normal
kubectl events --types=Warning,Normal
# Следить за событиями в реальном времени
kubectl events --watch
kubectl events -w
# Мониторинг событий конкретного ресурса в реальном времени
kubectl events --for pod/<pod-name> --watch
# Вывод в JSON / YAML
kubectl events -o json
kubectl events -o yaml
# Получить только Warning-события по всему кластеру с анализом через jq
kubectl events -A -o json | \
jq '.items[] | select(.type=="Warning") | {reason: .reason, message: .message, object: .involvedObject.name}'
# Диагностика пода в CrashLoopBackOff
kubectl events --for pod/<pod-name> --types=Warning
# Сравнение подходов:
# Классический (устаревший):
kubectl get events --field-selector involvedObject.name=<pod-name>
# Новый (предпочтительный):
kubectl events --for pod/<pod-name>
# Все Warning-события в неймспейсе, отсортированные по времени
kubectl events --types=Warning -o json | \
jq -r '.items | sort_by(.lastTimestamp) | .[] | "\(.lastTimestamp) \(.reason) \(.involvedObject.name): \(.message)"'
Диагностика типичных проблем подов (troubleshooting)
Официальная документация Диагностика приложений ↗
# Найти все не-running поды во всех неймспейсах
kubectl get pods -A --field-selector='status.phase!=Running'
# Быстро показать рестарты и текущее состояние контейнера
kubectl get pods -A -o custom-columns=NS:.metadata.namespace,POD:.metadata.name,PHASE:.status.phase,RESTARTS:.status.containerStatuses[0].restartCount,STATE:.status.containerStatuses[0].state.waiting.reason
# Проверить события конкретного пода (image pull, scheduling, probes)
kubectl describe pod <pod-name> -n <namespace>
kubectl get events -n <namespace> --field-selector involvedObject.name=<pod-name> --sort-by=.lastTimestamp
# CrashLoopBackOff: посмотреть логи предыдущего запуска контейнера
kubectl logs <pod-name> -n <namespace> --previous
kubectl logs <pod-name> -n <namespace> -c <container-name> --previous
# Pending: проверить ошибки scheduler и запрошенные ресурсы
kubectl describe pod <pod-name> -n <namespace> | grep -A 20 -E 'Events|Requests|Limits|node(s)'
# ImagePullBackOff / ErrImagePull: проверить image и pull secret
kubectl describe pod <pod-name> -n <namespace> | grep -A 30 -E 'Failed|ErrImagePull|ImagePullBackOff|pull'
kubectl get secret -n <namespace>
# Ошибки liveness/readiness/startup probes
kubectl describe pod <pod-name> -n <namespace> | grep -A 30 -E 'Liveness|Readiness|Startup|probe'
# Проверить env и смонтированные config/secret внутри контейнера
kubectl exec -it <pod-name> -n <namespace> -- env
kubectl exec -it <pod-name> -n <namespace> -- ls -la /etc/config /etc/secrets
# Временный debug-контейнер в сетевом namespace целевого пода
kubectl debug <pod-name> -n <namespace> -it --image=busybox
Быстрые сценарии инцидентов (incidents)
# Быстрый снимок namespace: поды, сервисы, события
kubectl get pods,svc,ingress,pvc -n <namespace> -o wide
kubectl events -n <namespace> --types=Warning
# CrashLoopBackOff: что рестартует и почему
kubectl get pods -n <namespace> --sort-by='.status.containerStatuses[0].restartCount'
kubectl describe pod <pod-name> -n <namespace>
kubectl logs <pod-name> -n <namespace> --previous --all-containers=true
# Rollout stuck: состояние Deployment и ReplicaSet
kubectl rollout status deployment/<deploy-name> -n <namespace> --timeout=60s
kubectl describe deployment/<deploy-name> -n <namespace>
kubectl get rs -n <namespace> -l app=<app-label> -o wide
# Pending: не хватает ресурсов, PVC, taints или node selector
kubectl describe pod <pod-name> -n <namespace> | grep -A 40 Events
kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints,CPU:.status.allocatable.cpu,MEM:.status.allocatable.memory
kubectl get pvc -n <namespace>
# Service не отвечает: проверить endpoints и selector
kubectl get svc <service-name> -n <namespace> -o wide
kubectl get endpoints <service-name> -n <namespace> -o yaml
kubectl describe svc <service-name> -n <namespace>
# DNS внутри кластера: быстрый pod для проверки резолва
kubectl run dnscheck --rm -it --restart=Never --image=busybox:1.36 -- nslookup <service-name>.<namespace>.svc.cluster.local
# PVC не монтируется: события pod, PVC и storage class
kubectl describe pod <pod-name> -n <namespace> | grep -A 40 -E 'Mount|Volume|Events'
kubectl describe pvc <pvc-name> -n <namespace>
kubectl get storageclass
# Node pressure: найти ноды и поды с высоким потреблением
kubectl describe nodes | grep -E 'Name:|Pressure|Allocated resources' -A 8
kubectl top nodes
kubectl top pods -A --sort-by=memory | head -20
Ephemeral Containers (временные контейнеры)
Официальная документация Ephemeral Containers ↗
# Добавить временный отладочный контейнер в работающий под (kubectl >= 1.23)
kubectl debug -it <pod-name> --image=busybox --target=<container-name>
# Использовать расширенный образ для отладки сети
kubectl debug -it <pod-name> --image=nicolaka/netshoot --target=<container-name>
# Посмотреть временные контейнеры, уже прикреплённые к поду
kubectl get pod <pod-name> -o jsonpath='{.spec.ephemeralContainers}' | jq .
# Создать отладочную копию пода (оригинал не затрагивается)
kubectl debug <pod-name> -it --copy-to=<pod-name>-debug --image=busybox
# Заменить точку входа падающего контейнера в копии
kubectl debug <pod-name> -it --copy-to=<pod-name>-debug --container=<container-name> -- sh
# Разделить пространство процессов с целевым контейнером (видеть его процессы)
kubectl debug -it <pod-name> --image=busybox --target=<container-name> --share-processes
# Отладка узла — запустить привилегированный под на ноде
kubectl debug node/<node-name> -it --image=busybox
# Найти все поды с прикреплёнными временными контейнерами
kubectl get pods -A -o json | jq '.items[] | select(.spec.ephemeralContainers != null) | .metadata.name'
# Удалить отладочную копию пода после работы
kubectl delete pod <pod-name>-debug