## Таблица основных Kubernetes production-ошибок
|Incident / Ошибка|Симптом|Основная причина|Как диагностировать|Решение|
|---|---|---|---|---|
|Pod Pending|Pod не запускается|Нет ресурсов, taints, node selector|`kubectl describe pod`|увеличить nodes или изменить resources|
|ImagePullBackOff|Контейнер не скачивает image|неправильный image tag, нет registry credentials|`kubectl describe pod`|исправить image или добавить `imagePullSecret`|
|CrashLoopBackOff|Pod постоянно рестартует|приложение падает|`kubectl logs pod`|исправить код или конфигурацию|
|ContainerCreating|Pod зависает при старте|volume mount проблема|`kubectl describe pod`|проверить PVC и storage|
|Node NotReady|Node недоступен|kubelet crash, сеть, диск|`kubectl get nodes`|перезапустить kubelet или восстановить node|
|Service недоступен|Service есть, но трафик не проходит|selector mismatch|`kubectl get svc`, `kubectl get pods --show-labels`|исправить labels|
|DNS не работает|Pods не могут resolve сервисы|DNS pod crash|`kubectl get pods -n kube-system`|проверить CoreDNS|
|Pod network broken|Pods не могут общаться|CNI plugin проблема|`kubectl get pods -n kube-system`|перезапустить CNI|
|LoadBalancer pending|Нет external IP|cloud controller или metallb|`kubectl get svc`|исправить LoadBalancer config|
|PVC Pending|Storage не выделяется|StorageClass ошибка|`kubectl get pvc`|исправить storageclass|
|API server недоступен|kubectl не отвечает|control plane crash|`kubectl get componentstatuses`|восстановить control plane|
|etcd disk full|API server начинает тормозить|диск etcd заполнен|`df -h`|очистить snapshots|
|Too many pods|Scheduler не может разместить pod|достигнут лимит pods на node|`kubectl describe node`|увеличить `max-pods`|
|NetworkPolicy блокирует трафик|сервисы не соединяются|restrictive policy|`kubectl get networkpolicy`|изменить policy|
|Pod Terminating|Pod не удаляется|finalizer завис|`kubectl describe pod`|`kubectl delete --force`|
## Что происходит при превышении лимитов ресурсов
|Resource|Request exceeded|Limit exceeded|Что происходит|Симптомы|Как проверить|Решение|
|---|---|---|---|---|---|---|
|**CPU**|Pod может использовать больше CPU если node свободен|Linux **CPU throttling** через cgroups|Контейнер не убивается, просто получает меньше CPU времени|высокая latency, slow response|`kubectl top pod`, Prometheus `container_cpu_cfs_throttled_seconds_total`|увеличить CPU limit или оптимизировать код|
|**Memory**|Pod может временно использовать больше request|**OOMKilled**|Kernel OOM killer убивает процесс|Pod restart, `CrashLoopBackOff`|`kubectl describe pod`, `kubectl get pod`|увеличить memory limit|
|**Ephemeral storage**|Pod может использовать больше request|Pod **Evicted**|kubelet удаляет Pod|`Evicted` status|`kubectl describe pod`|увеличить storage limit|
|**Node CPU exhausted**|scheduler не может разместить Pod|Pod остаётся **Pending**|нет ресурсов на node|Pod не запускается|`kubectl describe pod`|добавить nodes / уменьшить requests|
|**Node Memory exhausted**|Pod может стартовать|kubelet начинает **eviction** Pods|Pods удаляются по QoS|Pod restart / eviction|`kubectl describe node`|увеличить node memory|
|**Node Disk full**|Pod может стартовать|kubelet eviction|Pods удаляются|`Evicted: DiskPressure`|`kubectl describe node`|очистить disk|
|**Network bandwidth limit (CNI)**|traffic throttled|network throttling|slowdown|latency|`tc`, CNI metrics|увеличить bandwidth|
## Cтадий CI pipeline в Jenkins
|Stage|Что происходит|Основные инструменты / команды|Результат|
|---|---|---|---|
|**1. Source / Checkout**|Jenkins получает код из системы контроля версий|`git clone`, `checkout scm`|Код загружен в workspace|
|**2. Trigger**|Pipeline запускается (commit, webhook, cron)|GitHub/GitLab webhook|Build стартует|
|**3. Install Dependencies**|Установка зависимостей проекта|`npm install`, `pip install`, `mvn install`|Подготовленная среда|
|**4. Static Code Analysis**|Анализ качества кода|SonarQube, ESLint, pylint|Найдены проблемы в коде|
|**5. Build / Compile**|Сборка приложения|`mvn package`, `gradle build`, `go build`|Создан artifact|
|**6. Unit Tests**|Запуск unit тестов|JUnit, pytest, Jest|Проверка логики кода|
|**7. Security Scan**|Проверка уязвимостей|Trivy, Snyk, OWASP Dependency Check|Найдены CVE|
|**8. Package / Artifact**|Создание артефакта|`docker build`, `.jar`, `.war`|Artifact готов|
|**9. Push Artifact**|Публикация артефакта|Docker Registry, Nexus, Artifactory|Artifact сохранён|
|**10. Integration Tests**|Тестирование сервисов вместе|Docker compose, Testcontainers|Проверка взаимодействия|
|**11. Deploy to Staging**|Развёртывание в тестовую среду|`kubectl apply`, Helm|App в staging|
|**12. Acceptance Tests**|Проверка бизнес-логики|Selenium, Cypress|Проверка UI/API|
|**13. Deploy to Production**|Развёртывание в production|Helm, ArgoCD, Terraform|Production deployment|
|**14. Monitoring / Notifications**|Отправка статуса|Slack, Email, Telegram|Команда уведомлена|
## Dockerfile Image Optimization Table
| Проблема | Плохая практика | Оптимизированный вариант | Инструменты / методы | Почему важно |
| ------------------------- | ----------------------------- | ------------------------------ | -------------------- | ------------------------ |
| Большой base image | `FROM ubuntu` | `FROM alpine` или `distroless` | multi-stage build | уменьшает размер image |
| Лишние зависимости | install build tools в runtime | удалить build tools | multi-stage build | уменьшает attack surface |
| Слишком много layers | много `RUN` команд | объединить `RUN` | layer optimization | быстрее build |
| Кэш ломается | `COPY . .` в начале | сначала copy dependencies | build cache | ускоряет build |
| Кэш package manager | apt cache остается | `apt-get clean` | cleanup | уменьшает размер |
| dev dependencies | dev packages в production | install только prod deps | dependency pruning | безопасность |
| root user | container запускается от root | создать user | `USER app` | security |
| большие файлы | `.git` попадает в image | `.dockerignore` | build optimization | уменьшает image |
| unnecessary packages | install curl, vim | минимальный runtime | minimal base | меньше vulnerabilities |
| много файлов | копируется весь проект | selective copy | `.dockerignore` | быстрее build |
| большие language runtimes | полный Python/Node | slim versions | `python:slim` | smaller image |
| runtime build | build внутри runtime | multi-stage build | builder stage | production images меньше |
| unpinned versions | `latest` tags | pinned versions | reproducible builds | стабильность |
| слишком большой image | нет анализа | scan image | `docker history` | troubleshooting |
| security vulnerabilities | неизвестные CVE | image scanning | trivy / snyk | security |
| | | | | |
| | | | | |
## Hайти конкретный server/node + конкретный service/pod/container**, который ломает сайт.
## Kubernetes / Docker (за Load Balancer)
| Шаг | Цель | Что делаем | Команды | Что считаем “виновником” |
| --- | ------------------------------- | ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- |
| 1 | Зафиксировать симптом | Понять код/таймаут/частоту | `curl -sS -o /dev/null -w "%{http_code} %{time_total}\n" https://site` | Код `5xx/4xx` или `time_total` скачет |
| 2 | Понять где ломается: LB или app | Проверить “пограничные” коды | `curl -I https://site` | `502/504` чаще про upstream/LB, `500` чаще app |
| 3 | Найти upstream из ответа | Если есть headers от LB/ingress | `curl -I [https://site](https://site) | egrep -i "server |
| 4 | Ingress / LB events | Быстро увидеть проблемы ingress/controller | `kubectl -n ingress-nginx get pods`; `kubectl -n ingress-nginx logs deploy/ingress-nginx-controller --tail=200` | Ошибки соединения к upstream, timeouts |
| 5 | Проверить Service endpoints | Убедиться что Service ведёт на правильные Pod’ы | `kubectl -n <ns> get svc <svc>`; `kubectl -n <ns> get endpoints <svc> -o wide` | Если endpoints пустые → виноват selector/labels |
| 6 | Тест каждого endpoint напрямую | Найти “плохой pod” | (изнутри кластера) `kubectl -n <ns> run t --rm -it --image=curlimages/curl -- sh` → `curl -sS http://<podIP>:<port>/health` по всем endpoints | Endpoint, который возвращает 5xx/timeout |
| 7 | Связать pod → node | Найти “плохую” ноду | `kubectl -n <ns> get pod -o wide | grep <pod>` |
| 8 | Логи “плохого pod” | Найти причину на уровне приложения | `kubectl -n <ns> logs <pod> --since=10m` (+ `-p` для previous) | Traceback/exception/connection errors |
| 9 | Проверить рестарты/ресурсы | Поймать OOM/лимиты/давление | `kubectl -n <ns> describe pod <pod>`; `kubectl top pod -n <ns>`; `kubectl top node` | `OOMKilled`, throttling, high load |
| 10 | Проверить probes | Часто “флапает” readiness/liveness | `kubectl -n <ns> describe pod <pod> | egrep -i "readiness |
| 11 | Сеть / CNI / DNS | Если ошибки “то работает то нет” | `kubectl -n kube-system get pods`; `kubectl -n kube-system logs <coredns>`; `kubectl -n <ns> exec <pod> -- nslookup <svc>` | DNS/CNI проблемы, packet loss |
| 12 | Быстрый mitigation | Убрать плохой инстанс из трафика | `kubectl -n <ns> delete pod <pod>` или `kubectl cordon <node>; kubectl drain <node> --ignore-daemonsets` | Если после удаления проблема ушла — найден виновник |
> **Docker (без Kubernetes, но за LB)** — аналогично: вместо endpoints/pods делаем `docker ps`, `docker logs`, `curl` на каждый backend IP:port, плюс healthchecks LB.
---
## Linux (systemd) сервис, который ломает сайт
|Шаг|Цель|Что делаем|Команды|Что считаем “виновником”|
|---|---|---|---|---|
|1|Подтвердить проблему локально|Отличить network/LB от сервера|`curl -I http://localhost` и `curl -I http://127.0.0.1:PORT`|Если локально падает → проблема на сервере/сервисе|
|2|Определить какой сервис слушает порт|Найти процесс на 80/443/APP PORT|`ss -lntp|egrep ":80|
|3|Проверить статус systemd|Быстро увидеть “failed/restarting”|`systemctl status nginx` (или ваш сервис)|`failed`, `activating`, `restarting`|
|4|Проверить логи сервиса|Найти ошибки/stacktrace|`journalctl -u nginx -S "10 min ago"`|Error patterns, crashes, config errors|
|5|Проверить логи приложения|Если Nginx/Apache проксирует на app|`/var/log/nginx/error.log`, `journalctl -u <app>`|Upstream timeout/connection refused|
|6|Проверить backend порт|Жив ли upstream (gunicorn/node/java)|`curl -v http://127.0.0.1:APPPORT/health`|`connection refused`/timeout → app down|
|7|Ресурсы и OOM|“Иногда падает” часто из-за ресурсов|`top`, `free -m`, `dmesg -T|egrep -i "oom|
|8|Диск|100% диск ломает всё|`df -h`, `df -i`|Full disk / inode exhaustion|
|9|Сеть/Firewall|Вход/выход блокируется|`iptables -S` / `nft list ruleset`; `curl -v` снаружи|Блокировка порта/пакетов|
|10|TLS/сертификаты|Для 443 частая причина|`openssl s_client -connect host:443 -servername host`|Expired cert / wrong chain|
|11|Mitigation|Быстро вернуть сайт|`systemctl restart <svc>`; rollback config; disable bad deploy|Если после рестарта/rollback стабильно — нашли culprit|
|12|Root cause|Зафиксировать и предотвратить|alerting, healthchecks, limits, autoscaling|—|
## 20 типовых production-инцидентов Kubernetes
|#|Incident Scenario|Symptoms|How to Detect|Immediate Action|Long-term Fix|
|---|---|---|---|---|---|
|1|**CPU overload on node**|Node CPU 100%, pods slow|`kubectl top node`, `top`, `htop`|Identify heavy pod, restart or scale down|HPA, CPU limits|
|2|**Pod uses 100% CPU**|Pod consumes all CPU|`kubectl top pod`, `kubectl describe pod`|Restart pod|Optimize code, set limits|
|3|**Pod DDoS-ing database**|DB overloaded, many connections|DB metrics, `netstat`, logs|Scale down deployment|Rate limiting, circuit breaker|
|4|**Memory leak**|Pod memory continuously grows|`kubectl top pod`, OOMKilled events|Restart pod|Fix app, memory limits|
|5|**Pod stuck Terminating**|Pod never stops|`kubectl get pod`|`kubectl delete --force`|Fix finalizers, volume detach|
|6|**Pod not reachable via Service**|Service exists but requests fail|`kubectl get endpoints`|Fix labels / readiness|Proper readiness probes|
|7|**CrashLoopBackOff**|Pod restarting repeatedly|`kubectl logs`|Fix config or env vars|Better startup checks|
|8|**ImagePullBackOff**|Pod cannot download image|`kubectl describe pod`|Fix image name / credentials|Configure `imagePullSecrets`|
|9|**Pod Pending (unschedulable)**|Pod stuck Pending|`kubectl describe pod`|Add resources or remove constraints|Capacity planning|
|10|**Node disk full**|Pods fail to start/write logs|`df -h`, kubelet logs|Clean disk|Log rotation, monitoring|
|11|**etcd quorum loss**|API server unstable|etcd logs|Restore quorum|Odd number of etcd nodes|
|12|**kube-proxy rules broken**|Service networking fails|`iptables -t nat -L`|Restart kube-proxy|Monitor networking|
|13|**CNI plugin failure**|Pods cannot communicate|CNI logs|Restart CNI|Reliable networking setup|
|14|**CoreDNS failure**|DNS queries fail|`kubectl logs coredns`|Restart DNS pods|Increase replicas|
|15|**API server overload**|kubectl commands slow|API metrics|Scale control plane|API rate limiting|
|16|**Node NotReady**|Node disappears from cluster|`kubectl get nodes`|Restart kubelet|Monitor node health|
|17|**NetworkPolicy blocking traffic**|Services unreachable|`kubectl describe netpol`|Update policy|Document policies|
|18|**PersistentVolume mount failure**|Pod stuck ContainerCreating|`kubectl describe pod`|Fix storage|Storage monitoring|
|19|**Load balancer misconfiguration**|External access fails|Service status|Fix LB config|Use health checks|
|20|**Resource limits exceeded**|Pods throttled / OOM|`kubectl describe pod`|Increase limits|
## Kubernetes Incident Response / Pod Control Cheat Sheet
|Задача|Команда|Аргументы / Пример|Что происходит|
|---|---|---|---|
|Убить Pod|`kubectl delete pod`|`kubectl delete pod nginx-abc`|Pod удаляется и **ReplicaSet создаёт новый**|
|Принудительно удалить Pod|`kubectl delete pod`|`kubectl delete pod nginx --force --grace-period=0`|Удаление **без graceful shutdown**|
|Убить процесс внутри Pod|`kubectl exec`|`kubectl exec pod-name -- kill -9 1`|Перезапускается контейнер|
|Посмотреть ресурсы Pod|`kubectl top pod`|`kubectl top pod -A`|CPU / Memory usage|
|Изолировать Pod от сети|`NetworkPolicy`|YAML policy|Блокируется ingress/egress|
|Убрать Pod из Service|`kubectl label pod`|`kubectl label pod nginx app=disabled --overwrite`|Service перестаёт видеть Pod|
|Остановить сервис|`kubectl scale`|`kubectl scale deploy nginx --replicas=0`|Все Pod удаляются|
|Перезапустить Deployment|`kubectl rollout restart`|`kubectl rollout restart deployment nginx`|Rolling restart|
|Остановить Node (запретить scheduling)|`kubectl cordon`|`kubectl cordon node1`|Node **unschedulable**|
|Разрешить scheduling|`kubectl uncordon`|`kubectl uncordon node1`|Scheduler снова размещает Pod|
|Переместить Pod на другую ноду|`kubectl drain`|`kubectl drain node1 --ignore-daemonsets --delete-emptydir-data`|Все Pod переносятся|
|Проверить где Pod работает|`kubectl get pod -o wide`|`kubectl get pod nginx -o wide`|Показывает Node|
|Принудительно назначить Pod на Node|`nodeName`|`spec.nodeName: node2`|Scheduler пропускается|
|Назначить Node через selector|`nodeSelector`|`nodeSelector: disktype=ssd`|Pod только на выбранных nodes|
|Более сложные правила scheduler|`nodeAffinity`|requiredDuringScheduling|Гибкая политика scheduling|
|Изолировать Node для workload|`kubectl taint`|`kubectl taint nodes node1 gpu=true:NoSchedule`|Scheduler не размещает Pod|
|Разрешить Pod на tainted node|`tolerations`|YAML toleration|Pod может работать на node|
|Перенести Pod вручную|delete + scheduler|`kubectl delete pod`|Scheduler выберет новый node|
|Проверить события Pod|`kubectl describe pod`|`kubectl describe pod nginx`|Видны ошибки scheduling|
|Найти Pod с нагрузкой|`kubectl top pod`|`kubectl top pod --sort-by=cpu`|Найти проблемный Pod|
## 25 Kubernetes troubleshooting команд
|#|Задача|Команда|Аргументы / Пример|Что показывает|
|---|---|---|---|---|
|1|Проверить состояние Pod|`kubectl get pod`|`kubectl get pod -A -o wide`|статус pod и node|
|2|Проверить Node|`kubectl get nodes`|`kubectl get nodes -o wide`|статус node|
|3|Использование ресурсов|`kubectl top pod`|`kubectl top pod -A`|CPU / Memory|
|4|Использование ресурсов node|`kubectl top node`|`kubectl top node`|нагрузка на nodes|
|5|Подробности Pod|`kubectl describe pod`|`kubectl describe pod nginx`|events и ошибки|
|6|Посмотреть logs|`kubectl logs`|`kubectl logs pod-name`|stdout контейнера|
|7|Logs предыдущего контейнера|`kubectl logs`|`kubectl logs pod -p`|logs crash|
|8|Logs всех контейнеров|`kubectl logs`|`kubectl logs pod --all-containers`|multi-container logs|
|9|Подключиться к Pod|`kubectl exec`|`kubectl exec -it pod -- bash`|shell внутри pod|
|10|Проверить endpoints сервиса|`kubectl get endpoints`|`kubectl get endpoints service`|какие pod обслуживают|
|11|Проверить service|`kubectl get svc`|`kubectl get svc -A`|IP / ports|
|12|Проверить network policy|`kubectl get networkpolicy`|`kubectl get netpol -A`|правила сети|
|13|Проверить события|`kubectl get events`|`kubectl get events --sort-by=.metadata.creationTimestamp`|последние события|
|14|Проверить deployment|`kubectl get deployment`|`kubectl get deploy -A`|состояние deployment|
|15|История rollout|`kubectl rollout history`|`kubectl rollout history deploy nginx`|версии|
|16|Перезапустить deployment|`kubectl rollout restart`|`kubectl rollout restart deploy nginx`|rolling restart|
|17|Проверить PVC|`kubectl get pvc`|`kubectl get pvc -A`|storage|
|18|Проверить PV|`kubectl get pv`|`kubectl get pv`|volumes|
|19|Проверить node события|`kubectl describe node`|`kubectl describe node node1`|disk / pressure|
|20|Проверить pod node placement|`kubectl get pod -o wide`|`kubectl get pod nginx -o wide`|node hosting|
|21|Проверить DNS|`kubectl exec`|`kubectl exec pod -- nslookup service`|DNS|
|22|Проверить connectivity|`kubectl exec`|`kubectl exec pod -- curl http://service`|network|
|23|Посмотреть yaml|`kubectl get`|`kubectl get pod nginx -o yaml`|конфигурация|
|24|Debug pod|`kubectl debug`|`kubectl debug pod/nginx -it --image=busybox`|ephemeral container|
|25|Проверить kube-system|`kubectl get pod`|`kubectl get pod -n kube-system`|system components|
## 30 Linux debugging команд при production-инцидентах. Таблица ориентирована на реальные сценарии: CPU, память, сеть, диски, процессы.
|#|Задача|Команда|Пример / аргументы|Что показывает|
|---|---|---|---|---|
|1|Общая нагрузка системы|`uptime`|`uptime`|load average|
|2|Топ процессов|`top`|`top`|CPU / memory usage|
|3|Улучшенный top|`htop`|`htop`|удобный мониторинг процессов|
|4|Использование CPU|`mpstat`|`mpstat -P ALL 1`|CPU per core|
|5|Нагрузка процессов|`pidstat`|`pidstat 1`|CPU / IO per process|
|6|Использование памяти|`free`|`free -h`|RAM usage|
|7|Подробная память|`vmstat`|`vmstat 1`|swap / memory / CPU|
|8|Использование диска|`df`|`df -h`|disk space|
|9|Какие файлы занимают место|`du`|`du -sh *`|размер директорий|
|10|I/O дисков|`iostat`|`iostat -xz 1`|latency / IO wait|
|11|Найти большие файлы|`find`|`find / -size +1G`|файлы >1GB|
|12|Проверить процессы|`ps`|`ps aux`|список процессов|
|13|Найти процесс|`pgrep`|`pgrep nginx`|PID процесса|
|14|Убить процесс|`kill`|`kill -9 PID`|остановка процесса|
|15|Сетевые соединения|`ss`|`ss -tulnp`|listening ports|
|16|Старый netstat|`netstat`|`netstat -tulnp`|network connections|
|17|Проверить порт|`lsof`|`lsof -i :80`|какой процесс слушает|
|18|Открытые файлы|`lsof`|`lsof|grep deleted`|
|19|Проверить сеть|`ping`|`ping google.com`|connectivity|
|20|Проверить маршрут|`traceroute`|`traceroute 8.8.8.8`|network path|
|21|Проверить DNS|`dig`|`dig google.com`|DNS resolution|
|22|Проверить HTTP|`curl`|`curl -v http://service`|HTTP response|
|23|Проверить интерфейсы|`ip`|`ip addr`|network interfaces|
|24|Проверить маршруты|`ip route`|`ip route`|routing table|
|25|Проверить firewall|`iptables`|`iptables -L -n -v`|firewall rules|
|26|Проверить connections|`conntrack`|`conntrack -L`|connection table|
|27|Посмотреть логи|`journalctl`|`journalctl -xe`|system logs|
|28|Проверить kernel ошибки|`dmesg`|`dmesg -T`|kernel messages|
|29|Проверить открытые sockets|`ss`|`ss -s`|socket summary|
|30|Сниффинг пакетов|`tcpdump`|`tcpdump -i eth0 port 80`|network packets|
## Linux debugging
| Инструмент | Что показывает | Пример команды | Когда использовать |
| -------------- | ---------------------------- | ---------------------------- | --------------------------- |
| **strace** | system calls процесса | `strace -p 1234` | понять где завис процесс |
| **lsof** | какие файлы и сокеты открыты | `lsof -i` | кто использует порт |
| **ss** | сетевые соединения | `ss -tulnp` | какие сервисы слушают порты |
| **tcpdump** | сетевые пакеты | `tcpdump -i eth0 port 80` | анализ сети |
| **netstat** | старый инструмент сети | `netstat -tulnp` | просмотр портов |
| **top** | CPU / memory usage | `top` | поиск тяжёлых процессов |
| **htop** | улучшенный top | `htop` | мониторинг процессов |
| **iotop** | disk IO | `iotop` | кто нагружает диск |
| **vmstat** | CPU / memory / IO | `vmstat 1` | анализ нагрузки системы |
| **free** | использование памяти | `free -h` | проверка RAM |
| **df** | заполнение дисков | `df -h` | проверка диска |
| **du** | размер файлов | `du -sh *` | найти большие файлы |
| **ps** | список процессов | `ps aux` | анализ процессов |
| **dmesg** | kernel сообщения | `dmesg | tail` |
| **journalctl** | systemd логи | `journalctl -u nginx` | анализ сервисов |
| **perf** | CPU profiling | `perf top` | performance debugging |
| **pidstat** | статистика процесса | `pidstat 1` | CPU usage процессов |
| **watch** | повтор команды | `watch -n1 kubectl get pods` | мониторинг |
| **nsenter** | вход в namespace | `nsenter -t PID -n` | контейнеры |
| **ip** | network routing | `ip route` | сетевые маршруты |
## 15 Network Steps in Kubernetes (Client → Pod)
|#|Этап|Что происходит|Инструменты / компоненты|
|---|---|---|---|
|1|User request|Пользователь открывает URL|Browser / curl|
|2|DNS lookup|Домен резолвится в IP|DNS / CoreDNS / external DNS|
|3|Internet routing|Пакет идёт через интернет|BGP / ISP routing|
|4|Cloud / Provider network|Пакет приходит в датацентр|Hetzner / AWS / DC network|
|5|Node public interface|Пакет приходит на node|`eth0`|
|6|Load Balancer|Балансировщик принимает трафик|Cloud LB / MetalLB|
|7|Ingress Controller|HTTP routing|Nginx / Traefik / HAProxy|
|8|Kubernetes Service|Service IP принимает трафик|ClusterIP|
|9|kube-proxy rules|iptables / ipvs rules|kube-proxy|
|10|DNAT translation|Service IP → Pod IP|iptables DNAT|
|11|CNI routing|пакет идёт в pod network|Flannel / Calico / Cilium|
|12|Node overlay network|VXLAN туннель если pod на другом node|flannel.1|
|13|veth pair|пакет входит в pod namespace|veth interface|
|14|Pod network stack|Linux network stack pod|netns|
|15|Application|приложение принимает запрос|nginx / app|
## Linux Network Debugging Tools
| Утилита | Что показывает | Основное применение | Пример команды |
| ------------- | ------------------------------ | ------------------- | --------------------- |
| `ip addr` | IP адреса интерфейсов | проверка IP | `ip addr show` |
| `ip route` | таблица маршрутизации | debugging routing | `ip route show` |
| `ss` | активные сокеты | замена netstat | `ss -lntp` |
| `netstat` | старый инструмент sockets | legacy анализ | `netstat -tulpn` |
| `lsof` | какие процессы используют порт | найти процесс | `lsof -i :80` |
| `ping` | проверка доступности | ICMP connectivity | `ping google.com` |
| `traceroute` | маршрут пакета | network path | `traceroute 8.8.8.8` |
| `tracepath` | traceroute без root | маршрут | `tracepath 8.8.8.8` |
| `mtr` | ping + traceroute | latency анализ | `mtr google.com` |
| `tcpdump` | захват пакетов | packet debugging | `tcpdump -i eth0` |
| `iftop` | network usage realtime | трафик | `iftop -i eth0` |
| `nload` | график трафика | monitoring | `nload` |
| `ip neigh` | ARP таблица | layer2 debugging | `ip neigh show` |
| `arp` | ARP записи | старый инструмент | `arp -a` |
| `ethtool` | параметры NIC | link speed | `ethtool eth0` |
| `dig` | DNS lookup | DNS debugging | `dig google.com` |
| `nslookup` | DNS lookup | старый DNS tool | `nslookup google.com` |
| `curl` | HTTP запросы | проверка API | `curl -I site.com` |
| `wget` | HTTP download | тест HTTP | `wget site.com` |
| `nc` (netcat) | проверка портов | TCP тест | `nc -zv host 80` |
| `telnet` | TCP connection | тест порта | `telnet host 80` |
| `iptables -L` | firewall rules | firewall debugging | `iptables -L` |
| `conntrack` | NAT connections | connection tracking | `conntrack -L` |
| `bridge` | linux bridge | CNI debugging | `bridge link` |
| `ip link` | интерфейсы | network devices | `ip link show` |
## Kubernetes Networking Analysis with `bridge`
| Команда | Что анализируем | Пример команды | Пример вывода | Что означает |
| ---------------------------------------- | ------------------------------ | ------------------------------ | ------------------------------------------------- | --------------------------------------- |
| Показать Pod интерфейсы | Какие veth подключены к bridge | `bridge link` | `12: veth6a2b@if11: master cni0 state forwarding` | Pod интерфейс подключён к bridge `cni0` |
| Найти все Pod интерфейсы | Все veth контейнеров | `bridge link \| grep veth` | `veth6a2b master cni0` | Каждый `veth` = Pod |
| Показать MAC таблицу | forwarding database | `bridge fdb show` | `3a:45:aa:6d:4c:11 dev veth6a2b master cni0` | MAC адрес Pod |
| Проверить MAC таблицу конкретного bridge | MAC learning | `bridge fdb show br cni0` | `fa:12:34:56:ab:cd dev veth6a2b` | MAC → интерфейс |
| Показать bridge интерфейсы | Все Linux bridge | `ip link show type bridge` | `cni0` `docker0` | bridge сети контейнеров |
| Посмотреть интерфейсы bridge | Какие устройства подключены | `bridge link show master cni0` | `veth6a2b master cni0` | Pod подключён к bridge |
| Проверить VXLAN overlay | overlay networking | `bridge fdb \| grep flannel` | `aa:bb:cc:dd dev flannel.1 dst 10.0.0.2` | трафик pod → другой node |
| Показать VLAN | VLAN конфигурация | `bridge vlan show` | `veth6a2b vid 1 PVID` | VLAN tag |
| Показать события bridge | realtime debugging | `bridge monitor` | `port veth6a2b entered forwarding state` | изменения интерфейсов |
| Детальная информация | debug | `bridge -d link` | `veth6a2b master cni0 mtu 1450` | подробности интерфейса |
## Netcat (`nc`) Cheat Sheet
| Задача | Команда | Пример вывода | Что означает |
| --------------------------- | ------------------------------------- | ----------------------------------------------------- | -------------------- |
| Проверить открыт ли порт | `nc -zv host port` | `Connection to 10.0.0.5 80 port [tcp/http] succeeded` | порт открыт |
| Проверить несколько портов | `nc -zv host 80 443` | `80 open` `443 open` | сервис доступен |
| Сканировать диапазон портов | `nc -zv host 20-100` | `port 22 open` | найден открытый порт |
| Проверить UDP порт | `nc -zvu host port` | `Connection succeeded` | UDP доступен |
| Отправить HTTP запрос | `echo "GET / HTTP/1.0" \| nc host 80` | `HTTP/1.1 200 OK` | веб сервер отвечает |
| Подключиться к сервису | `nc host port` | interactive session | TCP соединение |
| Слушать порт | `nc -l 8080` | waiting | сервер слушает |
| Слушать и отвечать | `nc -l -p 8080` | connection accepted | соединение принято |
| Передать файл | `nc host 4444 < file.txt` | sending | отправка файла |
| Получить файл | `nc -l 4444 > file.txt` | receiving | получение файла |
## `ss` — основные команды
| Задача | Команда | Пример вывода | Что означает |
| ----------------- | --------------------------- | --------------------------------------------- | ------------------- |
| Все соединения | `ss` | `ESTAB 10.0.0.5:22 10.0.0.10:53212` | активное соединение |
| Слушающие порты | `ss -l` | `LISTEN 0 128 0.0.0.0:80` | сервис слушает |
| TCP соединения | `ss -t` | `ESTAB 192.168.1.5:443` | TCP |
| UDP соединения | `ss -u` | `UNCONN 0 0 0.0.0.0:53` | UDP |
| Слушающие TCP | `ss -lt` | `LISTEN 0 128 :22` | TCP сервер |
| Показать процессы | `ss -p` | `users:(("nginx",pid=1234))` | какой процесс |
| Показать всё | `ss -tulpn` | `LISTEN 0 128 :80 users:(("nginx",pid=1234))` | порт + процесс |
| Фильтр по порту | `ss -lnt '( sport = :80 )'` | `LISTEN :80` | кто слушает 80 |
| Фильтр по IP | `ss dst 10.42.0.36` | `ESTAB` | соединения с Pod |
## Linux `ip` Command Cheat Sheet
| Задача | Команда | Пример вывода | Что означает |
| ------------------------------ | --------------------------- | ----------------------------------------- | ------------------ |
| Показать IP адреса | `ip addr` | `eth0: inet 192.168.1.10/24` | IP интерфейса |
| Показать интерфейсы | `ip link` | `eth0: state UP` | сетевые устройства |
| Показать маршруты | `ip route` | `default via 192.168.1.1 dev eth0` | routing table |
| Показать ARP таблицу | `ip neigh` | `192.168.1.1 dev eth0 lladdr 00:11:22:33` | MAC соседей |
| Показать статистику интерфейса | `ip -s link` | `RX packets 1000` | трафик |
| Показать IPv4 | `ip -4 addr` | `inet 10.0.0.5/24` | IPv4 |
| Показать IPv6 | `ip -6 addr` | `inet6 fe80::1234` | IPv6 |
| Показать маршрут к IP | `ip route get 8.8.8.8` | `8.8.8.8 via 192.168.1.1 dev eth0` | путь пакета |
| Показать bridge интерфейсы | `ip link show type bridge` | `cni0` | Linux bridge |
| Показать VXLAN | `ip -d link show flannel.1` | `vxlan id 1` | overlay сеть |
## `iptables` Cheat Sheet
| Задача | Команда | Пример вывода | Что означает |
| --------------------------- | ----------------------------------------------- | ---------------------------------------------- | ---------------------- |
| Показать firewall rules | `iptables -L` | `ACCEPT tcp -- anywhere anywhere tcp dpt:80` | правило разрешает порт |
| Показать правила с номерами | `iptables -L --line-numbers` | `1 ACCEPT tcp -- anywhere anywhere tcp dpt:22` | номер правила |
| Показать NAT правила | `iptables -t nat -L` | `DNAT tcp -- anywhere 10.43.63.8 tcp dpt:80` | Service → Pod |
| Показать raw rules | `iptables -t raw -L` | `NOTRACK` | raw table |
| Показать mangle rules | `iptables -t mangle -L` | `MARK` | packet marking |
| Показать правила подробно | `iptables -L -v -n` | `pkts bytes target prot opt` | статистика |
| Добавить правило | `iptables -A INPUT -p tcp --dport 80 -j ACCEPT` | — | разрешить порт |
| Удалить правило | `iptables -D INPUT 1` | — | удалить правило |
| Очистить правила | `iptables -F` | — | flush |
| Сохранить правила | `iptables-save` | полный конфиг | backup |
| Проверить policy | `iptables -L` | `Chain INPUT (policy ACCEPT)` | default policy |
## `lsof` Cheat Sheet
| Задача | Команда | Пример вывода | Что означает |
| --------------------------- | ---------------------- | ---------------------- | ----------------------- |
| Показать все открытые файлы | `lsof` | список процессов | все файлы |
| Найти процесс по порту | `lsof -i :80` | `nginx 1234 TCP *:80` | кто слушает порт |
| Показать сетевые соединения | `lsof -i` | `TCP 192.168.1.10:443` | активные соединения |
| TCP соединения | `lsof -i tcp` | `ESTABLISHED` | TCP |
| UDP соединения | `lsof -i udp` | `UDP *:53` | UDP |
| Процесс использующий файл | `lsof /var/log/syslog` | `rsyslogd` | процесс использует файл |
| Файлы процесса | `lsof -p 1234` | список | открытые файлы |
| Порты слушающие | `lsof -i -P -n` | `LISTEN` | открытые порты |
| Фильтр по IP | `lsof -i @10.42.0.36` | `ESTABLISHED` | соединения Pod |
| Фильтр по порту | `lsof -i :443` | `LISTEN` | HTTPS |
## Сравнительная таблица
| Характеристика | Socket | Endpoint (Linux) | Endpoint (K8s) |
| -------------- | ------------------- | ------------------- | ----------------------- |
| Что это | интерфейс процесса | участник соединения | backend Pod |
| Содержит | IP + port + process | IP + port | Pod IP + port |
| Где существует | OS kernel | network stack | Kubernetes API |
| Показывается | `ss`, `lsof` | `ss`, `netstat` | `kubectl get endpoints` |
## `nmap` Cheat Sheet
| Задача | Команда | Пример вывода | Что означает |
| ---------------------------- | ------------------------- | ------------------ | ---------------- |
| Сканировать один хост | `nmap 192.168.1.10` | `80/tcp open http` | открыт порт |
| Сканировать конкретный порт | `nmap -p 80 192.168.1.10` | `80/tcp open` | порт 80 |
| Сканировать несколько портов | `nmap -p 22,80,443 host` | `22 open` | несколько портов |
| Сканировать диапазон портов | `nmap -p 1-1000 host` | `22 open` | диапазон |
| Быстрое сканирование | `nmap -F host` | `80 open` | top ports |
| Определить сервис | `nmap -sV host` | `nginx 1.22` | версия сервиса |
| Определить OS | `nmap -O host` | `Linux 5.x` | ОС |
| Проверить сеть | `nmap 192.168.1.0/24` | список IP | активные хосты |
| Только ping | `nmap -sn 192.168.1.0/24` | host up | активные хосты |
| TCP SYN scan | `nmap -sS host` | `open` | stealth scan |
## 10 Useful `nmap` Commands for DevOps
|№|Задача|Команда|Что показывает|
|---|---|---|---|
|1|Быстрый скан портов|`nmap host`|стандартные 1000 портов|
|2|Проверить конкретный порт|`nmap -p 443 host`|открыт ли порт|
|3|Сканировать несколько портов|`nmap -p 22,80,443 host`|несколько сервисов|
|4|Сканировать диапазон портов|`nmap -p 1-65535 host`|полный скан|
|5|Определить сервис|`nmap -sV host`|версия сервиса|
|6|Быстрый скан|`nmap -F host`|топ популярных портов|
|7|Найти живые хосты|`nmap -sn 192.168.1.0/24`|discovery|
|8|Проверить firewall|`nmap -sS host`|stealth scan|
|9|Проверить SSL|`nmap --script ssl-cert -p 443 host`|TLS сертификат|
|10|Полный анализ|`nmap -A host`|сервисы + OS + traceroute|
## `openssl` Cheat Sheet for DevOps
|Задача|Команда|Что показывает|Пример результата|
|---|---|---|---|
|Проверить TLS соединение|`openssl s_client -connect host:443`|TLS handshake|сертификат|
|Проверить сертификат сайта|`openssl s_client -connect host:443 -servername host`|сертификат|issuer|
|Показать данные сертификата|`openssl x509 -text -noout -in cert.pem`|поля сертификата|CN|
|Проверить срок действия|`openssl x509 -enddate -noout -in cert.pem`|expiration|`notAfter`|
|Скачать сертификат сайта|`openssl s_client -connect host:443 -showcerts`|chain|cert chain|
|Проверить TLS версию|`openssl s_client -connect host:443 -tls1_2`|TLS1.2|handshake|
|Проверить cipher|`openssl ciphers`|список cipher|TLS_AES_256|
|Генерация private key|`openssl genrsa -out key.pem 2048`|ключ|RSA|
|Создать CSR|`openssl req -new -key key.pem -out csr.pem`|CSR|cert request|
|Проверить CSR|`openssl req -text -noout -verify -in csr.pem`|данные CSR|subject|
## 10 полезных Docker network debugging команд
| № | Команда | Что показывает | Когда использовать |
| --- | ---------------------------------------------- | ---------------------------- | --------------------------- |
| 1 | `docker network ls` | список всех docker сетей | понять topology сети |
| 2 | `docker network inspect <network>` | subnet, gateway, контейнеры | debugging connectivity |
| 3 | `docker inspect <container>` | IP контейнера и network mode | проверить network config |
| 4 | `docker exec -it <container> ip a` | интерфейсы контейнера | проверить eth0 |
| 5 | `docker exec -it <container> ip route` | routing table | понять default gateway |
| 6 | `docker exec -it <container> ping <ip>` | connectivity | проверить связь |
| 7 | `docker exec -it <container> nslookup service` | DNS docker | проверить service discovery |
| 8 | `docker exec -it <container> netstat -tulpn` | открытые порты | понять слушает ли сервис |
| 9 | `iptables -t nat -L -n` | NAT правила docker | debugging port mapping |
| 10 | `ip link` | bridge и veth интерфейсы | понять сетевую архитектуру |
## Таблица действий DevOps, когда нужно разбираться с **veth / Pod networking / CNI / namespace**.
|Шаг|Цель|Команда|Что увидим|Когда использовать|
|---|---|---|---|---|
|1|Посмотреть все интерфейсы на node|`ip link`|список интерфейсов (eth0, cni0, veth...)|первый шаг диагностики|
|2|Найти veth интерфейсы Pod|`ip link \| grep veth`|список veth интерфейсов|если ищем Pod interface|
|3|Посмотреть детали интерфейса|`ip addr show vethXXXX`|MAC, MTU, namespace|анализ конкретного Pod|
|4|Проверить bridge CNI|`ip link show cni0`|bridge Kubernetes сети|если Pod сеть не работает|
|5|Посмотреть какие интерфейсы подключены к bridge|`bridge link`|список veth подключенных к cni0|определить Pod интерфейсы|
|6|Найти network namespaces|`ls /var/run/netns`|список namespace|для поиска Pod namespace|
|7|Посмотреть интерфейсы внутри namespace|`ip netns exec <namespace> ip a`|eth0 Pod|посмотреть Pod сеть|
|8|Проверить routing внутри Pod|`ip netns exec <namespace> ip route`|маршруты Pod|проблемы с routing|
|9|Проверить ARP таблицу|`ip neigh`|MAC ↔ IP|диагностика L2|
|10|Проверить MTU сети|`ip link show`|MTU интерфейсов|если проблемы с overlay|
|11|Посмотреть bridge таблицу|`bridge fdb show`|MAC таблица bridge|debug L2 forwarding|
|12|Проверить iptables rules|`iptables -t nat -L -n -v`|kube-proxy правила|проблемы Service|
|13|Посмотреть kube-proxy правила|`iptables-save \| grep KUBE`|Kubernetes NAT rules|debug Service routing|
|14|Проверить IP Pod|`kubectl get pod -o wide`|Pod IP|понять какой Pod|
|15|Проверить network namespace Pod|`crictl inspect <container>`|network namespace|container runtime debug|
|16|Проверить connections Pod|`ss -tulnp`|открытые порты|сервис не отвечает|
|17|Проверить трафик Pod|`tcpdump -i vethXXXX`|сетевые пакеты|deep network debug|
|18|Проверить bridge трафик|`tcpdump -i cni0`|Pod traffic|overlay диагностика|
|19|Проверить overlay интерфейс|`ip link \| grep flannel`|flannel.1|overlay сети|
|20|Проверить VXLAN tunnel|`ip link show flannel.1`|VXLAN интерфейс|межнодовый трафик|
## Быстрый DevOps cheat sheet
| Что ищем | Команда |
| ------------------ | ------------------------- |
| Pod IP | `kubectl get pod -o wide` |
| Pod MAC | `ip netns exec <ns> ip a` |
| veth interface | `ip link` |
| bridge ports | `bridge link` |
| iptables rules | `iptables -t nat -L` |
| network namespaces | `ls /var/run/netns` |
| traffic debug | `tcpdump` |
## сновные команды `crictl`
|Команда|Назначение|Пример|Что показывает|
|---|---|---|---|
|`crictl ps`|список запущенных контейнеров|`crictl ps`|running containers|
|`crictl ps -a`|все контейнеры|`crictl ps -a`|включая остановленные|
|`crictl pods`|список Pod sandbox|`crictl pods`|Pod инфраструктура|
|`crictl images`|список образов|`crictl images`|docker images runtime|
|`crictl inspect`|информация о контейнере|`crictl inspect <container-id>`|JSON конфигурация|
|`crictl inspectp`|информация о Pod|`crictl inspectp <pod-id>`|Pod sandbox|
|`crictl logs`|логи контейнера|`crictl logs <container-id>`|stdout / stderr|
|`crictl exec`|выполнить команду|`crictl exec -it <container-id> sh`|shell внутри|
|`crictl stop`|остановить контейнер|`crictl stop <container-id>`|stop container|
|`crictl rm`|удалить контейнер|`crictl rm <container-id>`|remove container|
|`crictl rmp`|удалить Pod sandbox|`crictl rmp <pod-id>`|remove pod|
|`crictl pull`|скачать image|`crictl pull nginx`|pull image|
|`crictl stats`|ресурсы контейнера|`crictl stats`|CPU / memory|
|`crictl version`|версия runtime|`crictl version`|CRI версия|
|`crictl info`|информация runtime|`crictl info`|containerd / CRI-O|
---
## Полезные фильтры
|Команда|Что делает|
|---|---|
|`crictl ps --name nginx`|поиск контейнера|
|`crictl ps --state exited`|остановленные|
|`crictl pods --name kube`|поиск Pod|
|`crictl images --digests`|digest образов|
---
## Debugging команды (очень полезно)
|Задача|Команда|
|---|---|
|найти контейнер Pod|`crictl ps`|
|найти Pod sandbox|`crictl pods`|
|посмотреть network namespace|`crictl inspectp`|
|посмотреть PID контейнера|`crictl inspect`|
|посмотреть ресурсы|`crictl stats`|
|посмотреть логи|`crictl logs`|
## ctr vs crictl
|Характеристика|`crictl`|`ctr`|
|---|---|---|
|Назначение|инструмент для **CRI (Container Runtime Interface)**|нативный CLI **containerd**|
|Уровень|Kubernetes runtime|containerd internal|
|Используется kubelet|✅ да|❌ нет|
|Работает с CRI|✅ да|❌ нет|
|Работает напрямую с containerd API|❌|✅|
|Стабильность интерфейса|стабильный|может меняться|
|Подходит для Kubernetes debugging|✅ лучший выбор|⚠️ иногда|
|Подходит для containerd debugging|⚠️ ограничено|✅ лучший выбор|
|Namespace Kubernetes|автоматически `k8s.io`|нужно указывать вручную|
---
## Таблица всех столбцов vmstat
```bash
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 120000 20000 350000 0 0 1 2 100 200 5 2 90 3 0
```
| Колонка | Значение | Что показывает | Когда это проблема |
| --------- | ---------------- | ---------------------------------- | ------------------------------- |
| **r** | running | Количество процессов ожидающих CPU | > число CPU ядер |
| **b** | blocked | Процессы заблокированные на I/O | > 0 часто = disk bottleneck |
| **swpd** | swap used | Используемый swap (KB) | постоянно растёт |
| **free** | free memory | Свободная RAM | низкое значение не всегда плохо |
| **buff** | buffers | RAM используемая под block buffers | нормально |
| **cache** | page cache | файловый cache | нормально |
| **si** | swap in | данные из swap → RAM (KB/s) | >0 плохо |
| **so** | swap out | данные из RAM → swap | >0 плохо |
| **bi** | block in | блоки читаемые с диска | высокая активность диска |
| **bo** | block out | блоки записываемые на диск | высокая запись |
| **in** | interrupts | interrupts/sec | hardware/network load |
| **cs** | context switches | переключения контекста/sec | >100k часто перегруз |
| **us** | user CPU | CPU user space (%) | нормальная нагрузка |
| **sy** | system CPU | CPU kernel (%) | высокий = syscall heavy |
| **id** | idle | idle CPU (%) | свободный CPU |
| **wa** | IO wait | CPU ждёт диск (%) | >10-20% проблема |
| **st** | steal | CPU украден hypervisor | проблема в VM |