Хостинг
VDS
Аренда серверов
Домены
Почта
SSL
Хранилище
Сайты
Обзоры
Регламенты
AI Studio
Kubernetes
Архив
Балансировщики нагрузки в Kubernetes

Сервисы типа LoadBalancer в Kubernetes используются для предоставления внешнего доступа к приложениям, развернутым в кластере. Они автоматически создают внешний балансировщик нагрузки, который распределяет трафик между подами сервиса, обеспечивая высокую доступность и масштабируемость приложений. Такие сервисы особенно полезны для web-приложений, API и других сервисов, которым требуется публичный IP-адрес для приема внешнего трафика.

Рассмотрим процесс создания сервиса, заказа балансировщика нагрузки и его настройки. Для начала работы вам потребуются настроенный кластер в инфраструктуре NetAngels, конфигурационный файл для управления кластером и установленная утилита kubectl

Доступные аннотации

В NetAngels для сервисов типа LoadBalancer доступны специальные аннотации, которые позволяют настроить поведение балансировщиков нагрузки.

Аннотация Описание Возможные значения Изменяемость
k8s.netangels.cloud/load-balancer-type Определяет тип балансировщика default (обычный адрес), ddosguard (защищенный адрес) Не изменяется после создания
k8s.netangels.cloud/load-balancer-bandwidth Определяет пропускную способность балансировщика 10mbit, 20mbit, 50mbit (только для ddosguard) Может изменяться после создания

Типы балансировщиков нагрузки

Тип Описание Режим Ограничение полосы пропускания
default Обычный IP-адрес VIP Суммарное для всех балансировщиков стандартного типа - 1Гбит/с
ddosguard Защищенный от DDoS-атак IP-адрес VIP Индивидуальное, в соответствии с выбранным тарифом

Заказ балансировщика нагрузки

Заказ балансировщика нагрузки производится автоматически при создании сервиса с типом LoadBalancer. Ниже приведены примеры манифестов для создания сервиса с обычным IP-адресом и сервиса с защищенным от DDoS-атак IP-адресом

Манифест для создания обычного балансировщика (по умолчанию)

apiVersion: v1
kind: Service
metadata:
  name: default-service
  namespace: nginx
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  type: LoadBalancer
  externalTrafficPolicy: Local

Манифест для создания защищенного балансировщика с максимальной пропускной способностью

apiVersion: v1
kind: Service
metadata:
  name: secure-service
  namespace: nginx
  annotations:
    k8s.netangels.cloud/load-balancer-type: "ddosguard"
    k8s.netangels.cloud/load-balancer-bandwidth: "50mbit"
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  type: LoadBalancer
  externalTrafficPolicy: Local

Запуск приложений

Запуск веб-сервера nginx

Для демонстрации работы балансировщика нагрузки запустим веб-сервер nginx и создадим для него сервис типа LoadBalancer

kubectl apply -f - <<EOF
---
apiVersion: v1
kind: Namespace
metadata:
  name: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: nginx
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: nginx
  annotations:
    k8s.netangels.cloud/load-balancer-type: "ddosguard"
    k8s.netangels.cloud/load-balancer-bandwidth: "10mbit"
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  type: LoadBalancer
  externalTrafficPolicy: Local
EOF

Проверка работы балансировщика

# Проверка состояния подов и сервиса
kubectl get pods,svc -n nginx

# Проверка доступности адреса балансировщика
curl "$(kubectl get svc -n nginx -o jsonpath='{.status.loadBalancer.ingress[0].ip}' nginx)"

Запуск сервиса iperf для тестирования пропускной способности балансировщика

Сервис iperf может быть использован для тестирования пропускной способности сети. Запустим его выполнив следующую команду

kubectl apply -f - <<EOF
---
apiVersion: v1
kind: Namespace
metadata:
  name: iperf
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: iperf
  namespace: iperf
  labels:
    app: iperf
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iperf
  template:
    metadata:
      labels:
        app: iperf
    spec:
      containers:
      - name: iperf
        imagePullPolicy: Always
        image: networkstatic/iperf3
        command: ["iperf3", "-s"]
        ports:
        - containerPort: 5201
---
apiVersion: v1
kind: Service
metadata:
  name: iperf-default
  namespace: iperf
  annotations:
    k8s.netangels.cloud/load-balancer-type: "default"
spec:
  selector:
    app: iperf
  ports:
  - port: 5201
    targetPort: 5201
    protocol: TCP
  type: LoadBalancer
  externalTrafficPolicy: Local
---
apiVersion: v1
kind: Service
metadata:
  name: iperf-secure
  namespace: iperf
  annotations:
    k8s.netangels.cloud/load-balancer-type: "ddosguard"
    k8s.netangels.cloud/load-balancer-bandwidth: "20mbit"
spec:
  selector:
    app: iperf
  ports:
  - port: 5201
    targetPort: 5201
    protocol: TCP
  type: LoadBalancer
  externalTrafficPolicy: Local
EOF

Проверка работы сервиса iperf

# Запрашиваем информацию об IP-адресе сервиса iperf-default
kubectl get svc -n iperf -o jsonpath='{.status.loadBalancer.ingress[0].ip}' iperf-default

# Запрашиваем информацию об IP-адресе сервиса iperf-service
kubectl get svc -n iperf -o jsonpath='{.status.loadBalancer.ingress[0].ip}' iperf-secure

# Тестирование пропускной способности балансировщика нагрузки с обычным адресом
iperf3 -c <адрес балансировщика полученный ранее>
# либо
iperf3 -c "$(kubectl get svc -n iperf -o jsonpath='{.status.loadBalancer.ingress[0].ip}' iperf-default)"

# Тестирование пропускной способности балансировщика нагрузки с защищенным адресом
iperf3 -c <адрес балансировщика полученный ранее>
# либо
iperf3 -c "$(kubectl get svc -n iperf -o jsonpath='{.status.loadBalancer.ingress[0].ip}' iperf-secure)"

Отказ от балансировщика

Отказ от балансировщика происходит автоматически при изменении типа сервиса или его удалении

# Измененяем типа сервиса на ClusterIP
kubectl -n nginx patch service nginx -p '{"spec": {"type": "ClusterIP"}}'

# Удаление конкретного сервиса
kubectl -n nginx delete svc nginx

# Удаление неймспейса nginx и всех созданных в нем ресурсов
kubectl delete ns nginx
# Удаление неймспейса iperf и всех созданных в нем ресурсов
kubectl delete ns iperf

Нам доверяют тысячи компаний и разработчиков

22 года
Предоставляем услуги профессионального хостинга
35 000+
Клиентов доверяют нам размещение своих сайтов
99.99%
Подтвержденный uptime наших серверов хостинга
Callibri
Крылья
Tele-Club
Linline
Премьер зал
УГМК-Здоровье
Магнум
Алатырь
Туристер
Callibri
Крылья
Tele-Club
Linline
Премьер зал
УГМК-Здоровье
Магнум
Алатырь
Туристер
ВК49865