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 подробно не преподаётся.
Что вы научитесь делать
После полного прохождения вы сможете:
- Объяснить архитектуру Kubernetes и путь запроса к API server.
- Читать объекты Kubernetes:
apiVersion,kind,metadata,spec,status, labels, selectors и owner references. - Выбирать между Pod, Deployment, Job, CronJob, StatefulSet и DaemonSet.
- Собрать Python-образ и запустить его в локальном кластере
kind. - Настроить ConfigMap, Secret, Service, DNS, Ingress, NetworkPolicy и PVC.
- Настроить startup-, readiness- и liveness-probes, requests и limits.
- Выполнить rollout, найти неудачное обновление и сделать rollback.
- Проверить HPA, PDB, drain и распределение Pod по узлам.
- Ограничить права через ServiceAccount и RBAC и применить Pod Security
restricted. - Диагностировать восемь намеренно сломанных сценариев на основе доказательств.
- Работать с Kustomize и понимать назначение Helm и GitOps.
- Подготовить итоговый проект, 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. Архитектура и модель API | Control plane, reconciliation, spec/status, labels и ownership | 3 ч |
| 02. Pod и workload-ресурсы | Жизненный цикл Pod и выбор контроллера рабочей нагрузки | 4 ч |
| 03. Конфигурация и секреты | ConfigMap, Secret, env, volumes, обновление и безопасная доставка | 3 ч |
| 04. Service, DNS, Ingress и NetworkPolicy | Сетевой путь от клиента до Python-процесса | 5 ч |
| 05. Хранилище и состояние | Volumes, PV, PVC, StorageClass, snapshots и backup | 4 ч |
| 06. Здоровье, ресурсы и планирование | Probes, graceful shutdown, QoS, OOM и scheduler | 5 ч |
| 07. Rollout, масштабирование и доступность | RollingUpdate, rollback, HPA, PDB и drain | 4 ч |
| 08. Безопасность и мультитенантность | RBAC, ServiceAccount, SecurityContext, PSS и admission | 5 ч |
| 09. Наблюдаемость и диагностика | Events, logs, metrics, exec, debug и системный поиск причины | 5 ч |
| 10. Управление конфигурацией | Raw YAML, Kustomize, Helm, drift и GitOps | 3 ч |
| 11. Промышленная эксплуатация | Обновления, API lifecycle, backups, capacity, SLO и стоимость | 5 ч |
| 90. Лабораторные с kubectl | 14 последовательных лабораторных и восемь расследований | 8–12 ч |
| 91. Итоговый проект | Архитектура, модель угроз, SLO, rollout, rollback и runbook | 10–16 ч |
| 92. Собеседование и резюме | Вопросы, STAR-истории и честные формулировки опыта | 3 ч |
| 93. Проверка навыков | Практический экзамен и доказательства освоенных навыков | 2–3 ч |
| 98. Словарь | Простые определения Kubernetes-терминов со ссылками из глав | справочник |
| 99. Источники | Официальная документация, версии API и дата проверки | справочник |
Полный маршрут занимает примерно 66–83 часа активной работы. Короткий маршрут для подготовки к работе занимает 35–45 часов.
Требования к компьютеру
Требования ниже относятся именно к лабораторным работам. Чтобы только читать курс на сайте, нужен любой современный браузер.
Аппаратные и системные требования
| Что нужно | Требование | Зачем |
|---|---|---|
| Операционная система | Linux x86_64 или aarch64 | Команды и пути курса написаны и проверены для Linux |
| CPU | не меньше 4 логических CPU | kind запускает один control-plane и два worker-узла |
| Оперативная память | не меньше 8 GiB | Узлы Kubernetes, системные Pods и учебное приложение работают одновременно |
| Свободное место | не меньше 20 GiB | Образы контейнеров, слои, логи и временные файлы |
| cgroup | cgroup 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-режиме |
kubectl | v1.36.2 для точного повторения курса | Kubernetes CLI |
kind | v0.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 часа
- Пройдите диагностический тест в
MAIN.md. - Последовательно изучите главы 00–02.
- После главы 02 можно параллельно изучать конфигурацию, сеть и хранилище (главы 03–05).
- Затем пройдите главы 06–11.
- Выполните все лабораторные главы 90.
- Сделайте итоговый проект главы 91.
- Подготовьте ответы и описание опыта по главе 92.
- Подтвердите навыки командами и наблюдениями из главы 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
- Проверьте, что все относительные ссылки ведут к существующим файлам.
- Добавьте незнакомые Kubernetes-термины в
98-glossary.mdи поставьте ссылки при их использовании. - Соберите сайт:
npm run build. - Откройте изменённую страницу локально и проверьте таблицы, 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и свежей официальной документацией.
Как предложить изменение
- Создайте отдельную ветку.
- Меняйте только связанные с задачей материалы.
- Не редактируйте автоматически созданный
lib/course-content.generated.jsonвручную. - Для новой главы добавьте Markdown-файл и запись в
lib/course.ts. - Добавьте определения новых специальных терминов в словарь.
- Выполните подходящие проверки из раздела выше.
- В pull request укажите, что изменилось, как это проверено и что осталось непроверенным.
Лицензия
В репозитории пока нет отдельного файла LICENSE. Публичный доступ к исходникам
сам по себе не задаёт условия копирования и распространения. Перед повторным
использованием материалов за пределами личного обучения согласуйте условия с
владельцем репозитория.
Лучшее место для начала —
00-diagnostic-and-local-cluster.md.
Если встретился незнакомый термин, сразу откройте
98-glossary.md, а затем вернитесь к
упражнению и проверьте термин на практике.