Kube/Pythonproduction course
Курс · RUREADME.md

Kubernetes для Python-разработчика

Полный практический курс на русском языке: от первого локального кластера до развёртывания, диагностики, безопасности и эксплуатации Python-сервиса в Kubernetes.

Открыть курс на сайте · Начать с главы 00 · Посмотреть полную карту курса · Открыть словарь

Материалы можно читать прямо на GitHub, локально в Markdown или как обычные HTML-страницы на публичном сайте. Например, первая глава доступна по адресу 00-diagnostic-and-local-cluster.html.

Содержание README

Зачем создан этот курс

Python-разработчик часто встречает Kubernetes уже на рабочем проекте. В этот момент легко выучить несколько команд kubectl, но так и не понять:

  • почему Pod был создан, заменён или не запустился;
  • как запрос доходит от Service до процесса Python;
  • чем readiness отличается от liveness;
  • почему Deployment, HPA и PDB могут влиять друг на друга;
  • где искать причину Pending, CrashLoopBackOff, ImagePullBackOff или OOMKilled;
  • какие настройки нужны для безопасной и устойчивой эксплуатации.

Курс закрывает этот разрыв. Его цель — не заставить запомнить YAML и набор команд, а научить понимать причину поведения системы и подтверждать выводы фактами: состоянием объектов, Events, логами, метриками и сетевыми проверками.

Все темы связаны одним проектом. Небольшой FastAPI-сервис постепенно проходит путь от отдельного Pod до конфигурации, Service, хранилища, RBAC, проверок здоровья, масштабирования, rollback и итогового эксплуатационного проекта.

Для кого он предназначен

Курс подходит:

  • Python Backend Developer, который уже пишет и отлаживает веб-сервисы;
  • разработчику, который готовится к backend/platform/SRE-собеседованию;
  • инженеру, которому нужно уверенно читать Kubernetes-манифесты;
  • человеку, который умеет работать в Linux, но пока не понимает Kubernetes;
  • разработчику, которому нужна локальная практика без облачного аккаунта.

Перед началом желательно понимать:

  • основные команды Linux и работу командной оболочки;
  • процессы, переменные окружения и файловую систему;
  • основы TCP, HTTP и DNS;
  • как устроен простой Python web service;
  • синтаксис YAML;
  • что такое container image, tag, registry, build и run.

Отдельного курса по Docker здесь нет. Все нужные контейнерные действия показаны, но устройство Docker подробно не преподаётся.

Что вы научитесь делать

После полного прохождения вы сможете:

  1. Объяснить архитектуру Kubernetes и путь запроса к API server.
  2. Читать объекты Kubernetes: apiVersion, kind, metadata, spec, status, labels, selectors и owner references.
  3. Выбирать между Pod, Deployment, Job, CronJob, StatefulSet и DaemonSet.
  4. Собрать Python-образ и запустить его в локальном кластере kind.
  5. Настроить ConfigMap, Secret, Service, DNS, Ingress, NetworkPolicy и PVC.
  6. Настроить startup-, readiness- и liveness-probes, requests и limits.
  7. Выполнить rollout, найти неудачное обновление и сделать rollback.
  8. Проверить HPA, PDB, drain и распределение Pod по узлам.
  9. Ограничить права через ServiceAccount и RBAC и применить Pod Security restricted.
  10. Диагностировать восемь намеренно сломанных сценариев на основе доказательств.
  11. Работать с Kustomize и понимать назначение Helm и GitOps.
  12. Подготовить итоговый проект, runbook, модель угроз и проверяемое описание опыта для резюме и собеседования.

Что находится в репозитории

Kubernetes_course/
├── README.md                         # этот файл
└── course-kubernetes-python/
    ├── MAIN.md                       # подробное описание и карта курса
    ├── 00-...md — 11-...md           # основные главы
    ├── 90-kubectl-labs.md            # последовательные лабораторные
    ├── 91-capstone.md                 # итоговый проект
    ├── 92-interview-and-cv.md         # собеседование и резюме
    ├── 93-skill-checklist.md          # практический экзамен и checklist
    ├── 98-glossary.md                 # словарь терминов
    ├── 99-sources.md                  # первичные источники и версии
    ├── app/                           # учебный FastAPI-сервис
    ├── cluster/                       # конфигурация локального kind-кластера
    ├── manifests/
    │   ├── base/                      # базовые Kubernetes-ресурсы
    │   ├── overlays/dev/              # настройки учебной среды
    │   ├── overlays/prod/             # пример production-настроек
    │   ├── labs/                      # дополнительные ресурсы лабораторных
    │   └── broken/                    # восемь намеренно сломанных сценариев
    ├── pages/                         # страницы и API сайта на Next.js
    ├── styles/                        # стили сайта
    ├── lib/                           # каталог курса и встроенный Markdown
    ├── scripts/                       # сборка содержимого и Sites-адаптация
    ├── .openai/hosting.json           # связь проекта с ChatGPT Sites
    ├── open-next.config.ts            # конфигурация OpenNext
    ├── wrangler.jsonc                 # конфигурация runtime сайта
    └── package.json                   # команды и зависимости сайта

Три части проекта

ЧастьНазначениеГлавная точка входа
Учебные материалыТеория, команды, упражнения, ожидаемые результаты и разбор отказовMAIN.md
Kubernetes-лабораторияFastAPI-сервис, kind-кластер и готовые манифесты90-kubectl-labs.md
Публичный сайтПоказывает Markdown как HTML и хранит отметки о прогрессе в браузереkubernetes-python-course.ksenyag.chatgpt.site

Сайт и учебная лаборатория — разные среды. Сайт не создаёт Kubernetes-кластер и не запускает учебный FastAPI-контейнер. Он только удобно показывает материалы и имеет собственные небольшие API-адреса для проверки среды выполнения Sites.

Программа курса

Курс зафиксирован на срезе исследования 2026-07-29. В упражнениях закреплены kubectl v1.36.2, kind v0.32.0 и образ узла Kubernetes v1.36.1. Закреплённые версии делают лабораторные воспроизводимыми. Перед использованием в рабочем проекте всегда проверяйте актуальные версии и правила совместимости.

МатериалО чём онВремя
О курсе и полная картаРезультаты, диагностический тест, зависимости глав и критерии завершения15–30 мин
00. Диагностика и локальный кластерПроверка Linux, установка инструментов, создание и удаление kind-кластера2–3 ч
01. Архитектура и модель APIControl plane, reconciliation, spec/status, labels и ownership3 ч
02. Pod и workload-ресурсыЖизненный цикл Pod и выбор контроллера рабочей нагрузки4 ч
03. Конфигурация и секретыConfigMap, Secret, env, volumes, обновление и безопасная доставка3 ч
04. Service, DNS, Ingress и NetworkPolicyСетевой путь от клиента до Python-процесса5 ч
05. Хранилище и состояниеVolumes, PV, PVC, StorageClass, snapshots и backup4 ч
06. Здоровье, ресурсы и планированиеProbes, graceful shutdown, QoS, OOM и scheduler5 ч
07. Rollout, масштабирование и доступностьRollingUpdate, rollback, HPA, PDB и drain4 ч
08. Безопасность и мультитенантностьRBAC, ServiceAccount, SecurityContext, PSS и admission5 ч
09. Наблюдаемость и диагностикаEvents, logs, metrics, exec, debug и системный поиск причины5 ч
10. Управление конфигурациейRaw YAML, Kustomize, Helm, drift и GitOps3 ч
11. Промышленная эксплуатацияОбновления, API lifecycle, backups, capacity, SLO и стоимость5 ч
90. Лабораторные с kubectl14 последовательных лабораторных и восемь расследований8–12 ч
91. Итоговый проектАрхитектура, модель угроз, SLO, rollout, rollback и runbook10–16 ч
92. Собеседование и резюмеВопросы, STAR-истории и честные формулировки опыта3 ч
93. Проверка навыковПрактический экзамен и доказательства освоенных навыков2–3 ч
98. СловарьПростые определения Kubernetes-терминов со ссылками из главсправочник
99. ИсточникиОфициальная документация, версии API и дата проверкисправочник

Полный маршрут занимает примерно 66–83 часа активной работы. Короткий маршрут для подготовки к работе занимает 35–45 часов.

Требования к компьютеру

Требования ниже относятся именно к лабораторным работам. Чтобы только читать курс на сайте, нужен любой современный браузер.

Аппаратные и системные требования

Что нужноТребованиеЗачем
Операционная системаLinux x86_64 или aarch64Команды и пути курса написаны и проверены для Linux
CPUне меньше 4 логических CPUkind запускает один control-plane и два worker-узла
Оперативная памятьне меньше 8 GiBУзлы Kubernetes, системные Pods и учебное приложение работают одновременно
Свободное местоне меньше 20 GiBОбразы контейнеров, слои, логи и временные файлы
cgroupcgroup v2 (cgroup2fs)Современное управление ресурсами контейнеров
Интернетстабильный HTTPS-доступЗагрузка kubectl, kind, образов узлов, Python-образа и дополнений
Права пользователявозможность запускать Docker/Podman и один раз использовать sudo для установки программСоздание контейнеров-узлов и установка CLI

Курс создавался на Ubuntu 24.04.3 LTS, Linux 6.8, x86_64. Другой современный Linux-дистрибутив тоже подходит, но команды установки Docker/Podman могут отличаться. На компьютере с ровно 8 GiB RAM лучше закрыть тяжёлые приложения на время лабораторных.

Проверьте компьютер до установки:

uname -a
cat /etc/os-release
nproc
free -h
df -h .
stat -fc %T /sys/fs/cgroup

Ожидаемый результат: подходящая архитектура, не меньше 4 CPU, 8 GiB RAM, 20 GiB свободного места и cgroup2fs.

Обязательные программы

ПрограммаВерсия или условиеКомментарий
Bash и стандартные Linux-инструментыактуальные для дистрибутиваИспользуются shell, test, grep, sha256sum и другие базовые команды
Gitлюбая поддерживаемая версияНужен для получения репозитория
curl и sha256sumдоступны в PATHЗагрузка инструментов и проверка контрольных сумм
Docker Engineработающий ServerОсновной вариант для запуска kind
или Podmanсовместимый с kindПотребуется дополнительная настройка provider, особенно в rootless-режиме
kubectlv1.36.2 для точного повторения курсаKubernetes CLI
kindv0.32.0Создаёт локальные узлы Kubernetes как контейнеры

Проверяйте не только наличие Docker CLI, но и работу сервера:

docker version
docker run --rm hello-world

Обе команды должны завершиться с кодом 0; в docker version должна быть секция Server. Точные команды установки kubectl и kind с проверкой SHA-256 находятся в главе 00.

Что не требуется для основного курса

  • Облачный аккаунт и платный Kubernetes-кластер не нужны.
  • Python на хосте не нужен: приложение собирается внутри образа контейнера.
  • Node.js и npm не нужны, если вы только читаете курс и выполняете Kubernetes лабораторные.
  • Helm не обязателен для базовых лабораторных; он изучается как подход к управлению конфигурацией.

Для отдельных дополнительных упражнений могут понадобиться Metrics Server, контроллер Ingress/Gateway, cloud-provider-kind, Go, Helm или kubeconform. Каждая такая зависимость отмечена в соответствующей главе и не должна считаться уже установленной.

Требования для разработки сайта

Если вы хотите изменить или локально запустить не Kubernetes-лабораторию, а сайт курса, дополнительно нужны:

  • Node.js 22 или новее;
  • npm;
  • около 1 GiB дополнительного места для node_modules и результатов сборки.

Быстрый старт

1. Получить материалы

git clone https://github.com/evinlort/Kubernetes_course.git
cd Kubernetes_course/course-kubernetes-python

Начните с MAIN.md, затем выполните диагностику из главы 00. Все команды лабораторных нужно запускать из каталога course-kubernetes-python.

2. Установить CLI

Следуйте разделу «Установка инструментов с проверкой». По инструкции бинарные файлы помещаются в локальный каталог .tools:

export PATH="$PWD/.tools:$PATH"
kubectl version --client --output=yaml
kind version
docker version

Не добавляйте содержимое .tools в Git.

3. Создать учебный кластер

Перед созданием сохраните имя текущего контекста, как показано в главе 00. Курс использует кластер kube-course и контекст kind-kube-course.

kind create cluster \
  --name kube-course \
  --config cluster/kind-config.yaml \
  --image kindest/node:v1.36.1@sha256:3489c7674813ba5d8b1a9977baea8a6e553784dab7b84759d1014dbd78f7ebd5 \
  --wait 5m

test "$(kubectl config current-context)" = "kind-kube-course"
kubectl wait --for=condition=Ready nodes --all --timeout=180s
kubectl get nodes -o wide

Должны появиться три готовых узла: один control-plane и два worker.

4. Собрать и загрузить учебное приложение

docker build --file app/Containerfile --tag kube-python-course:1.0.0 app
kind load docker-image kube-python-course:1.0.0 --name kube-course

5. Развернуть dev-вариант

Используйте только учебное значение Secret. Не подставляйте настоящий ключ:

kubectl apply -f manifests/base/namespace.yaml
kubectl create secret generic python-api-secret \
  --namespace kube-course \
  --from-literal=API_KEY=local-course-placeholder \
  --dry-run=client -o yaml | kubectl apply -f -
kubectl apply -k manifests/overlays/dev
kubectl rollout status deployment/python-api -n kube-course --timeout=180s
kubectl get pods,service,endpointslice -n kube-course

Проверка через локальный проброс порта (port-forward):

kubectl port-forward -n kube-course service/python-api 8000:80

В другом терминале:

curl --fail http://127.0.0.1:8000/health/live
curl --fail http://127.0.0.1:8000/health/ready
curl --fail http://127.0.0.1:8000/config

Это только короткая проверка. Полная последовательность с ожидаемым результатом, восстановлением после ошибок и очисткой находится в 90-kubectl-labs.md.

6. Удалить учебную среду

Сначала остановите port-forward сочетанием Ctrl+C. Затем ещё раз проверьте контекст и удалите только кластер курса:

test "$(kubectl config current-context)" = "kind-kube-course"
kubectl delete namespace kube-course --wait=true
kind delete cluster --name kube-course

Если до курса у вас был другой Kubernetes-контекст, восстановите его по инструкции главы 00.

Как проходить курс

Полный маршрут: 66–83 часа

  1. Пройдите диагностический тест в MAIN.md.
  2. Последовательно изучите главы 00–02.
  3. После главы 02 можно параллельно изучать конфигурацию, сеть и хранилище (главы 03–05).
  4. Затем пройдите главы 06–11.
  5. Выполните все лабораторные главы 90.
  6. Сделайте итоговый проект главы 91.
  7. Подготовьте ответы и описание опыта по главе 92.
  8. Подтвердите навыки командами и наблюдениями из главы 93.

Короткий маршрут: 35–45 часов

Для подготовки к backend-вакансии пройдите главы 00–09, основные лабораторные 00–10, итоговый проект до уровня job-ready, затем главы 92 и 93. Главы про GitOps и промышленную эксплуатацию можно сначала прочитать обзорно, но к ним нужно вернуться перед работой с настоящим production-кластером.

Правильный способ работать с упражнениями

Не ограничивайтесь копированием команд. Для каждой лабораторной сохраните:

Дата, версия кластера и контекст:
Команда и код завершения:
Что было видно в status, Events, logs или ответе HTTP:
Почему это произошло:
Как была проверена гипотеза:
Как выполнено исправление и восстановление:
Что локальный kind-кластер не смог доказать:

Отмечайте навык выполненным только после реальной команды и объяснения результата. Скриншот без команды, версии и контекста — слабое доказательство.

Если термин непонятен, переходите по встроенной ссылке в словарь. В словаре есть определения Pod, kind node, Service, controller, reconciliation, RBAC, PVC, HPA и других специальных терминов.

Учебное приложение и манифесты

FastAPI-сервис

Каталог app/ содержит небольшое приложение на FastAPI. Оно специально сделано наблюдаемым и управляемым из Kubernetes.

Основные HTTP-адреса:

EndpointНазначение
GET /Основные сведения о Pod, node и конфигурации
GET /configЗначения из env и смонтированного ConfigMap без раскрытия Secret
GET /health/liveПроверка, что процесс жив
GET /health/readyПроверка готовности принимать трафик
GET /health/drainПеревод readiness в состояние drain перед остановкой
GET /stateЧтение учебного счётчика
POST /state/incrementИзменение счётчика для упражнений с хранилищем
GET /workИмитация обычной работы
GET /burnНагрузка CPU для упражнений HPA
GET /metricsМетрики в формате Prometheus

Containerfile собирает Python 3.13-образ, запускает процесс от пользователя 10001:10001 и слушает порт 8000.

Манифесты

В manifests/base/ находятся Namespace, ConfigMap, Deployment, ServiceAccount, Service, Ingress, NetworkPolicy, PVC, PDB, HPA и RBAC. Secret с настоящим значением намеренно не включён в Kustomize. Файл secret.example.yaml — только пример структуры.

Варианты окружений:

  • manifests/overlays/dev уменьшает ресурсы и число реплик для локальной практики;
  • manifests/overlays/prod показывает более строгие настройки, но сам по себе не превращает локальный кластер в production;
  • manifests/labs содержит отдельный Pod, storage-клиент, проверку RBAC и генератор нагрузки;
  • manifests/broken содержит сценарии Pending, CrashLoopBackOff, ImagePullBackOff, неверного Service selector, сломанной probe, OOM, непривязанного PVC и запрета DNS.

Не исправляйте файлы в manifests/broken заранее. Их задача — дать воспроизводимый отказ для расследования.

Сайт курса

Публичный адрес: https://kubernetes-python-course.ksenyag.chatgpt.site/

Сайт:

  • показывает карту курса и две траектории обучения;
  • открывает каждый Markdown-файл по прямому адресу /<имя>.html;
  • преобразует внутренние ссылки .md в HTML-ссылки;
  • даёт переход к исходному Markdown на GitHub;
  • показывает словарь рядом с главами;
  • хранит отметки о завершённых главах только в текущем браузере.

Запуск сайта локально

cd course-kubernetes-python
npm install
npm run dev

После запуска откройте http://localhost:3000.

Основные команды сайта

КомандаЧто делает
npm run devЗапускает Next.js для локальной разработки
npm run typecheckПроверяет TypeScript без создания сборки
npm run buildВстраивает Markdown и собирает Next.js
npm run build:sitesСоздаёт OpenNext/Cloudflare-сборку для ChatGPT Sites
npm run preview:sitesЛокально запускает собранный Sites runtime

Список глав, названия и порядок находятся в lib/course.ts. Во время сборки scripts/generate-course-content.mjs собирает Markdown в lib/course-content.generated.json. Этот автоматически созданный файл не следует редактировать вручную.

API в pages/api относится только к сайту. Оно повторяет health/config/metrics форму учебного сервиса, но не заменяет FastAPI-приложение из app/ и не является доказательством работы Kubernetes.

Проверка изменений

Если изменился только Markdown

  1. Проверьте, что все относительные ссылки ведут к существующим файлам.
  2. Добавьте незнакомые Kubernetes-термины в 98-glossary.md и поставьте ссылки при их использовании.
  3. Соберите сайт: npm run build.
  4. Откройте изменённую страницу локально и проверьте таблицы, code blocks, заголовки и ссылки.

Если изменились манифесты

Сначала отрендерите оба окружения:

kubectl kustomize manifests/overlays/dev >/tmp/kube-course-dev.yaml
kubectl kustomize manifests/overlays/prod >/tmp/kube-course-prod.yaml

При наличии учебного кластера выполните серверную проверку:

test "$(kubectl config current-context)" = "kind-kube-course"
kubectl apply --dry-run=server -f /tmp/kube-course-dev.yaml
kubectl diff -k manifests/overlays/dev

kubectl apply --dry-run=client не заменяет серверную схему, admission и авторизацию. Успешный dry-run не доказывает, что Pod будет запланирован и образ запустится.

Если изменился сайт

npm run typecheck
npm run build
npm run build:sites

После этого проверьте главную страницу, несколько *.html-глав, переходы между ними и /api/health/ready.

Безопасная работа

Этот репозиторий содержит команды, которые создают и удаляют Kubernetes-объекты. Перед каждой изменяющей командой проверяйте контекст:

kubectl config current-context
test "$(kubectl config current-context)" = "kind-kube-course"

Основные правила:

  • не запускайте сломанные манифесты в рабочем или чужом кластере;
  • явно указывайте namespace kube-course;
  • не печатайте и не сохраняйте kubeconfig, токены и реальные Secret;
  • не помещайте настоящий ключ в secret.example.yaml;
  • не используйте sudo kubectl;
  • перед drain запомните имя узла и обязательно выполните uncordon;
  • удаляйте только кластер с точным именем kube-course;
  • не удаляйте каталог ~/.kube и не заменяйте чужой kubeconfig;
  • перед публикацией диагностических файлов проверяйте их на учётные данные.

Что уже проверено

При подготовке материалов были проверены:

  • Python syntax и HTTP-поведение учебного приложения;
  • YAML-файлы и YAML-блоки в Markdown;
  • детерминированный Kustomize render для dev и prod;
  • Kubernetes-схемы через kubeconform;
  • внутренние ссылки, ссылки на манифесты и внешние первичные источники;
  • отсутствие :latest, cluster-admin и privileged workload в применяемых ресурсах;
  • сборка и прямые HTML-маршруты сайта.

Точные версии инструментов, количество проверенных ресурсов и границы проверки описаны в конце MAIN.md.

Ограничения курса

  • kind — учебный локальный кластер. Он не доказывает поведение конкретного cloud provider, managed control plane, production CNI/CSI или внешнего Load Balancer.
  • Принятый API server манифест ещё не доказывает успешное планирование и запуск.
  • NetworkPolicy работает только при поддержке выбранного CNI.
  • Ingress требует установленного controller; одного объекта Ingress мало.
  • HPA по CPU требует Metrics Server.
  • Локальный PVC не заменяет проверку резервного копирования и восстановления настоящего хранилища.
  • Уровень production-ready нельзя подтвердить только лабораторией в kind. Для него нужны доказательства в целевой среде, SLO, monitoring, восстановление, политика обновлений и реальные эксплуатационные процедуры.
  • Даты и версии в курсе — воспроизводимый срез, а не обещание вечной актуальности. Для рабочего проекта сверяйтесь с 99-sources.md и свежей официальной документацией.

Как предложить изменение

  1. Создайте отдельную ветку.
  2. Меняйте только связанные с задачей материалы.
  3. Не редактируйте автоматически созданный lib/course-content.generated.json вручную.
  4. Для новой главы добавьте Markdown-файл и запись в lib/course.ts.
  5. Добавьте определения новых специальных терминов в словарь.
  6. Выполните подходящие проверки из раздела выше.
  7. В pull request укажите, что изменилось, как это проверено и что осталось непроверенным.

Лицензия

В репозитории пока нет отдельного файла LICENSE. Публичный доступ к исходникам сам по себе не задаёт условия копирования и распространения. Перед повторным использованием материалов за пределами личного обучения согласуйте условия с владельцем репозитория.


Лучшее место для начала — 00-diagnostic-and-local-cluster.md. Если встретился незнакомый термин, сразу откройте 98-glossary.md, а затем вернитесь к упражнению и проверьте термин на практике.