В Kubernetes Service — это способ экспонирования сетевого приложения, которое работает в виде одного или нескольких Pod в вашем кластере.
У Pod есть собственные IP-адреса, но:
IP Pod нестабильны (меняются при пересоздании Pod).
Прямой доступ к Pod становится ненадежным.
Service решает эту проблему, предоставляя:
Стабильный IP и DNS-имя.
Автоматическое балансирование нагрузки на соответствующие Pod.
ClusterIP
, NodePort
, LoadBalancer
, ExternalName
targetPort
Service к containerPort
Pod. Также можно ссылаться на port.name
в контейнере Pod.Иногда не требуется балансировка нагрузки и единый IP Service. В таком случае можно создать так называемые headless Services:
Headless Services полезны, когда:
Нужно обнаруживать отдельные IP Pod, а не только один IP сервиса.
Требуются прямые подключения к каждому Pod (например, для баз данных типа Cassandra или StatefulSets).
Используются StatefulSets, где каждый Pod должен иметь стабильное DNS-имя.
Перейдите в Container Platform.
В левой навигационной панели выберите Network > Services.
Нажмите Create Service.
Следуйте инструкциям для настройки соответствующих параметров.
Параметр | Описание |
---|---|
Virtual IP Address | Если включено, для этого Service будет выделен ClusterIP, который можно использовать для обнаружения сервиса внутри кластера. Если отключено, будет создан headless Service, который обычно используется для StatefulSet. |
Type |
|
Target Component |
|
Port | Используется для настройки сопоставления портов для этого Service. В следующем примере другие Pod внутри кластера могут обращаться к этому Service через виртуальный 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 к Service:
Вы должны увидеть HTML-ответ с текстом типа "Welcome to nginx!".
Разумеется, можно также получить доступ к приложению из вне кластера, создав Service типа LoadBalancer.
Примечание: Пожалуйста, предварительно настройте сервис LoadBalancer.
Примените этот YAML:
Получите внешний IP-адрес:
EXTERNAL-IP
— это адрес, по которому вы можете получить доступ из браузера.
Вы должны увидеть HTML-ответ с текстом типа "Welcome to nginx!".
Если EXTERNAL-IP равен pending
, значит сервис LoadBalancer в данный момент не развернут в кластере.
Примените этот YAML:
Попробуйте разрешить имя внутри Pod в кластере:
затем:
Вы увидите, что имя разрешается в example.com
.
Для подробного описания аннотаций LoadBalancer Service в 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 Service в 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 Service в AKS, пожалуйста, обратитесь к Annotation Usage Documentation .
Ключ | Значение | Описание |
---|---|---|
service.beta.kubernetes.io/azure-load-balancer-internal |
| Определяет, использовать ли частную или публичную сеть. |
Для подробного описания аннотаций LoadBalancer Service в GKE, пожалуйста, обратитесь к Annotation Usage Documentation .
Ключ | Значение | Описание |
---|---|---|
networking.gke.io/load-balancer-type | Internal | Определяет использование частной сети. |
loud.google.com/l4-rbs | enabled | По умолчанию публичный. Если этот параметр настроен, трафик будет направляться напрямую на Pod. |