Приватное облако для Интернета Вещей

eguomrkrciqdlubmnmltrvoy7tg.png

Приветствую, Хабр!

Мы, команда ИТ архитекторов из 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-образы содержат все программные пакеты, которые необходимы для запуска вашего приложения.

chhdisgv9bo9fu4bfdow2g1ydmu.png

Для детального ознакомления с архитектурой и компонентами платформы 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. Эти параметры отобразятся после выполнения соответствующей команды:
aotpghosoq-nglwcwwm-1fmn_pk.png
Рисунок 1. Пример выполнения команды «ifconfig»

Подключение по SSH


В случае, если при настройке виртуальной машины вы использовали функцию «Easy Install», то после полной установки Ubuntu Server вам необходимо доустановить OpenSSH server. Сделать это можно следующими командами:

apt install openssh-server
sudo systemctl enable sshd


После выполнения соответствующих команд у вас появится возможность подключиться к виртуальной машине с помощью SSH. В зависимости от ОС вы можете использовать разные способы подключения. Для Windows можно воспользоваться популярным инструментом PuTTY, для MacOS можно использовать команду ssh в терминале.

2wv8st2har9fplst87-ouu2xn3a.png
Рисунок 2. Пример подключения через PuTTY для Windows

На следующем этапе необходимо установить пароль для супер-пользователя (root):

sudo -i
passwd


tkp5l_dnzxuaf5-bdlf5j2nllis.png
Рисунок 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.


u3cbv77no49a5vnxx5jfvb-rena.png
Рисунок 4. Настройка сетевого интерфейса

Сохраните обновленный файл при помощи следующих действий: Ctrl + X, Yes, Enter.

Для упрощения входа на виртуальную машину с правами супер-пользователя (root), необходимо внести изменения в конфигурацию SSH сервиса. Для этого необходимо выполнить такую команду:

nano /etc/ssh/sshd_config


Далее найти строку разрешения доступа и отредактировать ее соответствующим образом:

PermitRootLogin yes


4hmg9clbw62w0fb_v7enmmptweo.png
Рисунок 5. Обновление конфигурации SSH

Сохраните файл как в предыдущем шаге: Ctrl + X, Yes, Enter.

После внесения всех изменений, для применения новых параметров имеет смысл полностью перезапустить виртуальную машину или перезапустить соответствующие сервисы (networking и ssh), например такими командами:

shutdown -r 0


или

service  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 …


x4l80wwrr4ovzqd0a_wj3jqy8ki.png
Рисунок 6. Исправление возможной ошибки

Далее сохраняем файл, как это делали ранее: Ctrl + X, Yes, Enter

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

iui77_byceas5t0cujkv-1p9ltu.png
Рисунок 7. Обновление Ubuntu

Установка IBM Cloud Private


Прежде чем выполнить установку ICP, вам необходимо отредактировать hosts файл:

nano /etc/hosts


Замените строку 127.0.1.1 ubuntu на ваш IP адрес и любое подходящее название хоста.

Убедитесь, что название хоста и псевдонима в строке отделены табуляцией или пробелом:
htjkkshqzdczphtd999qhxb_unu.png
Рисунок 8. Изменение hosts файла

Сохраните файл: Ctrl + X, Yes, Enter

Следующие 2 команды позволят вам обновить систему и установить дополнительные модули.

apt update
apt-get install apt-transport-https ca-certificates curl software-properties-common python-minimal jq


Проследите за выводом терминала на наличие ошибок:

sovefisrk9vxuzgcxusddtzir6e.png
Рисунок 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


sovefisrk9vxuzgcxusddtzir6e.png
Рисунок 10. Процесс установки Docker

Проверить работоспособность Docker можно следующей командой:

docker version


w38ysiwd6porpbipaez4_nghy9i.png
Рисунок 11. Проверка Docker

Загрузка IBM Cloud Private


Для загрузки образа ICP-ce (Сommunity Edition) с ресурса dockerHub необходимо использовать инструментарий Docker. Выполнить это можно следующей командой:

docker pull ibmcom/icp-inception:2.1.0.3


vqk4m3d4o-sclprferxvwcjprte.png
Рисунок 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


5t-fthfoh0nvegetpvqgs5qcqvm.png
Рисунок 13. Содержимое папки cluster

Настройка ICP


Добавляем IP-адрес каждого узла в кластере в файл /opt/icp/cluster/hosts (в нашем случае мы используем один и тот же IP-адрес для каждого компонента, который мы указывали в /etc/hosts). Делаем это следующей командой:

nano /opt/icp/cluster/hosts


uvg43n_tjis5f-s9x1oakpsfjwi.png
Рисунок 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).

Окончание установки должно выглядеть так:
ft9-8re-bg2velkh1hlxqdgoecu.png
Рисунок 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://:8443


t8en-t-wktktunis-pn4phoz2dw.png
Рисунок 16. Страница входа в панель управления

Страница приветствия ICP:
jibft6ehclvq8-npu2slawyoxbo.png
Рисунок 17. Веб интерфейс панели управления

Вверху справа выберите меню «Catalog», отобразится список доступных приложений:
3i_wttbjrkwapn7nvohf-fo4ziy.png
Рисунок 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 для разработчиков

© Habrahabr.ru