Контроллеры: как автоматизация доводит дело до конца
Начни с маленькой модели на Python. Увидь, почему повтор команды, потерянный ответ и удаление требуют отдельной логики, затем перенеси эти идеи в Kubernetes.
Ещё не начатГде выполнять задания
Локальная Python-модель запускается сразу в портальном терминале. Она не создаёт облачные ресурсы. CRD (Custom Resource Definition — определение пользовательского ресурса) и настоящий оператор — следующая стадия на отдельном стенде.
Открыть практикум и терминал ↗Читай урок в этой вкладке, команды выполняй в соседней. Подстановки в угловых скобках сначала замени своими значениями. Ctrl+C останавливает наблюдение или учебный сервер.
Сокращения этого модуля: расшифровки и смысл
- API
- Application Programming Interface — программный интерфейс
- CAPO
- Cluster API Provider OpenStack — провайдер Cluster API для OpenStack
- CRD
- Custom Resource Definition — определение пользовательского ресурса
- KaaS
- Kubernetes as a Service — Kubernetes как услуга
- VM
- Virtual Machine — виртуальная машина
В командах сохраняется точное написание параметров и имён. В тексте сокращения раскрываются в скобках.
Результат модуля
- Разделить намерение, наблюдение и работу контроллера.
- На модели проверить повтор, прерывание, квоту и удаление без дубликатов.
- На отдельном стенде проверить CRD (Custom Resource Definition — определение пользовательского ресурса), затем реализовать conditions и finalizer.
Перед началом: Обновления и управление через Git.
1. Желание и наблюдение — разные вещи
Контроллер получает желаемое состояние и сравнивает с фактическим. Spec описывает намерение пользователя: например, нужен кластер из двух машин. Status описывает наблюдаемый результат. Пользователь не должен выставлять себе Ready простым изменением status.
CRD (Custom Resource Definition — определение пользовательского ресурса) добавляет новый тип объекта в API (Application Programming Interface — программный интерфейс) Kubernetes. Сама схема только проверяет и хранит данные. Для создания облачных машин нужна работающая программа-контроллер.
Generation растёт при изменении желаемой конфигурации. Observed generation показывает, какую версию намерения уже обработали. Conditions — условия состояния, например Ready=False с причиной ожидания. Это понятнее, чем вечное сообщение «что-то выполняется».
- Spec
- Что пользователь хочет получить.
- Status
- Что контроллер наблюдает в действительности.
- Reconcile
- Один проход сравнения желания и реальности с попыткой исправления.
- Finalizer
- Защитная запись, удерживающая объект до завершения очистки.
По шагам
- Сохранили намерение создать один ресурс.
- Провайдер создал его, но обработчик прервался до отметки успеха.
- Повтор нашёл прежний ресурс по устойчивому ключу и завершил ту же операцию.
2. Почему действие будет повторено
Reconcile — один проход сравнения и исправления состояния. Он может запускаться много раз для одного объекта. Процесс может завершиться после создания машины, но до записи её идентификатора. При следующем запуске контроллер обязан найти ту же машину.
Идемпотентность означает, что повтор одного намерения не создаёт лишнего результата. Используй устойчивый ключ владения и проверку фактического ресурса. «Обработать событие один раз» ненадёжно: события могут повторяться или теряться.
Временная ошибка сети требует повторения с backoff — растущей задержкой и ограничением частоты. Постоянная ошибка входных данных требует понятной причины для пользователя. Бесконечный быстрый повтор перегружает облако и скрывает проблему.
3. Как безопасно удалять
Finalizer — запись, которая задерживает окончательное удаление объекта, пока контроллер очищает связанные внешние ресурсы. Сначала отмечается намерение удалить, затем повторяемая очистка, и только после её подтверждения снимается finalizer.
Если облако временно недоступно, объект может оставаться Terminating. Это не повод сразу убрать защиту: иначе машина останется без владельца. Нужны диагностика, время последней попытки и управляемая процедура для исключительных случаев.
Owner reference помогает Kubernetes удалять зависимые объекты в своей области, но не является автоматическим сборщиком всех ресурсов OpenStack. Внешние диски, порты и адреса требуют отдельного учёта и политики сохранения.
4. Что проверять до настоящего облака
Начни с простого поддельного провайдера: он хранит «машины» в локальной базе. Это позволяет безопасно воспроизвести потерянный ответ, повтор и рестарт. Модель не доказывает работу с Kubernetes или OpenStack, но делает алгоритм наблюдаемым.
Затем добавь схему CRD (Custom Resource Definition — определение пользовательского ресурса), контроллер с отдельными минимальными правами и тесты с настоящим программным интерфейсом Kubernetes на отдельном стенде. Проверяй конфликт одновременных изменений, устаревшее состояние, временную ошибку и удаление при отказе.
Для KaaS (Kubernetes as a Service — Kubernetes как услуга) особенно важны сохранённое владение ресурсом и отсутствие дубликатов. Успешный первый запуск — самый простой случай. Ценность контроллера проявляется после прерывания посередине.
Практика через терминал портала
Подготовь локальный учебный каталог
Все команды выполняются в терминале портала без установки Go или Docker. Пример использует только стандартную библиотеку Python и отдельную SQLite-базу в домашнем каталоге.
umask 077 mkdir -p ~/kaas-learning/controller cd ~/kaas-learning/controller curl -fSLo kaas_model.py https://test.igorhome.ru/static/learning/kaas_model.py python3 kaas_model.py --helpЧто должно получиться. Появилась справка. Код не имеет клиента OpenStack и не создаёт реальные машины.
Если результат отличается
Если Python отсутствует, остановись и уточни окружение; не устанавливай инструменты на управляющую ноду без отдельной необходимости.
Прочитай модель
Найди функции request_create, reconcile и request_delete. Обрати внимание на ключ external_id и транзакции. Сначала запусти самопроверку в отдельной временной базе.
python3 kaas_model.py selftestЧто должно получиться. Проверки повторов, конфликта данных, чужого доступа, квоты, рестарта и очистки завершились успешно.
Если результат отличается
Любая ошибка — причина разобрать реализацию. Зелёный selftest модели не означает готовность облачного контроллера.
Запиши намерение
Выполни запрос и посмотри состояние до reconcile. Команда вернёт идентификатор операции, а не готовый кластер.
python3 kaas_model.py create alice lesson-1 small python3 kaas_model.py list aliceЧто должно получиться. Один объект Pending и одна операция. Это локальная имитация, не Kubernetes-ресурс.
Если результат отличается
Если база осталась от прошлой попытки, запрос с тем же ключом вернёт тот же объект. Не удаляй базу ради сокрытия дубликата.
Воспроизведи потерянный ответ
Режим crash останавливает обработчик после записи внешнего результата, до завершения операции. Код завершения 75 ожидаем. Затем повтори обычный reconcile.
python3 kaas_model.py reconcile --crash python3 kaas_model.py reconcile python3 kaas_model.py list aliceЧто должно получиться. После повторного запуска объект Ready, внешний ресурс ровно один. Сохранённый ключ связывает его с намерением.
Если результат отличается
Если режим crash не сработал, возможно, нет Pending-операции. Создай новую с другим ключом после удаления первой, не называй обычный запуск опытом отказа.
Повтори намерение и создай конфликт
Одинаковый ключ с теми же параметрами должен вернуть тот же результат. Другие параметры с тем же ключом — ошибка.
python3 kaas_model.py create alice lesson-1 small python3 kaas_model.py create alice lesson-1 largeЧто должно получиться. Первый запрос повторяем, второй отклонён как конфликт. Количество внешних ресурсов не увеличилось.
Если результат отличается
Не меняй ключ при обычном повторе после потери ответа: это уже другое намерение.
Разбери удаление
Сохрани список и возьми идентификатор своего активного объекта из учебной базы. Затем запроси удаление и запусти обработчик.
python3 kaas_model.py list alice > state.json CLUSTER_ID=$(python3 -c 'import json; print(next(c["id"] for c in json.load(open("state.json"))["clusters"] if c["state"]=="Ready"))') python3 kaas_model.py delete alice "$CLUSTER_ID" python3 kaas_model.py reconcile python3 kaas_model.py list aliceЧто должно получиться. Статус Deleted, внешний ресурс удалён. Учебная запись операции сохранена для истории.
Если результат отличается
Пустой список в интерфейсе не доказывает очистку. Сравни состояние внешнего ресурса в выводе модели.
Добавь схему настоящего ресурса
Только на отдельном kind проверь kaascluster-crd.yaml и два примера. Схема должна принять replicas: 2 и отклонить replicas: 0. Контроллер для этого типа пока не установлен.
kubectl --context kind-kaas-lab apply -f https://test.igorhome.ru/static/learning/kaascluster-crd.yaml kubectl --context kind-kaas-lab apply --dry-run=server -f https://test.igorhome.ru/static/learning/kaascluster-valid.yaml kubectl --context kind-kaas-lab apply --dry-run=server -f https://test.igorhome.ru/static/learning/kaascluster-invalid.yamlЧто должно получиться. Второй пример отклонён валидацией, первый принят без сохранения. Наличие CRD (Custom Resource Definition — определение пользовательского ресурса) не объявляется работающим оператором.
Если результат отличается
Не устанавливай учебный общий тип в существующий кластер.
Перейди от модели к оператору
По официальному руководству Kubebuilder на отдельной машине создай контроллер и перенеси повторы, status, conditions и finalizer. Добавь тесты из этого урока. Это самостоятельная инженерная часть, а не результат скачивания файла.
python3 kaas_model.py selftestЧто должно получиться. Есть отдельный отчёт: что доказано моделью, что схемой, что настоящим оператором. Проверки conditions/finalizer отмечаются только после реализации.
Если результат отличается
Если пока пройдена только модель, зафиксируй это и вернись к оператору после подготовки инструментов.
Открыть терминал ↗ · Скачать файлы лаборатории →
Файлы и подготовка к этой работе
Критерии готовности
Отмечай только то, что проверил на указанном стенде. Эти галочки сохраняются в браузере. Для готовых упражнений зачёт выдаёт отдельная серверная проверка практикума; остальные задания подтверждай журналом и доказательствами. Учебная модель не заменяет реальный облачный опыт.
Что сохранить в портфолио
- Журнал: исходное состояние → команда или действие → ожидаемый результат → фактическое наблюдение.
- Доказательства по критериям ниже: очищенный от секретов вывод, схема или ссылка на проверенный коммит.
- Отдельный список: что пока не запускалось, почему и какой стенд нужен для продолжения.
Проверь понимание
8 вопросов по этому модулю. Проходной результат — 7 из 8. После ответа — объяснения и ссылки на разделы, к которым стоит вернуться.
Пройти тест модуляОфициальные источники
Чек-листы уроков, заметки к ним и результаты тестов хранятся в этом браузере; для переноса используй экспорт. Автоматические проверки и журнал практикума сохраняются отдельно на сервере.