Балансировщик нагрузки (Load Balancer) предоставляет сервис для приложений по распределению сетевого трафика между несколькими серверами или ресурсами, размещенными в облаке. Балансировщик нагрузки помогает достичь оптимальной утилизации ресурсов, горизонтального масштабирования и обеспечения отказоустойчивости.
В Kubernetes за балансировку сетевого трафика на уровне L4 отвечает сущность Service (сервис) с типом LoadBalancer. В Containerum Kubernetes реализован Диспетчер облачных контроллеров (Cloud Controller Manager, CCM), который после применения манифеста самостоятельно создаст нужный Балансировщик нагрузки.
Существует 2 типа балансировщиков нагрузки:
LoadBalancer с публичным IP-адресом
Для Балансировщика нагрузки выделяется публичный IP адрес из пула провайдера. Возможность назначать IP адреса из зарезервированного за вами пула появится позже.
LoadBalancer с внутренним IP-адресом
Приложение будет доступно из облачной сети Cloud MTS либо из внутренних сетей организации, подключенных через VPN. При выборе этой опции IP адрес балансировщика не должен пересекаться с выделенными внутри облака MWS подсетями, либо с подсетями организации, из которых требуется доступ до приложения.
Примечание
Созданный сетевой балансировщик тарифицируется согласно установленным правилам тарификации:
Балансировщик нагрузки - 0,5 рублей / час без НДС
Публичный IP-адрес - 0,1667 рублей / час без НДС (только для LoadBalancer с публичным IP-адресом)
IP-адрес для LoadBalancer с внутренним IP-адресом может быть назначен любым из следующих способов:
вручную,
автоматически без указания диапазона адресов,
автоматически из предоставленного пользователем диапазона.
При автоматическом назначении выбирается свободный и валидный IP-адрес.
К внутренним адресам, доступным для создания LoadBalancer, относятся IP-адреса из следующих подсетей (стандарт RFC 1918):
от 10.0.0.0 до 10.255.255.255 с маской 255.0.0.0 или /8 (за исключением подсетей 10.28.0.0/16, 10.22.64.0/18, 10.22.8.0/24, 10.22.9.0/27, 10.22.128.0/18, 10.25.1.239/32, 10.30.0.0/24)
от 172.16.0.0 до 172.31.255.255 с маской 255.240.0.0 или /12
от 192.168.0.0 до 192.168.255.255 с маской 255.255.0.0 или /16
Внимание
Заданный вручную внутренний IP-адрес не должен пересекаться с:
IP-адресами других балансировщиков нагрузки из внутренней сети, то есть внутри одного проекта
подсетями, зарезервированными для инфраструктуры внутри облака MWS (указаны выше)
подсетями Service CIDR, Cluster (Pods) CIDR (задаются в дополнительных настройках сети при создании кластера) всех кластеров Containerum в рамках одного проекта
с подсетью для нод, которая была выбрана при создании кластера
другими подсетями, созданными в рамках одного проекта
Таким образом:
невозможно создать 2 LoadBalancer с одним и тем же внутренним IP-адресом
невозможно создать LoadBalancer, если внутренний IP-адрес LoadBalancer пересечется с задействованными диапазонами подсетей
Важно
Внутренний IP-адрес, используемый для создания LoadBalancer не будет принадлежать какой-либо созданной вами подсети. Это значит, что для каждого LoadBalancer нужно отдельно настраивать правила для исходящих и входящих подключений.
Сохраните следующую спецификацию для создания сервиса типа LoadBalancer в YAML-файл с именем service-lb.yaml:
yaml
1
apiVersion: v1
2
kind: Service
3
metadata:
4
name: sample-lb
5
spec:
6
selector:
7
app: echoserver
8
externalTrafficPolicy: Cluster# Возможные значения "Cluster" или "Local"
9
type: LoadBalancer
10
ports:
11
- port: 80# порт, на котором будет доступно ваше приложение извне
12
name: "main"
13
targetPort: 8080# внутренний порт контейнера с вашим приложением
14
protocol: TCP# Возможные значения "TCP" или "UDP"
15
- port: 8080
16
name: "secondary"
17
targetPort: 8080
18
protocol: TCP
где:
externalTrafficPolicy — параметр, с помощью которого можно управлять маршрутизацией трафика на нод. Возможные параметры:
Cluster — трафик попадает на любой из узлов кластера; при этом в случае отсутствия нужных подов на узле трафик перенаправляется с помощью kube-proxy на другой узел.
[СКОРО]Local — трафик напрямую попадает на узлы, где запущены контейнеры приложений; при этом сохраняется IP-адрес запроса пользователя, и используется меньше горизонтального трафика между виртуальными машинами.
protocol — параметр, который позволяет выбрать протокол передачи данных. Возможные параметры:
TCP — гарантирует доставку данных. Подходит для большинства сценариев.
UDP — работает быстрее, но не гарантирует доставку данных. Используется для систем чувствительных к задержкам, например, для стриминга, видео-конференций и т.д.
yaml
1
apiVersion: v1
2
kind: Service
3
metadata:
4
name: sample-lb
5
annotations:
6
cloud.mts.ru/load-balancer-type: private# для указания типа балансировщика (обязательно)
7
cloud.mts.ru/private-load-balancer-ip: {IP-адрес из допустимого диапазона} # задает внутренний IP балансировщика (опционально)
8
spec:
9
selector:
10
app: echoserver
11
externalTrafficPolicy: Cluster
12
type: LoadBalancer
13
ports:
14
- port: 80# порт, на котором будет доступно ваше приложение извне
15
name: "main"
16
targetPort: 8080# внутренний порт контейнера с вашим приложением
17
protocol: TCP# Возможные значения "TCP" или "UDP"
18
- port: 8080
19
name: "secondary"
20
targetPort: 8080
21
protocol: TCP
где:
cloud.mts.ru/load-balancer-type: private — аннотация, которая позволяет пометить балансировщик с внутренним IP-адресом; указывать тип балансировщика необходимо, если это LoadBalancer с внутренним IP-адресом
cloud.mts.ru/private-load-balancer-ip — ключ аннотации, который позволяет задать внутренний IP-адрес; адрес можно не указывать - тогда балансировщику будет сгенерирован и присвоен внутренний IP-адрес автоматически; если IP-адрес балансировщика указывается, то он должен быть валидным, иначе балансировщик не создастся.
externalTrafficPolicy — параметр, с помощью которого можно управлять маршрутизацией трафика на узлах. Возможные параметры:
Cluster — трафик попадает на любой из узлов кластера; при этом в случае отсутствия нужных подов на узле трафик перенаправляется с помощью kube-proxy на другой узел.
[СКОРО]Local — трафик напрямую попадает на узлы, где запущены контейнеры приложений; при этом сохраняется IP-адрес запроса пользователя, и используется меньше горизонтального трафика между виртуальными машинами.
protocol — параметр, который позволяет выбрать протокол передачи данных. Возможные параметры:
TCP — гарантирует доставку данных. Подходит для большинства сценариев.
UDP — работает быстрее, но не гарантирует доставку данных. Используется для систем чувствительных к задержкам, например, для стриминга, видео-конференций и т.д.
yaml
1
apiVersion: v1
2
kind: Service
3
metadata:
4
name: sample-lb
5
annotations:
6
cloud.mts.ru/load-balancer-type: private# для указания типа балансировщика (обязательно)
7
cloud.mts.ru/private-load-balancer-ip-range: {IP-range из допустимого диапазона, например 192.168.0.0/24} # задает внутренний IP балансировщика (автоматически)
8
spec:
9
selector:
10
app: echoserver
11
externalTrafficPolicy: Cluster
12
type: LoadBalancer
13
ports:
14
- port: 80# порт, на котором будет доступно ваше приложение извне
15
name: "main"
16
targetPort: 8080# внутренний порт контейнера с вашим приложением
17
protocol: TCP# Возможные значения "TCP" или "UDP"
18
- port: 8080
19
name: "secondary"
20
targetPort: 8080
21
protocol: TCP
где:
cloud.mts.ru/load-balancer-type: private — аннотация, которая позволяет пометить балансировщик с внутренним IP-адресом; указывать тип балансировщика необходимо, если это LoadBalancer с внутренним IP-адресом
cloud.mts.ru/private-load-balancer-ip-range — ключ аннотации, который позволяет задать внутренний диапазон для выбора IP-адреса; внутренний IP-адрес будет сгенерирован и присвоен автоматически из этого диапазона; если диапазон IP-адресов балансировщика указывается, то он должен быть валидным, иначе балансировщик не создастся.
externalTrafficPolicy — параметр, с помощью которого можно управлять маршрутизацией трафика на узлах. Возможные параметры:
Cluster — трафик попадает на любой из узлов кластера; при этом в случае отсутствия нужных подов на узле трафик перенаправляется с помощью kube-proxy на другой узел.
[СКОРО]Local — трафик напрямую попадает на узлы, где запущены контейнеры приложений; при этом сохраняется IP-адрес запроса пользователя, и используется меньше горизонтального трафика между виртуальными машинами.
protocol — параметр, который позволяет выбрать протокол передачи данных. Возможные параметры:
TCP — гарантирует доставку данных. Подходит для большинства сценариев.
UDP — работает быстрее, но не гарантирует доставку данных. Используется для систем чувствительных к задержкам, например, для стриминга, видео-конференций и т.д.
Одновременная работа по протоколам TCP и UDP не поддерживается.
Подробнее про настройки сервиса можно прочитать в документации K8s.
Выполните команду:
shell
1
kubectlapply-fservice-lb.yaml
Результат выполнения команды:
shell
1
service/sample-lbcreated
Посмотрите информацию о созданном сетевом балансировщике нагрузки
Чтобы протестировать работоспособность балансировщика, нужно из одного кластера отправить запрос на другой. Для этого понадобится подключиться ко второму кластеру и открыть в нем терминал.
Создайте еще один кластер в текущем проекте и разверните на нем еще одно приложение echoserver (или любое другое).
В терминале локальной машины выполните команду:
shell
1
kubectlgetpods
Результат выполнения команды:
shell
1
NAMEREADYSTATUSRESTARTSAGE
2
{полное название пода} 1/1 Running 0 20h
Cкопируйте полное название пода и вставьте в следующую команду в терминал локальной машины:
Подключиться к кластеру и открыть терминал также можно через Lens. Импортируйте kubeconfig нового кластера в Lens, подключитесь к кластеру и во вкладке Pods выберите соответствующий под. Подключиться к терминалу можно по кнопке Shell.
В открывшемся терминале выполните команду:
shell
1
curlxxx.xxx.xxx.xxx:pppp
где:
xxx.xxx.xxx.xxx — внутренний IP-адрес балансировщика нагрузки первого кластера из поля IP-адрес на странице “Балансировщики нагрузки” или из поля EXTERNAL-IP.
pppp - порт, на котором работает созданный ранее балансировщик нагрузки.
В Containerum Kubernetes не поддерживаются операции изменения LoadBalancer. Например, нельзя изменить тип балансировщика с публичного на приватный. Также нельзя заменить один IP-адрес на другой.
Для того, чтобы выполнить изменения в балансировщике, нужно его полностью пересоздать. Для удаления сервиса выполните следующую команду:
shell
1
kubectldelete-fservice-lb.yaml
Для создания LoadBalancer с изменениями воспользуйтесь инструкцией по созданию различных типов LoadBalancer. Подробнее…