Развертывание отказоустойчивого кластера Elasticsearch в Linux

В статье приводится краткий обзор создания отказоустойчивого кластера Microsoft Windows (WFC) в ОС Windows Server 2019 или 2016. В результате вы получите двухузловой кластер с одним общим диском и кластерный вычислительный ресурс (объект «компьютер» в Active Directory).

Что такое Kubernetes?

Kubernetes — это инструмент с открытым исходным кодом, который автоматизирует развертывание контейнера, непрерывное масштабирование, балансировку нагрузки контейнера и т.д. Google изначально разработал Kubernetes на языке программирования Go.

В настоящее время это лидер на рынке масштабирования контейнеров. Kubernetes — это идеальная платформа для размещения приложений микросервисов, которые динамически масштабируются.

Когда вы работаете в производственной среде, Kubernetes является наиболее предпочтительной и безопасной платформой для развёртывания и масштабирования контейнеризированных приложений.

Облачная платформа Google (GCP) позволяет запускать Kubernetes всего за несколько кликов. Она поддерживается другими облачными провайдерами, такими как AWS и Azure. И есть несколько доступных управляемых платформ Kubernetes .

Что меняется?

Итак, какие произойдут изменения? Изменится только среда выполнения Kubernetes. Если Docker нужен вам для создания образов и тестирования в конвейере CI/CD во время разработки, то можете продолжать его использовать. Для запуска контейнеров докер используется containerd.

Но если задействуется containerd, зачем тогда вообще использовать Docker? Docker  —  это не просто среда запуска контейнеров. Она лишь формирует его сердцевину, которую Docker выделил в отдельный проект, называемый containerd. Наряду с этой сердцевиной, в Docker имеется множество слоёв пользовательского взаимодействия, которые позволяют разработчикам легко выполнять с ней те или иные действия.

Однако эти слои ничего не значат для машины. Более того, Kubernetes не может напрямую взаимодействовать с Docker из-за несовместимости последнего с CRI Kubernetes. Поэтому ему необходим ещё один слой, называемый dockershim, который добавляет сложности и без того сложной среде запуска контейнеров (см. изображение ниже):

Читайте также:  Как выбрать внешний жесткий диск для ноутбука

Изображение автора

Не слишком ли много их стало? Поэтому в Kubernetes решили постепенно отказаться от поддержки Docker, ведь он взаимодействует с containerd опосредованно, а Kubernetes делает это напрямую. Кроме того, Kubernetes нет дела ни о каком пользовательском интерфейсе: это всего лишь машина.

Вывод

В этой статье я выделил риск, связанный с запуском контейнера Docker с настройками по умолчанию для пользователя root. Я также предложил несколько способов преодолеть этот риск.

  1. Если вы запускаете пользовательский образ, создайте нового непривилегированного пользователя и укажите его в своем Dockerfile.
  2. Если вы используете сторонние изображения, вы можете установить контекст безопасности на уровне контейнера.
  3. Еще один способ — создать политику безопасности pod, которая не позволит ни одному контейнеру работать с привилегиями root.

Проверка готовности отказоустойчивого кластера

Перед созданием кластера необходимо убедиться, что все настройки правильно сконфигурированы. Запустите Failover Cluster Manager из меню Start, прокрутите до раздела Management и кликните Validate Configuration.

Проверка готовности отказоустойчивого кластера

Выберите для валидации оба сервера.

Проверка готовности отказоустойчивого кластера

Выполните все тесты. Там же есть описание того, какие решения поддерживает Microsoft.

Проверка готовности отказоустойчивого кластера

После успешного прохождения всех нужных тестов, можно создать кластер, установив флажок Create the cluster now using the validated nodes (создать кластер с помощью валидированных узлов), или это можно сделать позже. Если во время тестирования возникали ошибки или предупреждения, можно просмотреть подробный отчет, кликнув на View Report.

Проверка готовности отказоустойчивого кластера

Настройка кластера Elasticsearch с одним главным узлом и двумя узлами данных

Следующий шаг — настройка кластера таким образом, чтобы узлы могли подключаться и устанавливать соединение друг с другом.

Для каждого узла откройте файл конфигурации Elasticsearch:

sudo nano /etc/elasticsearch/

Этот файл довольно длинный и содержит ряд настроек для разных разделов. Просмотрите файл и измените его содержимое для каждого узла, как указано далее.

es-node-1:

# назовите кластер : my-cluster : es-node-1 : true : false # введите частный IP и порт узла: : : 9200 # укажите IP узлов для сборки кластера: : [«», «»,»»]

es-node-2:

# назовите кластер : my-cluster : es-node-2 : false : true # введите частный IP и порт узла: : : 9200 # укажите IP узлов для сборки кластера: : [«», «»,»»]

es-node-3:

# назовите кластер : my-cluster : es-node-3 : false : true : : 9200 # укажите IP узлов для сборки кластера: : [«», «»,»»]

Использование контейнеров LXC

После всех проделанных выше действий мы можем перейти к запуску контейнера. Для этого используйте команду lxc-start с именем вашего контейнера, например:

lxc-start -n ubu1 -d

Опция -n задает имя контейнера, в нашем случае — ubu1, а -d говорит утилите запуска, что нужно выполнять программу в фоновом режиме. Вы можете убедиться, что контейнер запущен с помощью такой команды:

 lxc-ls -f

Тут опция -f включает более подробный вывод, в списке вы увидите только что установленный контейнер и его состояние будет запущен.

Подключение к контейнеру

Чтобы подключиться к терминалу контейнера используйте команду lxc-attach:

lxc-attach -n ubu1

После подключения вы получаете полный root доступ к файлам в контейнере, дальше рекомендуется задать пароль root и создать пользователя:

passwd

adduser losst

Настройка системы или установка программ выполняется точно так же, как и в обычной системе, например установка программ:

apt install wget openssh-server htop tmux nano iptables

Выключение контейнера

Когда вы завершили все работы в контейнере, его можно выключить, чтобы он не отнимал системные ресурсы. Для этого выполните:

lxc-stop -n ubu1

Эта команда проведет правильное завершение работы контейнера и он больше не будет потреблять ресурсов системы, кроме дискового пространства.

Клонирование контейнеров

После того как вы установили все необходимые программы в контейнере и настроили его как нужно, можно создать несколько его копий для упрощения настройки новых контейнеров и экспериментов. Для этого есть команда clone, которая создает полную копию контейнера:

Для примера давайте создадим клон контейнера ubu1 с именем ubu2. Сначала нужно остановить контейнер:

lxc-stop -n ubu1

Читайте также:  Вышла iOS 13.3.1 beta 2 для разработчиков — что нового

Затем можно клонировать. Опция -n указывает контейнер источник, а -N — имя нового контейнера:

lxc-copy -n ubu1 -N ubu2

Затем вы опять можете использовать lxc-ls, чтобы убедится, что контейнер был создан:

 lxc-ls -f

Моментальные снимки

Если вы хотите экспериментировать с контейнером, вносить какие-либо изменения, которые будет трудно исправить, то можно сделать снимок контейнера, чтобы потом вернуть все как было, с помощью одной команды восстановив снимок. Чтобы создать снимок тоже нужно остановить контейнер:

lxc-stop -n ubu1

Затем используйте команду lxc-snapshot для создания снимка:

lxc-snapshot -n ubu1

Будет создан снимок с именем snap0, следующие снимки для этой же машины будут называться snap1, snap2, и так далее. Вы можете восстановить состояние контейнера до снимка в любой момент, для этого используйте опцию -r:

lxc-snapshot -r snap0 -n ubu1

Вам нужно указать имя снимка и имя контейнера.

Запуск контейнера при старте системы

Вы можете настроить запуск контейнера автоматически при старте системы, например, для запуска веб-сервера. Для этого откройте файл конфигурации контейнера и добавьте такие строки:

vi ~/.local/share/lxc/имя_контейнера/config

= 1 = 5

Первая строка означает, что контейнер нужно запускать при старте системы,а вторая указывает, что нужно подождать пять секунд перед запуском следующего контейнера, если такие есть.

Решение проблем

Если у вас возникнут проблемы с запуском контейнеров, первое что нужно сделать, это попытаться запустить контейнер lxc с опцией -F, запуск не будет отправлен в фоновый режим и вы увидите все ошибки:

lxc-start -n ubu1 -F

Проанализировав вывод команды, вы сможете понять в чем дело и исправить проблемы. Если вы пытаетесь запустить несколько контейнеров одновременно, то можете получить ошибки типа «Quota reached» или «failed to create the configured network». Это потому что вы используете больше сетевых интерфейсов, чем было разрешено. Мы задавали этот параметр в файле /etc/lxc/lxc-usernet. Вначале мы усказали, что можно использовать два сетевых интерфейса, но можно сделать 5:

sudo vi /etc/lxc/lxc-usernet

losst veth lxcbr0 5

Вы можете указать любое нужное число, в зависимости от того сколько контейнеров вам понадобится.