Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

Kubernetes Service — разбираем типы сервисов k8s и их применение

1041
12 минут чтения
Средний рейтинг статьи: 5

Kubernetes — это мощная платформа для оркестрации контейнеров, которая позволяет эффективно управлять развертыванием, масштабированием и эксплуатацией контейнерных приложений. Одним из ключевых компонентов Kubernetes является сервис (service), который обеспечивает доступ к приложениям, запущенным в подах, и управляет сетевым взаимодействием. В данной статье мы подробно познакомимся с типами сервисов в Kubernetes, рассмотрим их особенности и отличия. Также мы рассмотрим практические примеры для наглядной работы.

Предварительные требования

Так как мы будем рассматривать практическую часть, нам понадобится кластер Kubernetes. Арендовать готовый кластер можно с помощью сервиса Kubernetes в облаке.

Заказ кластера Kubernetes

Для начала создадим кластер Kubernetes.

1) Авторизируемся в аккаунте при помощи логина или адреса электронной почты и пароля.

2) После успешной авторизации отобразится панель управления текущего проекта. Переходим в раздел «Kubernetes» в меню слева и нажимаем на кнопку «Создать».

3) Выбираем необходимый регион из списка доступных:

Image16

4) Далее необходимо выбрать тип кластера. На выбор доступно 3 типа — Dev, Base и Custom. В нашем случае нам будет достаточно Dev-конфигурации:

Image18

5) В качестве конфигурации для воркер-нод выберем минимальную, а именно одноядерный процессор, 2 ГБ оперативной памяти и 30 ГБ места на NVMe-диске:

Image8

6) Все остальные параметры можно оставить без изменений:

Image1

7) Для заказа кластера нажимаем на кнопку «Заказать»:

Image20

После заказа кластера он будет готов к использованию в течение пары минут. kubeconfig для подключения к кластеру будут сгенерирован и доступен в раздел «Дашборд».

Kubernetes

Автоматизируйте управление контейнерными
приложениями: от развертывания
и масштабирования до мониторинга
и обработки ошибок.

Что такое сервис в Kubernetes?

Сервис в Kubernetes — это объект, который используется для определения логических групп подов и правил доступа к ним. Поды в Kubernetes имеют временный (эфирный) характер: их можно создавать, удалять, перезапускать или перемещать между узлами кластера. Это делает прямой доступ к подам по их IP-адресам ненадежным. Сервисы решают эту проблему, предоставляя стабильный сетевой интерфейс для взаимодействия с подами. Каждый сервис получает виртуальный IP-адрес (ClusterIP) или DNS-имя, через которые можно обращаться к группе подов, даже если сами поды меняются.

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

  • ClusterIP
  • NodePort
  • LoadBalancer
  • ExternalName
  • Headless Service

Далее рассмотрим каждый тип сервиса более подробно, включая его описание, назначение особенности и конфигурацию.

ClusterIP

Тип сервиса, который используется в Kubernetes по умолчанию. Сервис создает виртуальный IP-адрес внутри кластера, который используется для доступа к подам, соответствующим селектору сервиса. ClusterIP обеспечивает внутреннюю маршрутизацию трафика, то есть доступ возможен только внутри кластера без доступа во внешнюю сеть. Данный тип сервиса подходит для приложений, которые взаимодействуют только с другими компонентами внутри кластера, например, СУБД PostgreSQL или брокер сообщений Apache Kafka.

Особенности

  • Используется виртуальный IP-адрес для сетевого взаимодействия только внутри кластера.

  • Балансировка трафика происходит между подами, которые соответствуют селектору сервиса.

  • Подходит для работы со внутренними сервисами — СУБД, API, брокеры сообщений.

Пример использования

В качестве примера создадим файл типа Deployment, в котором будет указан сервис ClusterIP вместе с контейнером, где будет запущен веб-сервер Nginx. Конфигурация приведена ниже:

    

Для начала создадим новый namespace с именем service-clusterip:

    

Далее сохраняем конфигурацию выше в файл с именем nginx-test-deployment.yaml и применяем ее:

    

Проверяем, что все объекты были созданы:

    

Image7

В качестве теста выполним команду curl из ранее созданного пода (в нашем примере это под с именем nginx-clusterip-deployment-54ffdb7c4b-87dsl) на имя созданного ClusterIP сервиса — http://nginx-clusterip-service:

    

Image15

Как можно увидеть на скриншоте выше, был получен ответ от сервиса. В этом примере сервис nginx-service направляет трафик на поды с меткой app: nginx далее сервис перенаправляет запросы на порт 80 подов. Внешний доступ отсутствует, что обеспечивает изоляцию.

NodePort

Сервис типа NodePort открывает доступ к подам через порт на каждом узле кластера. Kubernetes выделяет порт из диапазона 30000–32767 (по умолчанию) и привязывает его к сервису. Это позволяет внешним клиентам обращаться к приложению через IP-адрес любого узла кластера и назначенный порт. NodePort часто используют для тестирования или в тех случаях, где требуется прямой доступ к сервису без использования внешнего балансировщика нагрузки.

Особенности

  • Доступ к приложениям возможен через комбинацию IP-адреса узла кластера и номера порта.

  • Сервис также обладает внутренним адресом ClusterIP, что позволяет использовать его внутри кластера.

  • Подходит для временного доступа или для использования в кластерах без внешнего балансировщика нагрузки.

Пример использования

Предположим, у нас в кластере запущен под с веб-сервером Nginx. Для доступа к Nginx с локального компьютера создадим сервис типа NodePort. Используем конфигурацию ниже:

    

Для начала создадим новый namespace с именем service-nodeport:

    

Далее сохраняем конфигурацию выше в файл с именем nginx-nodeport-deployment.yaml и применяем ее:

    

Проверяем, что все объекты были созданы:

    

Image21

В данном примере сервис открывает порт 30080 на всех узлах кластера на внешнем IP-адресе. Чтобы узнать внешний IP-адрес кластера, необходимо выполнить команду ниже:

    

Image4

Если внешний IP-адрес узла — 5.129.210.247 (столбец EXTERNAL-IP), то приложение будет доступно по адресу 5.129.210.247:30080. Выполним команду curl на внешний IP-адрес и порт 30080:

    

Image11

Трафик перенаправляется на порт 8080 подов. Этот подход удобен для быстрого тестирования, но не рекомендуется для использования в production-системах из-за ограничений безопасности и масштабируемости.

LoadBalancer

Обеспечивает доступ к приложениям в кластере через балансировщик нагрузки, созданный в облачной инфраструктуре. Этот тип сервиса автоматически присваивает внешний IP-адрес для доступа пользователей к приложению. LoadBalancer можно использовать для production-приложений, где важны высокая доступность и масштабируемость.

Особенности

  • Создает внешний IP-адрес, доступный из внешней сети.

  • Интегрируется с облачными балансировщиками нагрузки.

  • Включает функциональность ClusterIP и NodePort.

Пример использования

В качестве примера создадим конфигурацию? в которой будет использоваться под с Nginx. Доступ будет осуществляться через внешний IP-адрес балансировщика:

    

Для начала создадим новый namespace с именем service-loadbalancer:

    

Далее сохраняем конфигурацию выше в файл с именем nginx-loadbalancer-deployment.yaml и применяем ее:

    

Время создания внешнего балансировщика может занять 5-10 минут. Только после этого можно будет проверить, что все объекты были созданы:

    

Image5

На скриншоте выше в разделе EXTERNAL-IP появился внешний IP-адрес. Если выполнить curl на данный IP-адрес, то вернется ответ от Nginx:

    

Image13

ExternalName

ExternalName — тип сервиса, который используется для создания ссылки на внешний ресурс, находящийся за пределами кластера Kubernetes, без необходимости создания локального прокси. Это позволяет направлять трафик к внешнему сервису, используя DNS-имя, без выделения ClusterIP или создания подов в кластере.

Особенности

  • Работает как DNS-алиас для внешнего ресурса.

  • Не создает виртуальный IP-адрес.

Headless Service

Headless Service — это тип сервиса, который не привязан к ClusterIP. Он обеспечивает DNS-записи для всех подов, соответствующих указанному селектору. Такой сервис применяется для прямого взаимодействия с каждым подом, например, в распределенных системах, таких как базы данных или системы обработки сообщений.

Особенности

  • Не создает виртуальный IP-адрес.

  • DNS-запрос возвращает IP-адреса всех подов.

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

Пример использования

В качестве примера создадим конфигурацию? в которой будет запущено два пода с Nginx. Ключевая особенность — установка clusterIP со значением None, при котором Kubernetes не будет выделять виртуальный IP-адрес. Вместо этого DNS будет возвращать IP-адреса всех подов, соответствующих селектору:

    

Для начала создадим новый namespace с именем service-headless:

    

Далее сохраняем конфигурацию выше в файл с именем nginx-headless-deployment.yaml и применяем ее:

    

Проверяем, что все объекты были созданы:

    

Image3

Далее проверяем, что все поды запущены. Также получим IP-адрес узлов кластера, на которых были запущены поды:

    

Image24

Запустим временный под на основе образа curl для выполнения запросов внутри кластера:

    

Отправим запрос при помощи curl на адрес ранее созданного сервиса (nginx-headless.service). Имя сервиса записывается в формате <имя-сервиса>.<пространство-имен>.svc.cluster.local. Имя сервиса можно узнать при помощи команды:

    

В нашем примере имя сервиса выглядит как nginx-headless.service-headless.svc.cluster.local.

    

Image23

Так как поды запущены на разных нодах, при выполнении команды IP-адреса всегда будет разными:

Image14

Сравнение типов сервисов

Для наглядности воспользуемся таблицей ниже чтобы детально сравнить все четыре типа сервисов:

 

ClusterIP

NodePort

LoadBalancer

Headless Service

Наличие виртуального IP адреса

Да

Да

Да

Нет

Доступ из внешней сети

Нет

Да

Да

Нет

Балансировка

Да

Да

Да

Нет

DNS-записи

Да

Да

Да

Да

Примеры использования

Для внутренних сервисов

Для тестирования

Для использования в production-системах

Для прямого доступа к подам

Подготовили для вас выгодные тарифы на облачные серверы

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Заключение

Сервисы в Kubernetes предоставляют гибкие инструменты для управления сетевым взаимодействием внутри кластера. Каждый вид сервиса выполняет определенные функции: от организации внутренней связи между микросервисами до предоставления внешнего доступа или интеграции с внешними системами. Выбор подходящего типа сервиса определяется архитектурой приложения и требованиями к его доступности. Практические примеры, приведенные выше, демонстрируют, как настроить каждый тип сервиса для типичных сценариев. Понимание их особенностей позволяет эффективно управлять приложениями в Kubernetes и обеспечивать их надежность и масштабируемость.

1041
12 минут чтения
Средний рейтинг статьи: 5
Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server