Настройка сервисов
В Kubernetes Service — это способ открыть сетевое приложение, работающее в одном или нескольких Pod в вашем кластере.
Содержание
Зачем нужен ServiceПример Service типа ClusterIP:Headless ServicesСоздание сервиса через веб-консольСоздание сервиса через CLIПример: Доступ к приложению внутри кластераПример: Доступ к приложению вне кластераПример: Service типа ExternalNameАннотации для Service типа LoadBalancerAWS EKS ClusterHuawei Cloud CCE ClusterAzure AKS ClusterGoogle GKE ClusterПример: LoadBalancer с MetalLB BGP и Local Traffic PolicyПреимуществаПредварительные требованияШагиКлючевые моменты настройкиexternalTrafficPolicy: LocalLoadBalancer с BGPШаги развертыванияПроверкаЗачем нужен Service
-
У Pod есть собственные IP, но:
-
IP Pod нестабильны (меняются при пересоздании Pod).
-
Прямой доступ к Pod становится ненадежным.
-
-
Service решает эту проблему, предоставляя:
-
Стабильный IP и DNS-имя.
-
Автоматическое балансирование нагрузки на соответствующие Pod.
-
Пример Service типа ClusterIP:
- Доступные значения type и их поведение:
ClusterIP,NodePort,LoadBalancer,ExternalName - Набор Pod, на которые нацелен Service, обычно определяется селектором, который вы задаёте.
- Порт Service.
- Привязка
targetPortService кcontainerPortPod. Также можно ссылаться наport.nameвнутри контейнера Pod.
Headless Services
Иногда не требуется балансировка нагрузки и единый IP Service. В таком случае можно создать так называемые headless Services:
Headless Services полезны, когда:
-
Нужно обнаруживать IP отдельных Pod, а не только единый IP сервиса.
-
Требуются прямые подключения к каждому Pod (например, для баз данных типа Cassandra или StatefulSets).
-
Используются StatefulSets, где каждый Pod должен иметь стабильное DNS-имя.
Создание сервиса через веб-консоль
-
Перейдите в Container Platform.
-
В левой навигационной панели выберите Network > Services.
-
Нажмите Create Service.
-
Следуйте инструкциям для настройки соответствующих параметров.
-
Нажмите Create.
Создание сервиса через CLI
Создание сервиса на основе существующего ресурса deployment my-app.
Пример: Доступ к приложению внутри кластера
-
Примените этот YAML:
-
Запустите другой Pod:
-
Доступ к сервису
nginx-clusteripиз Podtest-pod:
Вы должны увидеть HTML-ответ с текстом вроде "Welcome to nginx!".
Пример: Доступ к приложению вне кластера
-
Примените этот YAML:
-
Проверка Pod:
-
curl к сервису:
Вы должны увидеть HTML-ответ с текстом вроде "Welcome to nginx!".
Конечно, можно получить доступ к приложению снаружи кластера, создав Service типа LoadBalancer.
Примечание: Пожалуйста, заранее настройте сервис LoadBalancer.
-
Примените этот YAML:
-
Получите внешний IP-адрес:
EXTERNAL-IP— это адрес, по которому вы можете получить доступ из браузера.
Вы должны увидеть HTML-ответ с текстом вроде "Welcome to nginx!".
Если EXTERNAL-IP равен pending, значит сервис LoadBalancer в данный момент не развернут в кластере.
Пример: Service типа ExternalName
-
Примените этот YAML:
-
Попробуйте разрешить имя внутри Pod в кластере:
затем:
Вы увидите, что имя разрешается в example.com.
Аннотации для Service типа LoadBalancer
AWS EKS Cluster
Подробное описание аннотаций для LoadBalancer Service в EKS смотрите в Annotation Usage Documentation .
Huawei Cloud CCE Cluster
Подробное описание аннотаций для LoadBalancer Service в CCE смотрите в Annotation Usage Documentation .
Azure AKS Cluster
Подробное описание аннотаций для LoadBalancer Service в AKS смотрите в Annotation Usage Documentation .
Google GKE Cluster
Подробное описание аннотаций для LoadBalancer Service в GKE смотрите в Annotation Usage Documentation .
Пример: LoadBalancer с MetalLB BGP и Local Traffic Policy
В этом примере показано, как настроить Service типа LoadBalancer с использованием MetalLB в режиме BGP и параметром externalTrafficPolicy: Local для реализации активного активного балансирования нагрузки без дополнительных сетевых переходов.
Преимущества
- Активное активное балансирование нагрузки: Трафик распределяется одновременно по нескольким узлам
- Отсутствие дополнительных сетевых переходов: Прямой маршрут к Pod без промежуточной пересылки через узлы
- Лучшее быстродействие:
externalTrafficPolicy: Localсохраняет исходный IP и снижает задержки - Высокая доступность: Объявления маршрутов BGP обеспечивают доставку трафика до здоровых узлов
Предварительные требования
Перед настройкой LoadBalancer Service убедитесь, что у вас:
- Развернут MetalLB: См. Создание пула внешних IP-адресов
- Настроен BGP Peer: См. Создание BGP Peer
- Пул внешних IP-адресов: Настроен IPAddressPool с BGPAdvertisement
Шаги
Разверните приложение с Service типа LoadBalancer и externalTrafficPolicy: Local:
Ключевые моменты настройки
externalTrafficPolicy: Local
Параметр externalTrafficPolicy: Local обеспечивает:
- Сохранение исходного IP: Исходный IP клиента сохраняется, что важно для логирования и политики безопасности
- Прямой маршрут к Pod: Трафик направляется напрямую к Pod без пересылки на уровне узла
LoadBalancer с BGP
При использовании MetalLB в режиме BGP:
- Маршруты объявляются с узлов, указанных в nodeSelectors BGPAdvertisement
- BGP peer получает эти объявления и маршрутизирует трафик соответствующим образом
- Совпадение селекторов узлов между BGPPeer и BGPAdvertisement обеспечивает согласованность маршрутизации
Шаги развертывания
-
Разверните приложение:
-
Проверьте Service LoadBalancer:
Ожидаемый вывод:
-
Проверьте работу сервиса:
Проверка
- Мониторинг endpoints сервиса:
kubectl get endpoints nginx-loadbalancer-local - Просмотр статуса сервиса:
kubectl describe svc nginx-loadbalancer-local