Сервисы типа 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 и создадим для него сервис типа 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 может быть использован для тестирования пропускной способности сети. Запустим его выполнив следующую команду
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
# Запрашиваем информацию об 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