1. Архитектура песочницы: как связаны поды, сервисы и ваши автотесты в кластере
Архитектура песочницы: как связаны поды, сервисы и ваши автотесты в кластере
Вы запускаете автотест AEQS-49, и в консоли загорается красным: HTTP 404 Not Found при обращении к GET /v1/api/time_slots. Вы открываете дашборд или спрашиваете DevOps-инженера, а в ответ слышите парадокс: «Сервис жив, статус Ready 2/2, всё работает!». Как такое возможно? Приложение успешно запущено, но ваш код в упор его не видит, получая ошибку отсутствия ресурса.
Для Java-автотестировщика Kubernetes (часто его называют K8s) поначалу выглядит как черный ящик. Однако вам не нужно быть системным администратором, чтобы находить причины падений. Достаточно понять один ключевой механизм: путь, который проходит ваш HTTP-запрос от метода в автотесте до конкретного Java-кода в кластере.
Давайте разберем этот путь по слоям, используя названия из вашей реальной задачи.
От монолита к контейнерам: смена парадигмы
В традиционной разработке вы привыкли, что приложение — это просто запущенный JAR-файл на конкретном сервере с известным IP-адресом. В Kubernetes всё иначе. Кластер — это огромный распределенный суперкомпьютер. Чтобы в нем не было хаоса, используются уровни абстракции.
| Традиционная модель | Модель Kubernetes | Роль в системе | | :--- | :--- | :--- | | Сервер (виртуальная машина) | Node (Узел) | Физическое железо или виртуалка, предоставляющая процессор и память. | | Папка с проектом | Namespace (Пространство имен) | Изолированная песочница для конкретной команды или ветки. | | Запущенный JAR-файл | Container (Контейнер) | Самодостаточный пакет с Java, вашим приложением и зависимостями. | | Процесс в ОС | Pod (Под) | Обертка вокруг одного или нескольких контейнеров. Минимальная единица в K8s. | | Статический IP-адрес | Service (Сервис) | Стабильная точка входа для динамически меняющихся Подов. |
> В Kubernetes приложение никогда не существует «само по себе». Оно всегда завернуто в Под, скрыто за Сервисом и выставлено наружу через Ingress.
Анатомия вашего запроса
Когда автотест вызывает эндпоинт https://aeqs-backend-preregistration.dev.aeqs.corp.dev.vtb/v1/api/time_slots, запрос преодолевает четыре рубежа.
1. Ingress (Входная дверь)
Ваш автотест выполняется снаружи кластера. URL, к которому вы обращаетесь, обрабатывается компонентом под названием Ingress (или Route). Это умный маршрутизатор на границе кластера. Его задача — прочитать доменное имя (aeqs-backend-preregistration.dev.aeqs.corp.dev.vtb) и понять, в какую внутреннюю часть кластера перенаправить трафик.2. Namespace (Ваша песочница)
Кластер огромный, в нем могут работать сотни команд. Чтобы они не мешали друг другу, кластер поделен на виртуальные зоны — Namespaces. В вашем случае Ingress направляет запрос в пространство именd5k8s-aeqs-d6d16b-main. Это ваша изолированная тестовая среда. Если вы будете искать логи приложения в другом пространстве имен, вы их просто не найдете.3. Service (Внутренний коммутатор)
Внутри пространства имен запрос попадает на Service с именемaeqs-backend-preregistration. Зачем он нужен?
Поды в Kubernetes смертны. Они могут падать из-за нехватки памяти, перезапускаться с ошибками (как ваш проблемный под с Kafka, который ушел в CrashLoopBackOff) или переезжать на другие физические серверы. При каждом перезапуске Под получает новый внутренний IP-адрес.
Если бы Ingress отправлял трафик напрямую в Под, связь бы постоянно рвалась. Сервис же имеет постоянный IP-адрес и работает как коммутатор: он знает, какие Поды сейчас живы, и перенаправляет запрос на один из них.4. Pod (Рабочая лошадка)
Наконец, Сервис передает запрос в Pod. Под — это «капсула», внутри которой крутится Docker-контейнер с вашим Java-приложением. В вашей задаче фигурирует статусReady 2/2. Что означают эти цифры?
* Первая цифра — количество контейнеров в Поде, готовых принимать трафик.
* Вторая цифра — общее количество контейнеров в Поде.Значение 2/2 означает, что внутри Пода работают два контейнера (например, само приложение Spring Boot и вспомогательный контейнер для сбора логов), и оба успешно стартовали и сообщили кластеру: «Мы готовы работать».
Почему возникает 404, если Под жив?
Теперь, понимая архитектуру, вернемся к загадке: Под имеет статус Ready 2/2, но автотест получает 404.
Ошибка 404 (Not Found) означает, что запрос успешно прошел сеть, но конечная точка не смогла найти запрашиваемый ресурс. В цепочке K8s это может произойти на разных этапах:
/v1/api/time_slots не передается внутрь кластера.@GetMapping("/v1/api/time_slots"), или Swagger отключен для профиля dev.Параллельно в вашей песочнице есть другой Под (aeqs-ticket-789975cb94-v8xp7), который вообще не может запуститься и уходит в цикличную перезагрузку (CrashLoopBackOff) из-за проблем с авторизацией в Kafka.
Эти две проблемы — 404 при живом поде и бесконечные рестарты при падении приложения — требуют разных подходов к диагностике. Чтобы найти точную причину, нам нужно научиться заглядывать внутрь этих абстракций. Этим мы и займемся на следующем шаге, начав с навигации по пространству имен.