В Kubernetes сервис — это способ открыть сетевое приложение, работающее в виде одного или нескольких Pod в вашем кластере.
У Pod есть собственные IP, но:
IP Pod нестабильны (меняются при пересоздании Pod).
Прямой доступ к Pod становится ненадежным.
Сервис решает эту проблему, предоставляя:
Стабильный IP и DNS-имя.
Автоматическое балансирование нагрузки на соответствующие Pod.
ClusterIP
, NodePort
, LoadBalancer
, ExternalName
targetPort
сервиса к containerPort
Pod. Также можно ссылаться на port.name
внутри контейнера Pod.Иногда не требуется балансировка нагрузки и единый IP сервиса. В таком случае можно создать так называемые headless-сервисы:
Headless-сервисы полезны, когда:
Нужно обнаруживать отдельные IP Pod, а не только один IP сервиса.
Требуются прямые подключения к каждому Pod (например, для баз данных типа Cassandra или StatefulSets).
Используются StatefulSets, где каждый Pod должен иметь стабильное DNS-имя.
Перейдите в Container Platform.
В левой панели навигации выберите Network > Services.
Нажмите Create Service.
Следуйте инструкциям для настройки соответствующих параметров.
Параметр | Описание |
---|---|
Virtual IP Address | Если включено, для сервиса будет выделен ClusterIP, который можно использовать для обнаружения сервиса внутри кластера. Если отключено, будет создан headless-сервис, который обычно используется для StatefulSet. |
Type |
|
Target Component |
|
Port | Используется для настройки сопоставления портов сервиса. В следующем примере другие Pod внутри кластера могут обращаться к сервису по виртуальному IP (если включено) и TCP-порту 80; запросы будут перенаправлены на внешний TCP-порт 6379 или redis Pod целевого компонента.
|
Session Affinity | Сессия с привязкой по IP-адресу источника (ClientIP). Если включено, все запросы с одного и того же IP будут направляться на один и тот же сервер при балансировке нагрузки, что гарантирует обработку запросов от одного клиента одним сервером. |
Нажмите Create.
Создать сервис на основе существующего ресурса deployment my-app
.
Примените этот YAML:
Запустите другой Pod:
Доступ к сервису nginx-clusterip
из Pod test-pod
:
Вы должны увидеть HTML-ответ с текстом вроде "Welcome to nginx!".
Примените этот YAML:
Проверка Pod:
curl к сервису:
Вы должны увидеть HTML-ответ с текстом вроде "Welcome to nginx!".
Разумеется, можно также получить доступ к приложению снаружи кластера, создав сервис типа LoadBalancer.
Примечание: Пожалуйста, настройте сервис LoadBalancer заранее.
Примените этот YAML:
Получите внешний IP-адрес:
EXTERNAL-IP
— это адрес, по которому вы можете получить доступ из браузера.
Вы должны увидеть HTML-ответ с текстом вроде "Welcome to nginx!".
Если EXTERNAL-IP равен pending
, значит сервис LoadBalancer в данный момент не развернут в кластере.
Примените этот YAML:
Попробуйте разрешить имя внутри Pod в кластере:
затем:
Вы увидите, что оно разрешается в example.com
.
Для подробного описания аннотаций сервиса LoadBalancer в EKS смотрите Annotation Usage Documentation .
Ключ | Значение | Описание |
---|---|---|
service.beta.kubernetes.io/aws-load-balancer-type | external: Использовать официальный AWS LoadBalancer Controller. | Определяет контроллер для типа LoadBalancer. Примечание: Пожалуйста, заранее свяжитесь с администратором платформы для развертывания AWS LoadBalancer Controller. |
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type |
| Определяет, как трафик достигает Pod. |
service.beta.kubernetes.io/aws-load-balancer-scheme |
| Определяет, использовать ли частную или публичную сеть. |
service.beta.kubernetes.io/aws-load-balancer-ip-address-type |
| Определяет поддерживаемый стек IP-адресов. |
Для подробного описания аннотаций сервиса LoadBalancer в CCE смотрите Annotation Usage Documentation .
Ключ | Значение | Описание |
---|---|---|
kubernetes.io/elb.id | Укажите ID облачного балансировщика нагрузки, должен использоваться существующий облачный балансировщик. | |
kubernetes.io/elb.autocreate | Пример: {"type":"public","bandwidth_name":"cce-bandwidth-1551163379627","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","available_zone":["cn-north-4b"],"l4_flavor_name":"L4_flavor.elb.s1.small"} Примечание: Пожалуйста, сначала ознакомьтесь с инструкцией по заполнению и при необходимости скорректируйте параметры примера. | Новый облачный балансировщик нагрузки для создания. |
kubernetes.io/elb.subnet-id | ID подсети, в которой расположен кластер. При версии Kubernetes 1.11.7-r0 и ниже это поле обязательно при создании нового облачного балансировщика нагрузки. | |
kubernetes.io/elb.class |
| Определяет тип создаваемого облачного балансировщика нагрузки, см. Различия между эксклюзивной и общей балансировкой нагрузки. |
kubernetes.io/elb.enterpriseID | Определяет проект предприятия, к которому принадлежит создаваемый облачный балансировщик нагрузки. |
Для подробного описания аннотаций сервиса LoadBalancer в AKS смотрите Annotation Usage Documentation .
Ключ | Значение | Описание |
---|---|---|
service.beta.kubernetes.io/azure-load-balancer-internal |
| Определяет, использовать ли частную или публичную сеть. |
Для подробного описания аннотаций сервиса LoadBalancer в GKE смотрите Annotation Usage Documentation .
Ключ | Значение | Описание |
---|---|---|
networking.gke.io/load-balancer-type | Internal | Определяет использование частной сети. |
loud.google.com/l4-rbs | enabled | По умолчанию публичный. Если этот параметр настроен, трафик будет направляться напрямую на Pod. |