Облачная платформаAdvanced

Обзор сервиса

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

В Kubernetes Сервис делает приложение, запущенное на наборе pod‑ов, доступным по сети. Он предоставляет постоянное DNS‑имя для этих pod‑ов и распределяет трафик между ними для балансировки нагрузки. В этом разделе описываются базовые концепции Сервисов Kubernetes и приводится сравнение различных типов Сервисов.

Типы Service

Вы можете создать указанный тип Service в кластере. Описание и сценарии применения различных типов Service перечислены в таблице ниже.

Тип Service

Описание

Применение

ClusterIP

ClusterIP Service являются типом Service по умолчанию в Kubernetes. Они назначают виртуальный IP-адрес, доступный только внутри кластера, из блока Service CIDR кластера.

Service, которые необходимо лишь взаимодействовать друг с другом внутри кластера и не требуют экспозиции за его пределы.

Например, если pod фронтенд‑приложения в кластере должен получить доступ к базе данных бекенда в том же кластере, вы можете создать ClusterIP Service для базы данных бекенда, чтобы обеспечить доступ к базе данных бекенда только внутри кластера.

NodePort

A NodePort Service opens a port on each node in a cluster to allow external traffic to access the Service through <node-IP-address>:<node-port>.

Сценарии, в которых требуется временный или низкообъёмный доступ.

Например, в тестовой среде вы можете использовать сервис NodePort при развертывании и отладке веб‑приложения.

LoadBalancer

Сервис LoadBalancer добавляет внешний балансировщик нагрузки поверх сервиса NodePort и распределяет внешний трафик между несколькими pod‑ами в кластере. Он автоматически назначает внешний IP address, чтобы обеспечить доступ клиентам. Сервисы LoadBalancer обрабатывают трафик TCP и UDP на уровне 4 (транспортный уровень) модели OSI. Их можно расширить для поддержки возможностей уровня 7 (уровень приложений) для управления трафиком HTTP и HTTPS.

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

Например, в производственной среде вы можете использовать сервисы LoadBalancer для публикации публичных сервисов, таких как веб‑приложения и API‑сервисы, в Интернет. Эти сервисы часто должны обрабатывать большой объём трафика, обеспечивая высокую доступность.

DNAT

Сервис DNAT предоставляет Network Address Translation (NAT) для всех узлов в кластере, чтобы несколько узлов могли использовать один EIP.

Сервисы, которым требуется временный или низкообъёмный доступ из Интернета. Сервисы DNAT обеспечивают более высокую надёжность, чем сервисы NodePort. При использовании сервиса DNAT нет необходимости привязывать EIP к отдельному узлу, и запросы всё равно могут распределяться между рабочими нагрузками даже при отказе любого узла.

Headless Services

Для headless Services IP address кластера не выделяется. Когда клиент пытается обратиться к backend pod и выполняет DNS‑запрос к Сервису, он получает список IP address backend pod‑ов. Это позволяет клиенту напрямую взаимодействовать с отдельными pod‑ами.

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

Например, при развертывании stateful‑приложения (например, базы данных ClickHouse) можно использовать headless Service. Он позволяет pod‑ам приложения напрямую обращаться к каждому pod‑у ClickHouse и выполнять целенаправленные операции чтения и записи. Это повышает общую эффективность обработки данных.

Почему Service недоступен изнутри кластера

Если привязка Service к сервису установлена на уровень узла, то есть значение externalTrafficPolicy равно Local, Service может стать недоступным изнутри кластера (конкретно, узлов или контейнеров). Отображается информация, аналогичная следующей:

upstream connect error or disconnect/reset before headers. reset reason: connection failure
Or
curl: (7) Failed to connect to **.**.**.** port 900: Connection refused
Or
curl: (28) Failed to connect to **.**.**.** port 1122: Connection timed out

Часто бывает, что load balancer в кластере недоступен. Причина следующая: когда Kubernetes создает Service, kube-proxy добавляет адрес доступа к load balancer в качестве внешнего IP‑address (External‑IP, как показано в выводе команды) в iptables или IPVS. Если клиент внутри кластера инициирует запрос к load balancer, этот адрес рассматривается как внешний IP‑address Service, и запрос напрямую перенаправляется kube-proxy, минуя load balancer за пределами кластера.

# kubectl get svc nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx LoadBalancer 10.247.76.156 123.**.**.**,192.168.0.133 80:32146/TCP 37s

Когда значение externalTrafficPolicy равно Local, сбои доступа в разных моделях сетей контейнеров и режимах переадресации Service выглядят следующим образом:

Note
  • Для многоподовой рабочей нагрузки убедитесь, что все pod доступны. В противном случае существует вероятность сбоя доступа к рабочей нагрузке.
  • В таблице перечислены только сценарии, при которых доступ может быть невозможен. Другие сценарии, не указанные в таблице, означают нормальный доступ.
  • Для кластеров CCE, использующих IPVS, установите externalTrafficPolicy в Local для привязки Service на уровне узла. Для кластеров CCE Turbo с отключенным DataPlane V2 привязка на уровне узла поддерживается только когда бэкенд Service использует hostNetwork.
    • Тип Service сервера

      Тип доступа

      Источник запросов клиента

      Кластер Tunnel Network

      Кластер VPC Network (DataPlane V2 отключен. Если включен, см. Clusters with DataPlane V2 Enabled.)

      Кластер CCE Turbo (DataPlane V2 отключен. Если включен, см. Clusters with DataPlane V2 Enabled.)

      NodePort Service

      Public/Private network

      Тот же узел, что и pod сервиса

      Доступ через IP узла + NodePort на серверном узле: Успешно

      Доступ через IP узла + NodePort на несерверном узле: Неудача

      Доступ через IP узла + NodePort на серверном узле: Успешно

      Доступ через IP узла + NodePort на несерверном узле: Неудача

      Доступно

      Другой узел, чем pod сервиса

      Доступ через IP узла + NodePort на серверном узле: Успешно

      Доступ через IP узла + NodePort на другом узле: Неудача

      Доступ через IP узла + NodePort на серверном узле: Успешно

      Доступ через частный IP узла + NodePort на клиентском узле: Успешно

      Доступ через EIP узла + NodePort на клиентском узле: Неудача

      Доступ через IP узла + NodePort на другом узле: Неудача

      Доступно

      Другие контейнеры на том же узле, что и pod сервиса

      Доступ через node IP + NodePort на серверном узле: Успешно

      Доступ через node IP + NodePort на узле без роли сервера: Не удалось

      Доступ через node EIP + NodePort на серверном узле: Успешно

      Доступ через node private EIP + NodePort на серверном узле: Не удалось

      Доступ через node IP + NodePort на узле без роли сервера: Не удалось

      Доступно

      Другие контейнеры на другом узле, отличном от pod сервиса

      Доступ через node IP + NodePort на серверном узле: Успешно

      Доступ через node private IP + NodePort на клиентском узле: Успешно

      Доступ через node IP + NodePort на другом узле: Не удалось

      Доступ через node IP + NodePort на серверном узле: Успешно

      Доступ через node private IP + NodePort на клиентском узле: Успешно

      Доступ через node IP + NodePort на другом узле: Не удалось

      Доступно

      LoadBalancer Service с использованием dedicated load balancer

      Приватная сеть

      Тот же узел, что и service pod

      Недоступно

      Недоступно

      Доступно

      Другие контейнеры на том же узле, что и service pod

      Недоступно

      Недоступно

      Доступно

  • Для кластеров CCE, использующих IPTABLES, установите externalTrafficPolicy в Local для привязки Service на уровне узла. Для кластеров CCE Turbo с отключённым DataPlane V2 привязка на уровне узла поддерживается только когда бэкенд Service использует hostNetwork.
    • Тип серверного Service

      Тип доступа

      Источник клиентского запроса

      Кластер туннельной сети

      VPC Network Cluster (DataPlane V2 отключён. Если включён, см. Clusters with DataPlane V2 Enabled.)

      CCE Turbo Cluster (DataPlane V2 отключён. Если включено, см. Clusters with DataPlane V2 Enabled.)

      Служба NodePort

      Публичная/приватная сеть

      Тот же узел, что и pod службы

      Доступ через IP узла + NodePort на серверном узле: Успешно

      Доступ через IP узла + NodePort на несерверном узле: Не удалось

      Доступ через IP узла + NodePort на серверном узле: Успешно

      Доступ через IP узла + NodePort на несерверном узле: Не удалось

      Доступно

      Другой узел, чем pod службы

      Доступ через IP узла + NodePort на серверном узле: Успешно

      Доступ через приватный IP узла + NodePort на клиентском узле: Успешно

      Доступ через EIP узла + NodePort на клиентском узле: Не удалось

      Доступ через IP узла + NodePort на другом узле: Не удалось

      Доступ через IP узла + NodePort на серверном узле: Успешно

      Доступ через частный IP-адрес узла + NodePort на клиентском узле: Успешно

      Доступ через EIP узла + NodePort на клиентском узле: Не удалось

      Доступ через IP-адрес узла + NodePort на другом узле: Не удалось

      Доступно

      Другие контейнеры на том же узле, что и pod сервиса

      Доступ через IP-адрес узла + NodePort на серверном узле: Успешно

      Доступ через IP-адрес узла + NodePort на узле, не являющемся серверным: Не удалось

      Доступ через EIP узла + NodePort на серверном узле: Успешно

      Доступ через частный EIP узла + NodePort на серверном узле: Не удалось

      Доступ через IP-адрес узла + NodePort на узле, не являющемся серверным: Не удалось

      Доступно

      Другие контейнеры на другом узле, отличном от pod сервиса

      Доступ через IP-адрес узла + NodePort на серверном узле: Успешно

      Доступ через IP-адрес узла + NodePort на узле, не являющемся серверным: Не удалось

      Доступ через IP-адрес узла + NodePort на серверном узле: Успешно

      Доступ через node IP + NodePort на узле без сервера: Failure

      Доступно

      LoadBalancer Service использует выделенный load balancer

      Приватная сеть

      Тот же узел, что и service pod

      Недоступно

      Недоступно

      Доступно

      Другие контейнеры на том же узле, что и service pod

      Недоступно

      Недоступно

      Доступно

  • Для кластеров с включённым DataPlane V2 установите externalTrafficPolicy в Local для привязки Service на уровне узла.
    Note

    DataPlane V2 поддерживается только в кластерах CCE VPC-network и Turbo. После включения он полностью заменяет kube-proxy, устраняя необходимость настройки режима переадресации сервиса.

    • Server Service Type

      Тип доступа

      Источник клиентского запроса

      VPC Network Cluster (DataPlane V2 включён для замены kube-proxy)

      CCE Turbo Cluster (DataPlane V2 включён для замены kube-proxy)

      NodePort Service

      Публичная/приватная сеть

      Тот же узел, что и pod сервиса

      Доступ через node IP + NodePort на серверном узле: Успех

      Доступ через node private IP + NodePort на несерверном узле: Успех

      Доступ через node EIP + NodePort на несерверном узле: Неудача

      Доступ через node IP + NodePort на серверном узле: Успех

      Доступ через node private IP + NodePort на несерверном узле: Успех

      Доступ через node EIP + NodePort на несерверном узле: Неудача

      Другой узел, чем pod сервиса

      Доступ через node IP + NodePort на серверном узле: Успех

      Доступ через частный IP-адрес узла + NodePort на узле, не являющемся сервером: Успешно

      Доступ через EIP узла + NodePort на узле, не являющемся сервером: Не удалось

      Доступ через IP-адрес узла + NodePort на серверном узле: Успешно

      Доступ через частный IP-адрес узла + NodePort на узле, не являющемся сервером: Успешно

      Доступ через EIP узла + NodePort на узле, не являющемся сервером: Не удалось

      Другие контейнеры на том же узле, что и service pod

      Доступ через IP-адрес узла + NodePort на серверном узле: Успешно

      Доступ через IP-адрес узла + NodePort на другом узле: Не удалось

      Доступ через IP-адрес узла + NodePort на серверном узле: Успешно

      Доступ через IP-адрес узла + NodePort на другом узле: Не удалось

      Другие контейнеры на узле, отличном от того, где находится service pod

      Доступ через IP-адрес узла + NodePort на серверном узле: Успешно

      Доступ через частный IP-адрес узла + NodePort на клиентском узле: Успешно

      Доступ через IP-адрес узла + NodePort на другом узле: Не удалось

      Доступ через IP-адрес узла + NodePort на серверном узле: Успешно

      Доступ через node private IP + NodePort на клиентском узле: Success

      Доступ через node IP + NodePort на другом узле: Failure

      LoadBalancer Service, использующий выделенный load balancer

      Private network

      Тот же узел, что и service pod

      Inaccessible

      Inaccessible

      Другие контейнеры на том же узле, что и service pod

      Inaccessible

      Accessible

Для решения этой проблемы можно использовать следующие методы:

  • (Recommended) В кластере используйте ClusterIP Service или service domain name для доступа.
  • Установите externalTrafficPolicy сервиса в значение Cluster, что означает привязку сервиса на уровне кластера. Обратите внимание, что это влияет на source address persistence.

    Предположим, что имя Service — my-service и оно находится в пространстве имён default. Пример команды kubectl выглядит следующим образом:

    kubectl patch service my-service -n default --type='merge' -p '{"spec":{"externalTrafficPolicy":"Cluster"}}'
  • Используя функцию pass-through сервиса, kube-proxy обходится, когда для доступа используется ELB address. Сначала обращаются к ELB load balancer, а затем к рабочей нагрузке. Подробности см. в Configuring Passthrough Networking for a LoadBalancer Service.
    Note
    • В стандартном кластере CCE после настройки passthrough networking с использованием выделенного load balancer частный IP-адрес load balancer недоступен с узла, на котором находится pod рабочей нагрузки, или с других pod на том же узле.
    • Эта функция доступна только в кластерах версии v1.19 и новее.
    • В IPVS параметры passthrough сервисов, подключенных к одному и тому же load balancer, должны быть одинаковыми.
    • Если используется привязка сервиса уровня узла (local), kubernetes.io/elb.pass-through автоматически устанавливается в onlyLocal для включения passthrough networking.