Введение
Kubernetes – это платформа, которая предоставляет возможность работать с модулями, службами и внешними ресурсами и при этом иметь гибкий и масштабируемый способ обмена данными. Если абстрагироваться от основной сетевой инфраструктуры, Kubernetes позволяет приложениям, развернутым в кластере, с легкостью поддерживать безопасную и надежную связь.
В дополнение к поддержке внутрикластерной сети, Kubernetes помогает пользователям подключать приложения к ресурсам, который находятся за пределами кластера. Для этих целей Kubernetes использует концепцию Ingress.
В этом руководстве содержится вся необходимая информация о различных типах и преимуществах Kubernetes Ingress, а также практические примеры.
Что такое Kubernetes Ingress?
Kubernetes Ingress – это ресурс, который определяет правила маршрутизации внешнего трафика для кластера. Это объект Kubernetes API, который управляет внешним доступом к службам путем определения хоста, пути и другой необходимой информации. Администраторы определяют Ingress с помощью манифестов YAML, CLI или вызовов Kubernetes API.
Ingress позволяет адаптивно создавать правила маршрутизации DNS и обеспечивает кластерные службы:
- Балансировкой нагрузки
- Виртуальным хостингом на основе имени
- Терминированием TLS/SSL-соединений
Поскольку Ingress выступает в роли единой точки входа в кластер, он упрощает процесс управления приложениями и устранения неполадок, связанных с маршрутизацией.
Ingress vs. Engress
Сетевая политика Kubernetes позволяет администраторам управлять и создавать отдельные наборы правил для входящего и исходящего трафика модулей. Ingress и Engress используются для разграничения двух направлений трафика:
- Ingress направляет внешний трафик в кластер.
- Engress контролирует трафик, который исходит из кластера. Как правило, исходящий трафик запускается службой кластера или модулем и перенаправляется внешнему адресату с помощью заранее определенных правил.
Что такое контроллер Kubernetes Ingress?
Контроллер Kubernetes Ingress – это реализация Ingress API, которая выполняет функции балансировщика нагрузки и обратного прокси в кластере Kubernetes. Контроллер интерпретирует и реализует правила в соответствии со спецификацией ресурса Ingress. Он следит за изменениями ресурсов кластера и динамически меняет свои настройки, чтобы маршрутизация входящего трафика функционировала правильно.
Контроллер Ingress во многом похож на другие контроллеры Kubernetes, например, Deployments, ReplicaSets и StatefulSets. Он отслеживает состояние ресурсов в кластере и гарантирует, что оно соответствует состоянию, которое определил пользователь.
В одном кластере может быть запущено несколько ingress-контроллеров. Кроме того, существует несколько различных реализаций ingress-контроллеров, например, NGINX Ingress Controller, Kong Ingress, HAProxy и Traefik. Эти контроллеры предлагают такие функции, как разделение трафика и маршрутизация на основе пути. Их различие состоит в количестве протоколов передачи данных, протоколов аутентификации и поддержке алгоритмов балансировки нагрузки.
Как работает Kubernetes Ingress?
Предоставление доступа к службам кластера для внешнего пользования с помощью Kubernetes Ingress – это многошаговый процесс. Далее мы объясним, как работает Ingress, перечислив стандартные шаги, необходимые для предоставления доступа к службе.
1. Создание Ingress-ресурса. Пользователь создает Ingress-ресурс и предоставляет всю необходимую информацию о конфигурации. Сюда относятся имена хостов, пути и службы, к которым необходимо получить доступ извне.
2. Развертывание Ingress-контроллера. Пользователь создает Ingress-контроллер и прибегает к его помощи. После того, как контроллер будет запущен, он начнет отслеживать сервер API и реагировать на изменения в спецификации Ingress, обновляя правила маршрутизации и меняя конфигурацию системы.
3. Проксирование и балансировка нагрузки. Ingress-контроллер – это точка входа для внешнего запроса, который поступает в кластер. Используя балансировку нагрузки или DNS-запись, которая подключается к IP-адресу контроллера, трафик направляется к контроллеру. Как только будет установлено соединение, Ingress-контроллер берет на себя роль прокси и балансировщика нагрузки.
4. Маршрутизация. Контроллер анализирует входящие запросы, собирает данные (имя хоста, путь и атрибуты заголовка) и на основе правил Ingress-ресурса определяет службу, куда он будет пересылать запрос.
5. Терминирование SSL/TLS-соединений. При необходимости Ingress-контроллер может выполнять шифрование и дешифрование SSL/TLS-сертификатов.
6. Взаимодействие со службой. После того, как контроллер определит, какую именно службу запрашивает клиент, он проксирует запрос и позволяет службе обработать его.
Типы Ingress
Существуют различные типы Ingress. Их различают по структуре и размерам кластера и количеству служб в нем. Ниже представлено описание самых распространенных типов.
Single Service Ingress (Ingress с одной службой)
Single Service Ingress (также известный как Simple Ingress – элементарный Ingress) – это базовая настройка Ingress, которая позволяет предоставлять доступ внешнему трафику к какой-то отдельной службе. При таком раскладе Ingress напрямую связан со службой (см. схему ниже).
Такой тип Ingress-соединения позволяет избежать необходимости настраивать несколько имен хостов или применять маршрутизацию на основе пути.
Fanout Ingress (Ingress с разветвлением)
В случае, если Ingress нужно предоставлять доступ более чем к одной службе в кластере, Fanout Ingress вам очень сильно поможет. Он позволяет предоставлять доступ к службам, используя несколько разных имен хостов.
На схеме выше вы можете видеть пример простого Fanout Ingress. Ingress перенаправляет запрос в нужную службу, опираясь на его URL-адрес HTTP, например, example.com/service-a. Этот тип Ingress позволяет направлять трафик с помощью одного и того же IP-адреса в более чем одну службу.
Name-based Virtual Hosting (Виртуальный хостинг на основе имени)
Ingress на основе NBVH направляет HTTP-трафик в более чем один хост с одним и тем же IP-адресом. NBVH позволяет пользователям использовать различные имена доменов для размещения нескольких служб или веб-сайтов на одном IP-адресе или порте. На схеме ниже продемонстрировано, как работает NBVH.
NBVH считывает заголовки HTTP-запросов для того, чтобы направить трафик в нужную службу. Например, клиентский запрос на посещение домена service-a.example.com будет перенаправлен в Службу А, а, перейдя по service-b.example.com, можно обратиться к Службе B, находящейся в том же домене.
Разница между Ingress, ClusterIP, NodePort и LoadBalancer
Ingress – это один из многих способов предоставления доступа к службам в кластере. Другие стандартные подходы подразумевают использование таких служб, как ClusterIP, NodePort и LoadBalancer.
- ClusterIP использует внутренний IP-адрес для того, чтобы предоставлять доступ к службам извне. Этот метод лучше всего подходит для этапов разработки и тестирования, но его также можно использовать для запуска информационных панелей и доступа к внутреннему трафику.
- NodePort – это виртуальная машина, которая предоставляет доступ к службе с помощью номера постоянного порта. Несмотря на то, что не рекомендуется использовать NodePort в производственной среде, ее довольно часто используют в процессе разработки и тестирования. Однако такое возможно только в том случае, если отсутствует необходимость в балансировке нагрузки, то есть если доступ необходимо предоставлять только к одной службе.
- LoadBalancer – это единственный метод (из этих трех), который вполне может стать заменой Ingress. Все потому, что он подходит для использования в производственной среде, а также может предоставлять доступ к службам для внешнего трафика.
Преимущества Kubernetes Ingress
Концепция Ingress оптимизирует работу Kubernetes несколькими способами: от упрощения внутрикластерных процессов и конфигурации до предоставления большей гибкости и расширяемости. Настроив Ingress в кластере, пользователи получат следующие преимущества:
- Упрощенное управление внешними подключениями. С помощью Ingress пользователи могут настраивать и контролировать доступ к своим службам.
- Можно определять правила маршрутизации, опираясь на имя хоста и URL-адрес. Это свойство Ingress дает больше контроля над маршрутизацией.
- Настройка встроенной балансировки нагрузки. Создав несколько реплик служб для распределения трафика, вы сможете повысить масштабируемость и уровень доступности. За счет наличия встроенной балансировки нагрузки Ingress может оптимизировать использование доступных ресурсов, а также гарантировать, что приложение сможет обрабатывать большой объем трафика.
- Упрощенное обнаружение служб. Ingress стандартизирует процесс предоставления доступа к службам и абстрагируется от деталей. Так что клиенты могут обнаруживать нужные службы и взаимодействовать с ними с помощью согласованного интерфейса.
- Шифрование и дешифрование HTTPS-трафика. За счет сквозного шифрования терминирование SSL/TLS-соединений позволяет клиентам и службам безопасно обмениваться данными.
- Можно использовать гибкие и расширяемые стратегии маршрутизации. За счет разнообразия поддерживаемых Ingress-контроллеров и за счет того, что в кластере можно запускать более чем один контроллер, у пользователей есть возможность создавать ту структуру, которая будет соответствовать их сценарию использования.
Примеры Kubernetes Ingress
Самый распространенный способ внедрения Ingress в кластер Kubernetes состоит в том, что вам нужно указать соответствующую конфигурацию в YAML-файле, а затем применить ее с помощью kubectl. Каждый такой YAML-файл должен содержать следующие поля:
- apiVersion
- kind
- metadata
- spec
Поле metadata содержит имя объекта Ingress, которое должно являться допустимым именем для поддомена DNS.
Ниже представлены несколько примеров YAML-файлов.
- Single Service Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-ingress-example
spec:
defaultBackend:
service:
name: example-service
port:
number: 80
- Fanout Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: fanout-ingress-example
spec:
defaultBackend:
service:
name: example-service
port:
number: 80
rules:
- host: service-a.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-a
port:
number: 80
- host: service-b.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-b
port:
number: 80
Примечание: если HTTP-запрос не соответствует ни одному из объектов, которые перечислены в поле rules, то по умолчанию Ingress использует службу, которая была указана в поле defaultBackend. В примере ниже это example-service.
- NBVH Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nbvh-example
spec:
rules:
- host: service-a.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-a
port:
number: 80
- host: service-b.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-b
port:
number: 80
Заключение
Прочитав данное руководство, вы должны были получить общее представление о том, что такое Kubernetes Ingress. В руководстве было пояснено, как работает Ingress и Ingress-контроллеры, приводятся примеры и схемы. Кроме того, здесь были описаны наиболее важные преимущества, которые вы можете получить, настроив в вашем кластере Ingress.