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

Мы, команда ИТ архитекторов из 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)


  1. roswell
    15.10.2018 20:12
    +2

    Феерично. Оказывается, 'no' для PermitRootLogin придумали только для того, чтобы менять его на 'yes', а про авторизацию по ключу мы и не слышали, зато картинок напихали.


    1. evitbon Автор
      16.10.2018 10:34

      Согласен, практика не самая лучшая. Проверим и поправим.


  1. wibsea
    15.10.2018 22:35

    Как то не очень правильно маска написана.
    netmask 255.255.175.0


    1. evitbon Автор
      15.10.2018 22:37

      Да, спасибо! Copy&Paste он такой безжалостный и беспощадный.


  1. CristobalJunta
    16.10.2018 11:26

    • Вместо cat ~/.ssh/id_rsa.pub | sudo tee -a ~/.ssh/authorized_keys каноничнее использовать команду ssh-copy-id
    • Когда будете изменять инструкцию про PermitRootLogin, тоже воспользуйтесь ssh-copy-id


  1. darken99
    16.10.2018 18:30

    Вам бы инженера толкового, чтобы потом не краснеть… все таки блог компании
    Рестарт sshd после копирования public key — мощно


  1. evitbon Автор
    16.10.2018 22:23

    Методика избирательного чтения хорошая вещь, но каждый читает по ней в меру своей испорченности.
    Неужели у всех установка застряла на настройке sshd и ключах? =)


    1. wibsea
      17.10.2018 08:36

      Вы продолжайте цикл, похоже, что будет интересно.


  1. lexoff92
    17.10.2018 11:31

    OpenShift от IBM?


    1. evitbon Автор
      17.10.2018 11:34

      Больше похоже на симбиоз: www.ibm.com/cloud/partners/ibm-redhat
      image


  1. CristobalJunta
    17.10.2018 16:55

    Это общая процедура установки ICP? Здесь есть что-то, что принципиально для настройки именно IoT-платформы?


    1. evitbon Автор
      17.10.2018 17:42
      +1

      Пока только установка ICP Community Edition в качестве базы для IoT платформы, но если добраться до конца установки и полистать каталог, то там есть знакомые слова. Про это будем дальше писать.