1. Основы архитектуры K8s и деплой первого Python-сервиса через Pod и Deployment
Основы архитектуры K8s и деплой первого Python-сервиса через Pod и Deployment
Добро пожаловать в курс Kubernetes для Python-разработчиков. Если вы читаете эту статью, значит, вы уже переросли запуск приложений через python app.py на локальной машине и, вероятно, уверенно чувствуете себя с Docker. Но когда контейнеров становится не два, а двадцать, или когда нужно обеспечить отказоустойчивость продакшн-уровня, Docker Compose перестает справляться. Здесь на сцену выходит Kubernetes (K8s).
В этой вводной статье мы разберем анатомию кластера, поймем, почему мы не деплоим «голые» контейнеры, и запустим ваш первый Python-сервис, используя правильные абстракции.
Зачем Python-разработчику Kubernetes?
Как Middle-разработчик, вы отвечаете не только за код, но и за то, как он живет в дикой природе. Kubernetes решает фундаментальные проблемы эксплуатации:
* Self-healing (Самовосстановление): Если ваш скрипт упал из-за MemoryError, K8s перезапустит его.
* Scaling (Масштабирование): Пришел «Хабр-эффект»? Одной командой можно поднять 10 реплик вашего FastAPI приложения.
* Zero Downtime Deployment: Выкатка новой версии без прерывания обслуживания пользователей.
Архитектура Kubernetes: Взгляд с высоты птичьего полета
Kubernetes — это не единый монолит, а распределенная система. Глобально кластер делится на две части: Control Plane (управляющий слой) и Worker Nodes (рабочие узлы).
!Архитектура кластера: Control Plane управляет состоянием, а Worker Nodes выполняют нагрузку
1. Control Plane (Мозг кластера)
Это командный центр. Обычно он скрыт от разработчика (особенно в облаках вроде AWS EKS или Google GKE), но понимать его устройство необходимо для траблшутинга.
* API Server: Единственный компонент, с которым вы общаетесь напрямую (через утилиту kubectl). Это «парадная дверь» кластера. Он валидирует запросы и обновляет состояние в базе данных.
* etcd: Высокодоступное хранилище типа «ключ-значение». Это единственное место, где хранится состояние кластера. Если вы потеряли etcd — вы потеряли кластер.
* Scheduler: Планировщик. Он смотрит на новые задачи (Поды) и решает, на какую именно ноду их отправить, исходя из свободных ресурсов (CPU, RAM).
Controller Manager: Следит за тем, чтобы текущее состояние кластера соответствовало желаемому*. Если вы попросили 3 копии сервиса, а одна упала, контроллер заметит разницу и прикажет создать новую.
2. Worker Nodes (Мускулы кластера)
Здесь работает ваш Python-код.
* Kubelet: Агент, который работает на каждой ноде. Он получает инструкции от API Server (например: «Запусти этот контейнер») и передает их Docker (или другому Container Runtime). * Kube-proxy: Отвечает за сетевые правила. Благодаря ему ваши сервисы могут общаться друг с другом внутри кластера. * Container Runtime: Среда запуска контейнеров (Docker, containerd, CRI-O).
Декларативный подход: YAML как язык общения
В отличие от скриптов на Bash, где вы пишете как сделать (императивный подход), в Kubernetes вы описываете что хотите получить (декларативный подход).
Вы создаете манифест (обычно YAML-файл), описывающий Desired State (желаемое состояние). Вы «скармливаете» этот файл кластеру, и K8s делает всё возможное, чтобы реальность совпала с вашим описанием.
Атом Kubernetes: Pod (Под)
Многие новички спрашивают: «Почему я не могу просто запустить контейнер, как в Docker?». В Kubernetes минимальной единицей деплоя является не контейнер, а Pod.
Pod — это логическая обертка над одним или несколькими контейнерами.
Зачем нужна эта прослойка?
Контейнеры внутри одного Пода:
[VISUALIZATION: Иллюстрация концепции Pod. Изображен стручок гороха (Pod), внутри которого находятся две горошины-контейнера. Одна горошина подписана