тренажёр собеседований
← Маршрут обучения
модуль 11 / 12 · Провайдер KaaS · 20 часов

Свой KaaS: понятный продукт и надёжные операции

Собери маленький интерфейс услуги: принятие запроса, статус операции, повтор и удаление. Начни с локальной модели, затем замени поддельный провайдер на настоящий.

Ещё не начат
практика · через терминал портала

Где выполнять задания

Учебный API (Application Programming Interface — программный интерфейс) запускается на 127.0.0.1 в терминале. Провайдер поддельный, токены локальные. Ни виртуальные машины, ни настоящие кластеры этот код не создаёт.

Открыть практикум и терминал ↗

Читай урок в этой вкладке, команды выполняй в соседней. Подстановки в угловых скобках сначала замени своими значениями. Ctrl+C останавливает наблюдение или учебный сервер.

Сокращения этого модуля: расшифровки и смысл
API
Application Programming Interface — программный интерфейс
HTTP
Hypertext Transfer Protocol — протокол передачи веб-данных
JSON
JavaScript Object Notation — текстовый формат структурированных данных
KaaS
Kubernetes as a Service — Kubernetes как услуга
MVP
Minimum Viable Product — минимальный жизнеспособный продукт
SLA
Service Level Agreement — соглашение об уровне услуги
SLO
Service Level Objective — целевое качество услуги
URL
Uniform Resource Locator — адрес ресурса
UUID
Universally Unique Identifier — универсальный уникальный идентификатор
PID
Process Identifier — идентификатор процесса

В командах сохраняется точное написание параметров и имён. В тексте сокращения раскрываются в скобках.

Результат модуля

  • Описать небольшой каталог услуги и границы поддержки.
  • В локальном API (Application Programming Interface — программный интерфейс) проверить 202, повторы, чужой доступ, квоту и очистку.
  • Составить контракт настоящей интеграции, расчёт затрат и эксплуатационные инструкции.

Перед началом: Cluster API и OpenStack: от шаблона к кластеру.

1. Что именно обещает продукт

KaaS (Kubernetes as a Service — Kubernetes как услуга) — не кнопка запуска виртуальной машины. Клиент ожидает создание кластера, понятный статус, доступ, изменение размера, обновление, удаление и поддержку при ошибках. Для каждой функции нужен проверяемый результат.

MVP (Minimum Viable Product — минимальный жизнеспособный продукт) лучше ограничить одним облаком, небольшим набором размеров и проверенных версий. Plan — заранее определённый набор ресурсов и возможностей. Не обещай произвольные параметры, которые никто не проверял.

Начни с одного пользователя: например, тебе нужен изолированный кластер для проекта. Запиши время ожидания, кто делает копии данных, что сохраняется после удаления и как действовать при нехватке облачных ресурсов. Ограничения — часть контракта услуги.

Operation
Сохранённое задание с наблюдаемым состоянием и владельцем.
Worker
Обработчик, который доводит сохранённое задание до результата.
Idempotency-Key
Ключ одного намерения: одинаковый повтор не создаёт второй результат.
Tenant
Клиент или команда с отдельными ресурсами и правами.

По шагам

  1. Клиент отправил запрос с ключом product-1 и получил операцию.
  2. Ответ потерялся: клиент повторил те же данные с тем же ключом.
  3. Сервер вернул прежнюю операцию; обработчик создал один ресурс.

2. Почему создание возвращает операцию

API (Application Programming Interface — программный интерфейс) принимает намерение. Создание кластера длится дольше обычного веб-запроса. HTTP (Hypertext Transfer Protocol — протокол передачи веб-данных) статус 202 означает «принято в обработку», а не «кластер готов». Ответ даёт адрес операции для последующей проверки.

Идемпотентный запрос с тем же ключом и теми же параметрами возвращает тот же результат. Тот же ключ с другими параметрами должен вызвать конфликт. Потеря ответа не означает, что запрос не выполнился; клиент повторяет исходное намерение, а не создаёт новый ключ.

Намерение и задание обработчику сохраняются согласованно. Durable outbox — устойчивый журнал заданий, записываемый в одной транзакции с запросом. В нашей модели таким журналом служит таблица operations. Отдельный worker — обработчик — может продолжить её после перезапуска.

3. Как разделить клиентов и квоты

Tenant — отдельный клиент или команда. Его контекст берётся из проверенной личности, а не из произвольного tenant_id в теле запроса. Каждый метод, включая чтение статуса операции, проверяет принадлежность объекта.

UUID (Universally Unique Identifier — универсальный уникальный идентификатор) делает совпадение имён маловероятным, но не заменяет авторизацию. Чужой идентификатор должен оставаться недоступным, даже если его узнали. В учебной модели локальные токены связываются с alice и bob на сервере.

Квота резервируется атомарно при принятии запроса. Иначе два параллельных запроса могут занять последнее место дважды. Резерв освобождается после подтверждённого удаления внешнего ресурса, а не после нажатия кнопки. Удаление может повторяться и ждать восстановления облака.

4. Сколько стоит поддержка

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

SLO (Service Level Objective — целевое качество услуги) задаёт измеримое качество, например долю успешных созданий за период. SLA (Service Level Agreement — соглашение об уровне услуги) закрепляет договорные обязательства. Учебный стенд без измерений ещё не даёт оснований обещать договорную доступность.

Нужны инструкции для зависшего создания, ошибки квоты, отзыва доступа и восстановления управляющего состояния. Локальная модель ниже проверяет устройство операций. Настоящий пилот появится после подключения Cluster API (Application Programming Interface — программный интерфейс), проверки облачных полномочий и полного цикла на OpenStack.

практика · 20 часов вместе с теорией и тестом

Практика через терминал портала

  1. Создай отдельную модель продукта

    Используй новый каталог, чтобы не смешать состояние с уроком контроллеров. Код работает только локально и не подключается к облаку.

    umask 077
    mkdir -p ~/kaas-learning/product
    cd ~/kaas-learning/product
    curl -fSLo kaas_model.py https://test.igorhome.ru/static/learning/kaas_model.py
    python3 kaas_model.py selftest
    python3 kaas_model.py init

    Что должно получиться. Создан закрытый файл model.sqlite.tokens.json с двумя учебными токенами. Команда не печатает значения.

    Если результат отличается

    Повторный init намеренно не перезаписывает файл. Не публикуй его в Git и не вставляй в заметки.

  2. Запусти интерфейс

    В портале доступен один активный терминал. Запусти только свой учебный сервер в фоне и сохрани PID (Process Identifier — идентификатор процесса) в переменной. Остальные команды выполняются в том же терминале. Сервер слушает только 127.0.0.1; внешний прокси не нужен.

    cd ~/kaas-learning/product
    python3 kaas_model.py serve </dev/null >model-server.log 2>&1 &
    KAAS_MODEL_PID=$!
    printf '%s\n' "$KAAS_MODEL_PID" > model-server.pid
    sleep 1
    cat model-server.log

    Что должно получиться. Справочная строка указывает http://127.0.0.1:18080. Это локальный учебный API (Application Programming Interface — программный интерфейс), не публичная услуга.

    Если результат отличается

    Если порт занят, проверь свой предыдущий процесс. Останавливай только собственный учебный сервер, не неизвестный процесс. При закрытии терминала фоновый процесс может остановиться; база сохраняется.

  3. Прими намерение

    В том же терминале прочитай токены в переменные, не выводя их. Сделай запрос alice и сохрани ответ с идентификаторами операции и кластера.

    cd ~/kaas-learning/product
    ALICE_TOKEN=$(python3 -c 'import json; print(json.load(open("model.sqlite.tokens.json"))["alice"])')
    BOB_TOKEN=$(python3 -c 'import json; print(json.load(open("model.sqlite.tokens.json"))["bob"])')
    curl -sS -D create.headers -o create.json -H "Authorization: Bearer $ALICE_TOKEN" -H 'Content-Type: application/json' -H 'Idempotency-Key: product-1' --data '{"plan":"small"}' http://127.0.0.1:18080/v1/clusters
    cat create.headers create.json
    OPERATION_ID=$(python3 -c 'import json; print(json.load(open("create.json"))["id"])')
    CLUSTER_ID=$(python3 -c 'import json; print(json.load(open("create.json"))["cluster_id"])')

    Что должно получиться. Ответ 202 и Location операции; состояние Pending. Машина в реальном облаке не появилась.

    Если результат отличается

    Ответ 401 означает проблему токена; не убирай авторизацию из сервера ради продолжения.

  4. Повтори и проверь конфликт

    Сначала повтори предыдущий запрос без изменений. Затем поменяй plan, оставив ключ. Это намеренно отрицательный тест.

    curl -i -H "Authorization: Bearer $ALICE_TOKEN" -H 'Idempotency-Key: product-1' --data '{"plan":"small"}' http://127.0.0.1:18080/v1/clusters
    curl -i -H "Authorization: Bearer $ALICE_TOKEN" -H 'Idempotency-Key: product-1' --data '{"plan":"large"}' http://127.0.0.1:18080/v1/clusters

    Что должно получиться. Одинаковые параметры вернули ту же операцию; изменённые — 409. Новой записи кластера нет.

    Если результат отличается

    Новый ключ означал бы другое намерение. Не меняй его в опыте повторения.

  5. Переживи прерывание обработчика

    Запусти worker с учебным отказом, затем снова без него. Проверка list показывает состояние, операцию и отдельный список поддельных внешних ресурсов.

    python3 kaas_model.py reconcile --crash
    python3 kaas_model.py list alice
    python3 kaas_model.py reconcile
    python3 kaas_model.py list alice

    Что должно получиться. После прерывания операция Pending и один внешний ресурс; после повтора Ready и всё ещё один ресурс.

    Если результат отличается

    Если Pending нет, используй новый цикл после корректного удаления. Не считай обычный повтор завершённого задания опытом прерывания.

  6. Проверь чужой доступ и квоту

    Переменные идентификаторов уже взяты из ответа create.json. Проверь, что чтение и удаление от bob запрещены, затем проверь дополнительное создание alice при занятой квоте.

    curl -i -H "Authorization: Bearer $BOB_TOKEN" "http://127.0.0.1:18080/v1/operations/$OPERATION_ID"
    curl -i -X DELETE -H "Authorization: Bearer $BOB_TOKEN" "http://127.0.0.1:18080/v1/clusters/$CLUSTER_ID"
    curl -i -H "Authorization: Bearer $ALICE_TOKEN" -H 'Idempotency-Key: product-2' --data '{"plan":"small"}' http://127.0.0.1:18080/v1/clusters
    python3 kaas_model.py selftest

    Что должно получиться. Чужие обращения дают 404, квота — 409. Самопроверка отдельно воспроизводит гонку двух запросов.

    Если результат отличается

    Проверка скрытых кнопок браузера не заменяет запросы к серверу. Проверяй каждый метод.

  7. Пройди удаление и повтор

    Используй сохранённый CLUSTER_ID. Запрос ставит удаление в очередь; обработчик подтверждает очистку. Затем сравни инвентарь.

    curl -i -X DELETE -H "Authorization: Bearer $ALICE_TOKEN" "http://127.0.0.1:18080/v1/clusters/$CLUSTER_ID"
    python3 kaas_model.py reconcile
    python3 kaas_model.py list alice

    Что должно получиться. Deleted, внешних ресурсов нет; операция удаления остаётся в истории. Повтор DELETE возвращает ту же операцию.

    Если результат отличается

    Нельзя освобождать квоту до подтверждения очистки. Исчезнувшая строка интерфейса не является доказательством.

  8. Спроектируй настоящий продукт

    Останови свой учебный сервер по сохранённому PID (Process Identifier — идентификатор процесса), убери переменные токенов. Заполни capstone-openapi.yaml и расчёт стоимости: один план, создание, статус, удаление, поддержка. Для настоящего провайдера используй результаты предыдущего модуля.

    kill "$KAAS_MODEL_PID"
    wait "$KAAS_MODEL_PID" 2>/dev/null || true
    unset ALICE_TOKEN BOB_TOKEN KAAS_MODEL_PID
    python3 kaas_model.py selftest

    Что должно получиться. Есть локально проверенная модель и отдельный список обязательных работ до OpenStack-пилота. Токены не попали в заметки.

    Если результат отличается

    Не отмечай облачный lifecycle по локальному selftest. Производственный интерфейс требует отдельного развёртывания и проверки.

Открыть терминал ↗ · Скачать файлы лаборатории →

Файлы и подготовка к этой работе

Критерии готовности

Отмечай только то, что проверил на указанном стенде. Эти галочки сохраняются в браузере. Для готовых упражнений зачёт выдаёт отдельная серверная проверка практикума; остальные задания подтверждай журналом и доказательствами. Учебная модель не заменяет реальный облачный опыт.

Что сохранить в портфолио

  • Журнал: исходное состояние → команда или действие → ожидаемый результат → фактическое наблюдение.
  • Доказательства по критериям ниже: очищенный от секретов вывод, схема или ссылка на проверенный коммит.
  • Отдельный список: что пока не запускалось, почему и какой стенд нужен для продолжения.
закрепление

Проверь понимание

8 вопросов по этому модулю. Проходной результат — 7 из 8. После ответа — объяснения и ссылки на разделы, к которым стоит вернуться.

Пройти тест модуля

Официальные источники

Чек-листы уроков, заметки к ним и результаты тестов хранятся в этом браузере; для переноса используй экспорт. Автоматические проверки и журнал практикума сохраняются отдельно на сервере.