Приветствую, Хабр!
Мы, команда ИТ архитекторов из IBM, которая занимается созданием и продвижением на рынок индустриальных решений для разных отраслей. В свободное от основной работы время исследуем новые технологии, экспериментируем и пробуем на деле лучшие практики.
Последние годы большой популярностью пользуется тематика Интернета Вещей. Наши клиенты спрашивают об универсальных коробочных решениях и платформах, которые могут располагаться локально в их Центрах Обработки Данных. Самое главное, ожидается, что на базе таких «коробочек», все новые сервисы и приложения должны разрабатываться и запускаться очень быстро, а точнее моментально или «еще вчера».
Мы задались вопросом: «А что если собрать нечто подобное на открытых и общедоступных технологиях?»
Про использование контейнеров Docker и средства управления ими на базе Kubernetes было уже немало рассказано и показано. Однако пока не удалось увидеть каким образом все эти передовые технологии могут быть использованы в промышленных масштабах для бизнес-задач, конкретно под Интернет Вещей. Так давайте же восполним этот пробел. Концепцию микросервисов, а также модные подходы разработки (DevOps), интеграции и развертывания приложений (CI/CD) будем считать немного другой задачей и отложим на потом.
В этой статье мы хотим рассказать про подготовку и установку одного из ключевых компонентов — IBM Cloud Private (по сути, промышленную сборку Docker/Kubernetes и еще чуть-чуть), который может выступить в качестве условного инфраструктурного ядра при создании локальной платформы Интернета Вещей. Спросите, почему именно он?
Потому что мы обещали открытые и общедоступные технологии (бесплатная версия для сообщества и поддержка от сообщества): hub.docker.com/r/ibmcom/icp-inception
Обзор IBM Cloud Private
IBM Cloud Private (ICP) – это приватная облачная платформа для локального развертывания и эксплуатации. ICP представляет собой интегрированную среду, которая позволяет проектировать, разрабатывать, развертывать и управлять локальными приложениями, созданными с учетом контейнерной архитектуры. Поставка ICP включает в себя оркестратор на базе Kubernetes (K8s), локальное хранилище образов, а также консоль управления и вспомогательный инструментарий для мониторинга.
Что такое приватное или частное облако?
Приватное облако — это модель облачных вычислений, запускаемая исключительно для одной организации, как правило на ее территории и ресурсах. Такое облако может управляться и обслуживаться как собственными специалистами, так и сотрудниками третьих сторон. Размещаться подобная платформа может как за брандмауэром компании, так и вне его. Частное облако предоставляет преимущества общедоступного облака, в том числе быстрое развертывание и масштабируемость, а также простоту использования, управления и гибкости. При этом локальная версия обеспечивает больший контроль над системой, повышение производительности, точно предсказуемые затраты, повышенные требования к безопасности и гибкие возможности управления в зависимости от нужд организации. Частное облако позволяет настраивать его непосредственно под конкретные бизнес-задачи и требования безопасности клиента.
Прежде чем приступать к установке ICP, определимся с терминологией:
Главный узел (master node)
- Контролирует и управляет кластером K8s.
- kubectl: инструментарий командной строки для управления кластером.
- REST API: интерфейс взаимодействия с рабочими узлами.
- etcd: является постоянным и доступным хранилищем ключей, используется в качестве хранилища резервных копий K8s для всех данных кластера.
- kube-scheduler: этот компонент наблюдает за недавно созданными контейнерами (pods), которые не имеют назначенного узла, и выбирает узел для их запуска.
- Обычно для стабильной работы и обеспечения отказоустойчивости требуется 3 и более главных узлов. В нашем случае, для экономии ресурсов мы установим все необходимые компоненты ICP на один выделенный сервер (Single Node).
Рабочий узел (worker node)
- Рабочая машина в K8s ранее известная как Миньон (Minion). Этот узел может быть любым из хостов, который получает задания от главного узла, а также контролирует процесс запуска контейнеров на нем. В зависимости от настроек кластера, рабочий узел может быть как виртуальной машиной, так и физическим сервером.
- На каждом узле могут быть запущены следующие компоненты:
- kubelet: является основным сервисом рабочего узла. Он следит за контейнерами, которые были назначены его узлу (либо apirusver для безопасного соединения, либо через локальный файл конфигурации).
- kube-proxy: отображает сервисы, определенные в API K8s на каждом узле, поддерживая сетевые правила на хосте и выполняя переадресацию соединений.
- docker: среда запуска и управления контейнерами.
- supervisord: Это легковесный процесс мониторинга и система управления, которые можно использовать для поддержания работы kubelet и docker.
- fluentd: Это сервис, который помогает обеспечить протоколирование на уровне кластера.
Контейнеры (containers)
- Приложение запущенное в изолированной среде.
- Совокупность исполняемых процессов и запускаемый образ программы.
Коконы (pods)
- Pod представляет собой группу из одного или нескольких контейнеров Docker, с общим хранилищем / сетью и спецификацией того, как запускать контейнеры на рабочем узле.
- Каждый Pod имеет свой собственный IP.
- Pod разделяет пространство имен PID, сеть и имя хоста.
Контроллер репликации (replication controller)
- Обеспечивает доступность и масштабируемость.
- Отвечает за контроль количества развернутых Pod-ов.
- Использует шаблон, описывающий что должен содержать каждый Pod.
Метки (labels)
- Метаданные, назначенные ресурсам K8s, например: контейнеры, сервисы.
- Пары «ключ-значение», прикрепленные к объектам для идентификации.
- Эти параметры критичны, так как основываются на запросе кластера к ресурсам с определенными метками.
Сервисы (services)
- Коллекция контейнеров, выставленных в качестве конечной точки (endpoint).
- Информация о состоянии кластера K8s и настроек сети, которая распространяется на все рабочие узлы.
- При правильной конфигурации Pod-ы созданные контроллером репликации будут автоматически зарегистрированы как соответствующий сервис.
Секретная информация (secrets)
- Конфиденциальные сведения, которые должны быть прочитаны или использоваться контейнерами.
- Специальные разделы (volumes) дискового накопителя монтируются автоматически чтобы контейнеры могли прочитать содержимое.
- Каждая запись имеет свой собственный путь.
Архитектура
Ниже представлена высокоуровневая архитектура ICP на которой перечислены основные компоненты с разбивкой на главный, рабочие и прокси узлы. Стоит отметить, что в этой статье основной упор сделан на связке контейнеров Docker и среды управления Kubernetes. Эти компоненты с открытым исходным кодом являются ключевыми и фундаментальными для платформы ICP. Тем не менее для полноценной работы с ICP также потребуется знание Helm — менеджера управления программными пакетами. K8s используется для развертывания и размещения экземпляров приложений, которые встроены в схемы Helm, они в свою очередь ссылаются на Docker-образы. В схемах Helm содержится информация о деталях вашего приложения, а Docker-образы содержат все программные пакеты, которые необходимы для запуска вашего приложения.
Для детального ознакомления с архитектурой и компонентами платформы ICP можно воспользоваться ссылкой на документацию в IBM Knowledge Center.
Подготовка
Для того, чтобы комфортно выполнить установку ICP за 20-30 минут, необходимы следующие минимальные аппаратные ресурсы и доступ в Интернет:
• Один хост (физический или виртуальный)
• CPU = 8 ядер (или виртуальных ядер)
• ОЗУ = 10 Гб (фактически может потребоваться до 14Гб)
• Диск = 40 Гб (на SSD как всегда быстрее)
Примечание: если у вас есть чуть больше свободного времени и чуть меньше аппаратных ресурсов, то где-то за 40-60 минут можно установить ICP на 1 виртуальном ядре core i5 и 10 Гб ОЗУ.
Установка
Загрузка Ubuntu
Скачайте дистрибутив Ubuntu Server версии 16.04.05. Выполните стандартную установку ОС на виртуальную или физическую машину с указанными выше характеристиками.
Получение IP адреса
После завершения процесса установки ОС в командной строке узнайте IP адрес своей виртуальной машины с помощью такой команды:
ifconfig
Вам необходимо записать/запомнить Ethernet IP адрес (inet addr), а также Bcast и Mask. Эти параметры отобразятся после выполнения соответствующей команды:
Рисунок 1. Пример выполнения команды «ifconfig»
Подключение по SSH
В случае, если при настройке виртуальной машины вы использовали функцию «Easy Install», то после полной установки Ubuntu Server вам необходимо доустановить OpenSSH server. Сделать это можно следующими командами:
apt install openssh-server
sudo systemctl enable sshd
После выполнения соответствующих команд у вас появится возможность подключиться к виртуальной машине с помощью SSH. В зависимости от ОС вы можете использовать разные способы подключения. Для Windows можно воспользоваться популярным инструментом PuTTY, для MacOS можно использовать команду ssh в терминале.
Рисунок 2. Пример подключения через PuTTY для Windows
На следующем этапе необходимо установить пароль для супер-пользователя (root):
sudo -i
passwd
Рисунок 3. Установка нового пароля для пользователя root
Обновление сетевого интерфейса
После того как мы настроили возможность подключения через SSH и обновили пароль супер-пользователя, для определения статичных сетевых параметров нам необходимо настроить сетевой интерфейс. Выполняется это следующей командой:
nano /etc/network/interfaces
Обновляем настройки сетевого интерфейса (primary network interface) на базе информации полученной при выполнении команды ifconfig, наш пример выглядит так:
auto ens33
iface ens33 inet static
address 192.168.175.7
netmask 255.255.255.0
network 192.168.175.0
broadcast 192.168.175.255
gateway 192.168.175.2
dns-nameservers 192.168.175.2 8.8.8.8
Примечание: важно правильно указать DNS-сервер, так как доступ в Интернет необходим для последующей установки компонентов ICP.
Рисунок 4. Настройка сетевого интерфейса
Сохраните обновленный файл при помощи следующих действий: Ctrl + X, Yes, Enter.
Для упрощения входа на виртуальную машину с правами супер-пользователя (root), необходимо внести изменения в конфигурацию SSH сервиса. Для этого необходимо выполнить такую команду:
nano /etc/ssh/sshd_config
Далее найти строку разрешения доступа и отредактировать ее соответствующим образом:
PermitRootLogin yes
Рисунок 5. Обновление конфигурации SSH
Сохраните файл как в предыдущем шаге: Ctrl + X, Yes, Enter.
После внесения всех изменений, для применения новых параметров имеет смысл полностью перезапустить виртуальную машину или перезапустить соответствующие сервисы (networking и ssh), например такими командами:
shutdown -r 0
или
service <service_name> restart
После перезапуска машины необходимо снова выполнить вход в систему через SSH.
Обновление компонентов
Обновите Ubuntu Server с помощью следующей команды (команда должна выполняться под root правами):
apt update
Примечание: если в ходе обновления возникает ошибка: «The repository 'cdrom://Ubuntu-Server 16.04.5 LTS _Xenial Xerus_ — Release amd64 (20180731) xenial Release' does not have a Release file.». Необходимо выполнить следующую команду:
sudo nano /etc/apt/sources.list
И закомментировать строку:
deb cdrom:[Ubuntu-Server 16.04.5 LTS …
Рисунок 6. Исправление возможной ошибки
Далее сохраняем файл, как это делали ранее: Ctrl + X, Yes, Enter
После исправления возможной ошибки, выполните повторно команду обновления и в результате вы должны будете увидеть что-то вроде такого:
Рисунок 7. Обновление Ubuntu
Установка IBM Cloud Private
Прежде чем выполнить установку ICP, вам необходимо отредактировать hosts файл:
nano /etc/hosts
Замените строку 127.0.1.1 ubuntu на ваш IP адрес и любое подходящее название хоста.
Убедитесь, что название хоста и псевдонима в строке отделены табуляцией или пробелом:
Рисунок 8. Изменение hosts файла
Сохраните файл: Ctrl + X, Yes, Enter
Следующие 2 команды позволят вам обновить систему и установить дополнительные модули.
apt update
apt-get install apt-transport-https ca-certificates curl software-properties-common python-minimal jq
Проследите за выводом терминала на наличие ошибок:
Рисунок 9. Установка дополнительных компонентов
Увеличьте максимальную виртуальную память командой:
sysctl -w vm.max_map_count=262144
K8s не запустится с включенным swap. Отключить его можно командой:
swapoff –a
Примечание: две предыдущие команды будут работать в текущем сеансе. При перезагрузке эти параметры будут утеряны и необходимо прописать их заново.
Применение этих параметров при загрузке ОС можно включить такими командами:
sed -i '/ swap / s/^/#/' /etc/fstab
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
Добавление GPG ключа
Воспользуемся следующей командой:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
Добавление репозитория для установки Docker
Для выполнения установки репозитория необходимо выполнить следующие 2 команды:
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
Установка Docker
Воспользуйтесь следующей командой для установки Docker (версия Docker 17.12.1 максимальная поддерживаемая версия для IBM Cloud Private 2.1.0.3):
apt-get install docker-ce=17.12.1~ce-0~ubuntu
Рисунок 10. Процесс установки Docker
Проверить работоспособность Docker можно следующей командой:
docker version
Рисунок 11. Проверка Docker
Загрузка IBM Cloud Private
Для загрузки образа ICP-ce (Сommunity Edition) с ресурса dockerHub необходимо использовать инструментарий Docker. Выполнить это можно следующей командой:
docker pull ibmcom/icp-inception:2.1.0.3
Рисунок 12. Загрузка ICP
IBM упаковала все основные компоненты, необходимые для установки, в один пакет (обратите внимание, что при необходимости можно изменить версию на более новую). Команда pull загрузит образ в локальную файловую систему (образ будет запущен для установки ICP).
Создайте каталог и перейдите в него:
mkdir /opt/icp
cd /opt/icp
Скопируйте пакет ICP в этот каталог:
docker run -e LICENSE=accept -v "$(pwd)":/data ibmcom/icp-inception:2.1.0.3 cp -r cluster /data
Примечание: эта команда инструментария Docker выполняет Linux команду copy (cp) из заданного каталога (параметр -v). Создастся каталог кластера в /opt/icp со всеми необходимыми файлами.
Настройка SSH ключей
Создаем новые ssh ключи в каталоге /opt/icp/cluster:
ssh-keygen -b 4096 -f ~/.ssh/id_rsa -N ""
cat ~/.ssh/id_rsa.pub | sudo tee -a ~/.ssh/authorized_keys
systemctl restart sshd
cp ~/.ssh/id_rsa ./cluster/ssh_key
Проверяем, что ключ создан и находится в папке /opt/icp/cluster:
ls /opt/icp/cluster
Рисунок 13. Содержимое папки cluster
Настройка ICP
Добавляем IP-адрес каждого узла в кластере в файл /opt/icp/cluster/hosts (в нашем случае мы используем один и тот же IP-адрес для каждого компонента, который мы указывали в /etc/hosts). Делаем это следующей командой:
nano /opt/icp/cluster/hosts
Рисунок 14. Содержимое файла hosts
Сохраните файл: Ctrl + X, Yes, Enter
Подробные сведения о параметрах установки можно посмотреть в файле конфигурации:
more /opt/icp/cluster/config.yaml
Не рекомендуем менять параметры установки по умолчанию.
Примечание: 2 самых важных файла для установки — это hosts и config.yaml, они описывают параметры установки ICP. В конфигурации с несколькими рабочими узлами необходимо указать список IP-адресов в разделе worker. При установке текущей версии ICP в режиме Single Node меняются IP-адреса только в файле hosts.
Установка ICP
Перейдите в каталог cluster и запустите установку:
cd /opt/icp/cluster
docker run -e LICENSE=accept --net=host -t -v "$(pwd)":/installer/cluster ibmcom/icp-inception:2.1.0.3 install
В зависимости от доступных ресурсов установка может длиться от 20 до 60 минут. При появлении ошибок (красные сообщения) внесите соответствующие изменения в конфигурационные файлы. Иногда установка может немного замедлиться из-за попыток повторного подключения к компонентам, которые еще не успели стартовать (например, во время запуска Cloudant или IAM).
Окончание установки должно выглядеть так:
Рисунок 15. Результат установки ICP
В случае ошибок возможно потребуется деинсталляция ICP:
docker run -e LICENSE=accept --net=host -t -v "$(pwd)":/installer/cluster ibmcom/icp-inception:2.1.0.3 uninstall
Перед тем, как перейти к следующему шагу, подождите около 5 минут, чтобы все компоненты ICP могли успешно запуститься.
По ссылке указанной после завершения установки войдите в консоль ICP (admin/admin):
https://<ip_address>:8443
Рисунок 16. Страница входа в панель управления
Страница приветствия ICP:
Рисунок 17. Веб интерфейс панели управления
Вверху справа выберите меню «Catalog», отобразится список доступных приложений:
Рисунок 18. Каталог компонентов
В этом каталоге представлен список приложений и ПО, описание которых вы можете изучить на досуге, но пока не стоит торопиться разворачивать их.
Нам еще предстоит научиться правильно обращаться с только что установленным ICP (не только через Веб-интерфейс, но и консоль в виде CLI — Command Line Interface), подключать постоянное хранилище (persistent storage) и производить небольшие настройки.
В качестве заключения
Подведем итоги.
Мы успешно развернули IBM Cloud Private community edition (версии 2.1.0.3) на одном хосте в виртуальной машине под ОС Ubuntu Server 16.04.5. На текущий момент нами собственноручно проверена установка на гипервизорах VMware и Hyper-V, точно работает на XenServer и никаких сложностей для VirtualBox и KVM быть не должно.
Кому очень не терпится окунуться дальше в изучение ICP, то есть отличная подборка лабораторных работ нашего коллеги тут: github.com/phthom/IBMCloudPrivate
Из предстоящих шагов — после свежей установки нам остается немного настроить ICP и начать наполнять его чем-то полезным и приближенным к практическим задачам.
Если Хабр-сообщество поддержит позитивом это начинание, то по мере продвижения наших исследований и экспериментов мы будем наполнять ядро платформы необходимыми компонентами для сбора телеметрии, хранения данных, их обработки, анализа, построения прогнозов, формирования внешних программных интерфейсов и создания пользовательских приложений. Соответственно развивая серию таких статей.
Ждем ваших отзывов и предложений!
Также, наши единомышленники из AIXportal.ru подготовили замечательный видео-ролик по установке IBM Cloud Private на своем Youtube канале, кому-то будет удобнее так: youtu.be/eQwOOTzjM24
Ссылки и полезные материалы
• Страница о продукте на русском
• Кто хочет потренировать английский, книга — «ICP для чайников» 2018г. (40 страниц)
• Официальная документация по ICP 2.1.0.3 на IBM Knowledge Center
• Открытое сообщество по ICP на IBM developerWorks
• Рецепты по ICP для разработчиков
Комментарии (12)
CristobalJunta
16.10.2018 11:26- Вместо
cat ~/.ssh/id_rsa.pub | sudo tee -a ~/.ssh/authorized_keys
каноничнее использовать командуssh-copy-id
- Когда будете изменять инструкцию про
PermitRootLogin
, тоже воспользуйтесьssh-copy-id
- Вместо
darken99
16.10.2018 18:30Вам бы инженера толкового, чтобы потом не краснеть… все таки блог компании
Рестарт sshd после копирования public key — мощно
CristobalJunta
17.10.2018 16:55Это общая процедура установки ICP? Здесь есть что-то, что принципиально для настройки именно IoT-платформы?
evitbon Автор
17.10.2018 17:42+1Пока только установка ICP Community Edition в качестве базы для IoT платформы, но если добраться до конца установки и полистать каталог, то там есть знакомые слова. Про это будем дальше писать.
roswell
Феерично. Оказывается, 'no' для PermitRootLogin придумали только для того, чтобы менять его на 'yes', а про авторизацию по ключу мы и не слышали, зато картинок напихали.
evitbon Автор
Согласен, практика не самая лучшая. Проверим и поправим.