Kubernetes
Полный курс теории: от первого Pod до разбора инцидентов. Читать бесплатно, без ограничений.
Основы
YAML, зачем нужен оркестратор, устройство кластера, первый Pod и рабочий минимум kubectl.
Минимум синтаксиса который нужен чтобы читать манифесты.
Что k8s делает за тебя когда упала нода или вырос трафик.
Кто с кем общается в кластере. Большая схема и короткие описания компонентов.
Из чего состоит манифест Pod, какие у него фазы и два способа его создать.
Как переопределить запуск контейнера и что кластер делает после его завершения.
Как получить готовый каркас манифеста одной командой и найти нужное поле без интернета.
Набор команд, которыми ресурсы создают без YAML, и когда каждая из них уместна.
Что у живого Pod можно поменять, что нельзя и как обойти ограничение.
Как кластер делят на области, какие ресурсы в них не попадают и по каким правилам kubectl выбирает namespace.
По каким меткам объекты кластера находят друг друга и как их фильтровать через -l.
Приёмы, которые экономят минуты в консоли: короткий alias, переменные под флаги и vim под YAML.
Кластер на своём компьютере
Где практиковаться: kind, k3d, minikube и другие варианты. Сравнение, установка, типовые грабли.
Три семьи локальных кластеров, честная таблица версий и лицензий, выбор под macOS, Windows и Linux.
Как поставить kubectl нужной версии, где живёт конфиг подключения и как не запустить учебную команду в прод.
Как kind поднимает Kubernetes внутри Docker, как сделать multi-node, пробросить порты наружу и получить работающий Ingress.
Самый быстрый локальный кластер, что приезжает вместе с k3s из коробки и почему стоит посмотреть на темп релизов проекта.
Чем minikube отличается от kind и k3d, какую версию Kubernetes он даёт на самом деле и почему порты тут отдельная тема.
Docker Desktop, Rancher Desktop, OrbStack, colima и Podman Desktop: какой кластер внутри, что с портами и лицензией.
metrics-server для kubectl top, ситуация с закрытым ingress-nginx, Gateway API и StorageClass.
Кластер на своём сервере или VPS: что ставить, какие порты открывать и почему kubeadm стоит трогать только ради понимания control plane.
Рабочие нагрузки
ReplicaSet, Deployment, DaemonSet, Job и CronJob, StatefulSet, автоскейлинг и стратегии выката.
Контроллер, который сам восстанавливает нужное число копий Pod, и почему его почти никогда не пишут напрямую.
Как Deployment управляет ReplicaSet, что означают колонки READY и UP-TO-DATE, какие поля задают в реальных манифестах.
Как Deployment переливает трафик со старого ReplicaSet на новый, что делают maxSurge и maxUnavailable, откуда берутся ревизии.
Где Kubernetes хранит историю релизов и что на самом деле делает kubectl rollout undo с ReplicaSet.
Контроллер для агентов, которые обязаны быть на каждой машине: как он считает реплики, при чём тут nodeSelector и taint.
Контроллер для миграций и бэкапов: completions, backoffLimit, restartPolicy и почему Job нельзя чистить удалением Pod.
Расписание в UTC, concurrencyPolicy, лимиты истории и другие места, где CronJob неприятно удивляет.
Четыре гарантии StatefulSet, per-pod DNS через clusterIP None и как volumeClaimTemplates выдаёт каждой реплике свой диск.
Как HPA считает нужное число реплик, почему без resources.requests он молчит и что делает блок behavior.
Два контура и один Service-переключатель: как получить мгновенный откат и чем за это платят.
Доля трафика через соотношение реплик: как это устроено на голом Service, где точность врёт и когда пора брать service mesh.
Конфигурация
Переменные окружения, ConfigMap и Secret, init- и sidecar-контейнеры.
Поле env в spec контейнера: литералы, valueFrom, подстановка $(VAR) и почему env не обновляется на лету.
Три способа отдать настройки в Pod из ConfigMap и разница между ними при обновлении данных.
Чем Secret отличается от ConfigMap, какие бывают типы и что на самом деле защищает секреты в кластере.
Что делает флаг immutable у Secret и ConfigMap, зачем он нужен и как ротировать данные, когда правки запрещены.
Как поля command и args перебивают ENTRYPOINT и CMD образа и почему контейнер иногда уходит в Completed за секунду.
Контейнеры, которые отрабатывают до основных: порядок запуска, типичные сценарии и превращение init в native sidecar.
Второй контейнер рядом с основным: общий emptyDir, tail -F и разница между легаси-формой и native sidecar.
Три роли для соседних контейнеров в одном Pod и признак, по которому между ними выбирают.
Сеть
Service всех типов, DNS кластера, Endpoints, NetworkPolicy, Ingress и Gateway API.
Как группа Pod получает один стабильный адрес и DNS-имя внутри кластера.
Самый прямолинейный способ пустить трафик снаружи в кластер и его цена.
Как resolv.conf, search-домены и ndots превращают curl http://web в адрес Service.
Откуда Service берёт список адресов, почему Endpoints уступил место EndpointSlice и что обнуляет список.
Что меняется, когда Service отдаёт клиенту список адресов Pod вместо одного виртуального IP.
Как правилами по меткам закрыть Pod от лишнего трафика и где прячется ошибка с одним дефисом.
Один вход на 80/443 и правила, которые раскидывают трафик по Service в зависимости от домена и пути.
Почему роутинг разнесли на GatewayClass, Gateway и HTTPRoute и чем это отличается от Ingress.
Хранилище
Как PVC и PV дают приложению постоянный диск, что означают accessModes и почему PVC остаётся в Pending без Pod.
provisioner, reclaimPolicy и volumeBindingMode: три поля, которые решают, как и когда под PVC появится реальный диск.
Планирование
requests и limits, nodeSelector, affinity, taints, PodDisruptionBudget.
Чем requests отличаются от limits, откуда берутся единицы m и Mi, почему CPU троттлится, а память убивает Pod.
Что делает поле spec.nodeName, чем оно опасно в проде и при чём тут static pods control-plane.
Как labels на нодах и spec.nodeSelector делят кластер по назначению и почему Pod уходит в Pending при опечатке.
Жёсткие и мягкие правила размещения, операторы matchExpressions и где в nodeSelectorTerms прячется OR.
Как нода отгораживается от чужих Pod, чем отличаются NoSchedule, PreferNoSchedule и NoExecute, что писать в tolerations.
Почему toleration без affinity не удерживает Pod на выделенной ноде, а affinity без toleration оставляет его в Pending.
Чем контролируемое выселение отличается от аварийного, как minAvailable и maxUnavailable останавливают kubectl drain.
Безопасность
Поля securityContext, которые превращают обычный контейнер в non-root процесс с урезанными правами и readonly-корнем.
Под какой identity код внутри Pod ходит в API кластера, откуда берётся токен и почему automount стоит выключать.
Четыре объекта RBAC, разбор полей Role и RoleBinding, и kubectl auth can-i как способ не гадать над 403.
Наблюдаемость
Откуда kubectl берёт логи, какие флаги реально используют и почему --previous иногда возвращает пустоту.
Откуда kubectl top берёт цифры, как читать милликоры и почему без metrics-server команда не работает.
Чем readiness отличается от liveness, зачем нужна startupProbe и как выглядят минимальные поля probe в манифесте.
Kustomize и Helm
Как перестать копипастить манифесты между dev и prod.
Как kustomization.yaml собирает разрозненные YAML в одну единицу и почему Kustomize не шаблонизатор.
namePrefix, labels, namespace и подмена образа: правки, которые накрывают всю группу ресурсов сразу.
Точечная правка одного ресурса: strategic merge patch, формат JSON 6902 и как выбирать цель.
Схема base плюс overlays: один источник манифестов и разные конфигурации сред без копипасты.
configMapGenerator собирает ConfigMap из literals и файлов, а хеш в имени заставляет Pod перезапуститься при правке.
secretGenerator и честный разбор того, что base64 в Secret ничего не защищает.
Из чего состоит чарт, что Helm 3 хранит в кластере после установки и как настроить релиз через --set.
Порядок наложения значений, слияние нескольких файлов и правила, по которым Helm сливает словари и списки.
Ревизии релиза, история в Secret, откат одной командой и почему upgrade иногда теряет ранее заданные values.
Разбор поломок
ImagePullBackOff, CrashLoop, Pending, 502, упавший CoreDNS. Симптом, диагностика, причина, лечение.
Почему Pod не может скачать образ, где в describe лежит настоящий текст ошибки и что с этим делают.
Как отличить упавшее приложение от криво настроенной probe и почему логи нужно читать с флагом --previous.
Что означает FailedScheduling, чем requests отличаются от limits и почему нода с 4 ядрами не даст 4 ядра.
Разбор CreateContainerConfigError: где Pod ссылается на внешние объекты и почему после создания ConfigMap перезапуск не нужен.
Как разобрать ошибку 403 от apiserver по словам и проверить права через kubectl auth can-i, не гадая.
Почему пустой список endpoints это главный симптом, как сверить selector с метками Pod и с какой стороны чинить расхождение.
Разбор инцидента, где Pod здоров, но Service форвардит трафик в закрытый порт.
Как отличить общий отказ DNS от проблемы одного Service и по какой цепочке искать причину.
Почему rollout прошёл «зелёным», а сервис лёг, и как настроить probe, чтобы следующий раскат встал сам.
CreateContainerConfigError, восстановление конфига и почему Pod-ы не чинятся сами.
Почему сервис падает без нагрузки и как подобрать параметры probe под холодный старт.
Как читать Forbidden из пайплайна, воспроизводить права через auth can-i и собирать минимальную Role для деплоя.
Дальше
Как кластер узнаёт про новый kind, чем определение типа отличается от объекта и почему без контроллера CRD остаётся просто записью в базе.
Почему namespace нельзя поменять на лету, какие поля чистить в экспорте и в каком порядке переносить объекты, чтобы сервис не лёг.
Где заканчиваются возможности Deployment, какую работу забирает оператор, какие операторы встречаются в проде и почему их не стоит ставить на каждое приложение.
Паттерны приложений
Почему приложение должно корректно завершаться по SIGTERM, как дослуживать запросы и не рвать соединения при деплое.
Чем liveness отличается от readiness, зачем приложению отдельный /healthz и как это связано с балансировкой и оркестратором.
Почему конфиг держат в окружении, что значит «один артефакт на все среды» и какие принципы 12-factor про эксплуатацию.
Как сервисы переживают чужие сбои: таймауты, безопасные ретраи с backoff и circuit breaker против каскадных отказов.
Почему повторный запрос не должен создавать дубль: идемпотентные методы, ключ идемпотентности и безопасные ретраи.