В Kubernetes Сервис делает приложение, запущенное на наборе pod‑ов, доступным по сети. Он предоставляет постоянное DNS‑имя для этих pod‑ов и распределяет трафик между ними для балансировки нагрузки. В этом разделе описываются базовые концепции Сервисов Kubernetes и приводится сравнение различных типов Сервисов.
Вы можете создать указанный тип Service в кластере. Описание и сценарии применения различных типов Service перечислены в таблице ниже.
Тип Service | Описание | Применение |
|---|---|---|
ClusterIP Service являются типом Service по умолчанию в Kubernetes. Они назначают виртуальный IP-адрес, доступный только внутри кластера, из блока Service CIDR кластера. | Service, которые необходимо лишь взаимодействовать друг с другом внутри кластера и не требуют экспозиции за его пределы. Например, если pod фронтенд‑приложения в кластере должен получить доступ к базе данных бекенда в том же кластере, вы можете создать ClusterIP Service для базы данных бекенда, чтобы обеспечить доступ к базе данных бекенда только внутри кластера. | |
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 добавляет внешний балансировщик нагрузки поверх сервиса NodePort и распределяет внешний трафик между несколькими pod‑ами в кластере. Он автоматически назначает внешний IP address, чтобы обеспечить доступ клиентам. Сервисы LoadBalancer обрабатывают трафик TCP и UDP на уровне 4 (транспортный уровень) модели OSI. Их можно расширить для поддержки возможностей уровня 7 (уровень приложений) для управления трафиком HTTP и HTTPS. | Облачные приложения, которым требуется стабильная и простая в управлении точка входа для внешнего доступа. Например, в производственной среде вы можете использовать сервисы LoadBalancer для публикации публичных сервисов, таких как веб‑приложения и API‑сервисы, в Интернет. Эти сервисы часто должны обрабатывать большой объём трафика, обеспечивая высокую доступность. | |
Сервис DNAT предоставляет Network Address Translation (NAT) для всех узлов в кластере, чтобы несколько узлов могли использовать один EIP. | Сервисы, которым требуется временный или низкообъёмный доступ из Интернета. Сервисы DNAT обеспечивают более высокую надёжность, чем сервисы NodePort. При использовании сервиса DNAT нет необходимости привязывать EIP к отдельному узлу, и запросы всё равно могут распределяться между рабочими нагрузками даже при отказе любого узла. | |
Для headless Services IP address кластера не выделяется. Когда клиент пытается обратиться к backend pod и выполняет DNS‑запрос к Сервису, он получает список IP address backend pod‑ов. Это позволяет клиенту напрямую взаимодействовать с отдельными pod‑ами. | Приложения, которым требуется прямое взаимодействие с конкретными backend pod, а не через прокси или балансировщики нагрузки. Например, при развертывании stateful‑приложения (например, базы данных ClickHouse) можно использовать headless Service. Он позволяет pod‑ам приложения напрямую обращаться к каждому pod‑у ClickHouse и выполнять целенаправленные операции чтения и записи. Это повышает общую эффективность обработки данных. |
Если привязка Service к сервису установлена на уровень узла, то есть значение externalTrafficPolicy равно Local, Service может стать недоступным изнутри кластера (конкретно, узлов или контейнеров). Отображается информация, аналогичная следующей:
Часто бывает, что 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 nginxNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx LoadBalancer 10.247.76.156 123.**.**.**,192.168.0.133 80:32146/TCP 37s
Когда значение externalTrafficPolicy равно Local, сбои доступа в разных моделях сетей контейнеров и режимах переадресации Service выглядят следующим образом: Тип 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 Недоступно Недоступно Доступно Тип серверного 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 поддерживается только в кластерах 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
Для решения этой проблемы можно использовать следующие методы:
Предположим, что имя Service — my-service и оно находится в пространстве имён default. Пример команды kubectl выглядит следующим образом:
kubectl patch service my-service -n default --type='merge' -p '{"spec":{"externalTrafficPolicy":"Cluster"}}'