Балансировщики нагрузки в 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 наших серверов хостинга
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
ВК49865