IBM Senior DevOps Engineer & Integration Architect. Официальный DevOps ментор и коуч в IBM Привет, Хабр! Сегодня мы узнаем, как использовать MetalLB в качестве балансировщика нагрузки, который будет выдавать внешние IP-адреса, которые для сервисов Kubernetes настроены на тип LoadBalancer. Балансировка нагрузки — это метод, с помощью которого входящий сетевой трафик направляется на заданный сервер из массива из нескольких серверов. Трафик направляется в соответствии с сервером, который лучше всего подходит для обработки запроса. Балансировщик нагрузки используется для обеспечения равномерного потока трафика в масштабе. MetalLB — это продукт для балансировки нагрузки, который обычно используется для кластеров Kubernetes, размещенных на компьютерах без операционной системы. Тем не менее, MetalLB хорошо работает, чтобы обеспечить возможности балансировки нагрузки для Kubernetes в Docker (KinD). Утилита sipcalc, как описано в руководстве, это: «калькулятор IP-подсети, состоящий из двух частей. Консольная версия на основе простого текста и веб-аналог (cgi) ... Sipcalc в своей простейшей форме принимает IP-адрес и маску подсети в командной строке и выводит информацию о подсети. Sipcalc поддерживает адреса IPv4 и IPv6». Здесь вы будете использовать sipcalc для определения диапазона IP-адресов, которые MetalLB будет использовать в качестве пула, из которого будут назначаться внешние IP-адреса. Шаг 1. Убедимся, что кластер Kubernetes запущен и работает. Выполните следующую команду: kubectl get node -o wide Шаг 2: Установим sipcalc. sudo apt install sipcalc -y Теперь мы установим балансировщик нагрузки MetalLB. Шаг 1: Устанавливаем необходимое пространство имен Kubernetes.kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.4/manifests/namespace.yamlШаг 2: Устанавливаем MetalLB.kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.4/manifests/metallb.yamlШаг 3: Устанавливаем необходимый секрет Kubernetes.kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)" Целью этого шага является определение диапазона IP-адресов, которые будут служить пулом, из которого MetalLB будет использовать внешний IP-адрес. Шаг 1: Мы узнаем IP-адреса, используемые нодами в кластере Kubernetes.kubectl get nodes -o wideВы получите результат, аналогичный следующему: Шаг 2: Находим CIDR бридж в кластере.Бесклассовая адресация (англ. Classless Inter-Domain Routing, англ. CIDR) — метод IP-адресации, позволяющий гибко управлять пространством IP-адресов, не используя жёсткие рамки классовой адресации.ip a sВы должны получить что-то по типу: Шаг 3: Мы используем инструмент sipcalc, чтобы найти диапазон IP-адресов, которые может использовать MetalLB.sipcalc 172.19.0.1/16Где 172.19.0.1/16 — это CIDR, обнаруженный с помощью ip as s. Мы назначаем Kubernetes ConfigMap кластеру Kubernetes. Нам потребуется создать специальный Kubernetes ConfigMap, потому что балансировщик нагрузки MetalLB использует ConfigMap в качестве механизма поиска. MetalLB проверит ConfigMap, чтобы найти диапазон IP-адресов, которые он может использовать для реализации балансировки нагрузки между балансировщиком нагрузки и составляющими службами. Часть данных конфигурации в ConfigMap, которая интересует MetalLB, называется data.config.addresses.Шаг 1: Мы пишем файл metallb-config.yaml nano metallb-config.yaml Шаг 2: Добавляем следующий конфиг: 172.19.255.1-172.19.255.250 — это IP-адреса, определенные на шагах выше. Обратите внимание, что Вам потребуется ввести диапазон IP-адресов, уникальный для вашего инстанса.Шаг 3: Сохраняем содержимое и выходим. Ctrl+O, Ctrl+X Шаг 4: Мы применяем ConfigMap к кластеру Kubernetes.kubectl apply -f metallb-config.yaml Мы устанавливаем набор веб-серверов nginx в качестве деплоймента Kubernetes, представленного ранее установленным балансировщиком нагрузки MetalLB. Шаг 1: Создадим деплоймент Kubernetes с 3  репликами.kubectl create deploy nginx --replicas=3 --image nginxШаг 2: Создаем сервис типа LoadBalancer и привязываем его к подам.kubectl expose deploy nginx --port 80 --type LoadBalancerШаг 3: Мы проверяем, что поды были созданы.kubectl get service Обратите внимание, что служба с именем nginx имеет внешний IP-адрес; в данном случае 172.19.255.1. Цель состоит в том, чтобы протестировать демонстрационное приложение, работающее в кластере KinD, с помощью его URL-адреса с балансировкой нагрузки. Мы получим доступ к приложению с помощью curl. Помните. Для привязки внешнего IP-адреса к базовому развертыванию требуется некоторое время. Шаг 1: Получаем внешний IP-адрес.kubectl get services Обратите внимание, что служба с именем nginx имеет внешний IP-адрес; в данном случае 172.19.255.1. Шаг 2: Вызываем сервис на основе внешнего IP-адреса, присвоенного балансировщиком нагрузки, в данном случае:curl 172.19.255.1На выходе вы получите домашнюю страницу nginx в формате HTML, как показано ниже: Поздравляем! Вы установили балансировщик нагрузки MetalLB в кластер KinD! В заключение хочу порекомендовать вам бесплатный урок, на котором мои коллеги из OTUS пошагово покажут как написать распределенное и отказоустойчивое in-memory хранилище данных, используя фреймворк Tarantool Cartridge. Зарегистрироваться на бесплатный урок