Ingress
Что нужно знать перед уроком
- M1.03 — Service и порты — Ingress маршрутизирует трафик к Service, не напрямую к Pod'ам
Что нужно знать перед уроком
M1 урок 3 — Service даёт доступ внутри кластера. Этот урок — про то, как открыть приложение снаружи по человеческому доменному имени.
Теория
L4 vs L7: зачем Ingress, если есть Service
Service типа LoadBalancer уже даёт внешний доступ — но по IP-адресу и порту, без осведомлённости о содержимом HTTP-запроса (это уровень L4 модели OSI — транспортный, IP+порт). Ingress работает на уровне L7 (приложения, HTTP) — он смотрит на Host-заголовок и путь запроса и на основе этого решает, к какому Service направить трафик. Это позволяет: обслуживать несколько доменов на одном внешнем IP, терминировать TLS в одном месте, направлять разные пути одного домена к разным Service.
IngressClass — какой контроллер обрабатывает правило
Сам объект Ingress — только декларация правил маршрутизации; их реально применяет отдельный компонент — Ingress-контроллер (например, ingress-nginx в терминах модулей Deckhouse). Один кластер может иметь несколько контроллеров одновременно — spec.ingressClassName явно указывает, какой из них должен обработать конкретный Ingress. Это современный способ, заменивший deprecated аннотацию kubernetes.io/ingress.class.
| |
Три pathType
| Тип | Семантика |
|---|---|
Exact | точное совпадение пути символ-в-символ (с учётом регистра) |
Prefix | совпадение по сегментам пути (/foo/bar совпадает с правилом /foo, а /foobar — не совпадает) |
ImplementationSpecific | поведение полностью зависит от конкретного контроллера — может вести себя как Prefix, как regex или иначе |
ingress-nginx есть аннотация nginx.ingress.kubernetes.io/use-regex: "true", включающая интерпретацию пути как regex для конкретного Ingress. Официально задокументированный побочный эффект: включение этой аннотации на одном Ingress может изменить сопоставление путей у всех Ingress того же host, включая формально не связанные с ней Exact-пути в других манифестах того же домена — потому что все правила одного host’а в конечном счёте компилируются контроллером в единый набор location-блоков nginx. Это одна из причин, по которой команда Deckhouse рекомендует переходить на Gateway API (следующий урок) там, где важна предсказуемая изоляция правил маршрутизации.TLS-терминация
| |
Контроллер сам терминирует TLS на этом Secret’е — Pod’ы приложения получают уже расшифрованный HTTP-трафик, если не настроено обратное (passthrough).
Частые ошибки и подводные камни
- Указывать
backend.service, ссылающийся на несуществующий Service/порт. Ingress создастся без ошибки на уровне API, но контроллер вернёт 502/503 — первое, что нужно проверить при «Ingress создан, но 502» — реально ли Service существует и в тех же именах/портах. - Полагаться на
Prefixтам, где нуженExact, и наоборот.Prefix /fooсовпадёт и с/foo, и с/foo/bar, но не с/foobar— важно проверять границы сегментов, а не буквальное совпадение символов. - Использовать
ImplementationSpecificбез понимания, как конкретный контроллер его интерпретирует — поведение не гарантировано между разными Ingress-контроллерами.
Практика в кластере
Gitea — компактный self-hosted git-сервер на Go — классический пример приложения, которое реально нужно открыть снаружи по домену. В следующем уроке (Gateway API) мы переведём именно этот инстанс с Ingress на ListenerSet+HTTPRoute.
| |
- Проверьте, что Ingress создан и контроллер его подхватил:
| |
- Добавьте запись в
/etc/hosts(в реальном кластере — DNS) и проверьте доступ:
| |
- Проверьте разницу
PrefixvsExact, добавив второе правило на путь/api:
| |
Практика разработки
Используется официальный образ gitea/gitea; собственная сборка — в M3.
Шпаргалка команд урока
| |
Вопросы для самопроверки
Ingress анализирует HTTP-заголовки (Host, путь) — это L7, в отличие от Service, который работает на уровне IP+порт (L4).
Источник: Kubernetes — ingress
Prefix требует совпадения по границам сегментов пути — /foo совпадёт с /foo/bar, но не с /foobar (нет разделителя сегмента).
Источник: Kubernetes — ingress
Все правила одного host компилируются контроллером в общий набор location-блоков, поэтому включение regex-интерпретации на одном Ingress может затронуть весь host.
ingressClassName — современный явный способ указать контроллер, обрабатывающий Ingress, заменивший устаревшую аннотацию.
Источник: Kubernetes — ingress
502/503 при валидном Ingress почти всегда означает несовпадение backend.service с реально существующим Service/портом — Ingress создаётся успешно даже при ссылке на несуществующий backend.
Источник: Рекомендуемая литература
Рекомендуемая литература
Официальная документация
- kubernetes.io — concepts/services-networking/ingress
- kubernetes.io — blog/2026/ingress-nginx-before-you-migrate
- kubernetes.io — Ingress.
Статьи и блоги
- Ingress в Kubernetes — Habr.
- Миграция с ingress-nginx: выбор нового контроллера — Habr.
- Kubernetes для начинающих: что такое Pod и как с ним работать — Flant на Habr.
- Основные концепции сетевой архитектуры Kubernetes — Habr.
Книги
- Marko Lukša. Kubernetes in Action. 2nd ed., 2022. ISBN 978-1617297618.
- Kelsey Hightower, Brendan Burns, Joe Beda. Kubernetes: Up and Running. 3rd ed., 2022. ISBN 978-1098110201.
- Michael Hausenblas, Stefan Schimanski. Programming Kubernetes. 2019. ISBN 978-1492047107.
Связанные материалы
- Предыдущий урок: M1.07 — Probes.
- Следующий урок: M1.09 — Gateway API — переводим этот же инстанс Gitea на современную альтернативу.
- Глоссарий: Ingress.
✓ Урок пройден — все вопросы самопроверки отвечены верно