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

В этой статье:

Схема архитектуры развёртывания

Технические требования

Подготовка среды для продукта «Форсайт. Мобильная платформа»

Подготовка узлов

Установка пакета Heartbeat

Подготовка кластера системы Ceph

Установка Ceph

Добавление OSD-узлов

Создание сервера метаданных

Развертывание Ceph-менеджеров

Подготовка кластера Kubernetes (k8s)

Установка Rancher

Подготовка к запуску продукта «Форсайт. Мобильная платформа»

Запуск продукта «Форсайт. Мобильная платформа»

Перечень портов, используемых для работы кластера

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

Преимущества нового подхода:

Схема архитектуры развёртывания

Основные этапы схемы развёртывания отказоустойчивого кластера, которые приведены в данной статье:

  1. Подготовка среды для продукта «Форсайт. Мобильная платформа»;

  1. Подготовка к запуску продукта «Форсайт. Мобильная платформа»;

  2. Запуск продукта «Форсайт. Мобильная платформа».

Обобщенная схема архитектуры развертывания отказоустойчивого кластера:

 

На схеме представлена работа системных сервисов Kubernetes на главных узлах кластера, а также взаимодействие главных узлов с рабочими узлами и входящими запросами через специальные сервисы с поддержкой балансировки нагрузки.

Схема обеспечения отказоустойчивости управляющей части кластера:

Примечание. Каждый главный узел в кластере содержит следующие процессы и компоненты:
1. kube-apiserver. Единственная точка управления для кластера. Команда kubectl взаимодействует напрямую через API;
2. kube-controller-manager. Процесс управления состоянием кластера с помощью контроллеров;
3. kube-scheduler. Процесс планирования задач на всех доступных узлах в кластере;
4. etcd. База данных на основе пар «ключ-значение», в которой хранятся сведения о состоянии всех компонент кластера.

Технические требования

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

Три узла являются главными и используются исключительно для управления кластером, контроля состояния его целостности, планирования и запуска контейнеров с приложениями в модулях кластера. К главным узлам предъявляются следующие системные требования:

Три узла являются рабочими и несут основную нагрузку (на данных узлах исполняются модули с приложениями). К рабочим узлам предъявляются следующие системные требования:

Настраиваемая программная среда: Docker, Kubernetes и Ceph (при необходимости).

Подключение директории /var/lib/docker должно быть выполнено на отдельный диск или LVM.

Примечание. В дальнейшем описании для главных узлов используются названия kn0, kn1, kn2, для рабочих узлов - kn3, kn4, kn5.

Подготовка среды для продукта «Форсайт. Мобильная платформа»

Подготовка узлов

Для подготовки узлов:

  1. На всех узлах создайте пользователя fmpadmin, от имени которого будет происходить установка и управление будущим кластером:

sudo useradd -m -d /home/fmpadmin -s /bin/bash fmpadmin
# Задание пароля пользователю fmpadmin
sudo passwd fmpadmin

Добавьте пользователя fmpadmin в sudo users, для того чтобы всякий раз при использовании команды sudo не приходилось вводить пароль:

echo "fmpadmin ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/fmpadmin
chmod 0440 /etc/sudoers.d/fmpadmin

  1. Отключите SWAP-раздел на всех узлах кластера, так как kubelet не поддерживает работу со SWAP:

sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
swapoff –all

Важно. Если все узлы кластера являются виртуальными машинами под управлением VMware, то на каждый узел установите пакет vmware-tools:
 sudo apt-get install -y open-vm-tools

  1. Установите базовые пакеты и среду Docker Community Edition:

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update

Для просмотра списка доступных к установке версий Docker Community Edition используйте команду:

sudo apt-cache madison docker-ce

Пример результата выполнения команды:

###On each of your machines, install Docker. Version 18.09.9 is recommended, but 1.11, 1.12, 1.13, 17.03 and 19.03.5 are known to work as well.
### Latest validated Docker version: 18.09.x
## Install docker ce.

sudo apt-get update && sudo apt-get install docker-ce=5:18.09.9~3-0~ubuntu-xenial

  1. Добавьте пользователя fmpadmin в группу docker:

sudo usermod -aG docker fmpadmin

  1. Выполните настройку файла /etc/hosts одинаково на всех узлах:

127.0.0.1      localhost
<host-ip-address>    kn0.our.cluster kn0
<host-ip-address>    kn1.our.cluster kn1
<host-ip-address>    kn2.our.cluster kn2
<host-ip-address>    kn3.our.cluster kn3
<host-ip-address>    kn4.our.cluster kn4
<host-ip-address>    kn5.our.cluster kn5

# The following lines are desirable for IPv6 capable hosts

#::1     localhost ip6-localhost ip6-loopback
#ff02::1 ip6-allnodes
#ff02::2 ip6-allrouters

  1. Сгенерируйте SSH-ключ для пользователя fmpadmin на узле kn0:

    1. От имени пользователя fmpadmin выполните команду:

ssh-keygen

В консоль будет выведен диалог, например:

Enter file in which to save the key (/home/user/.ssh/id_rsa):

Нажмите клавишу ENTER. Далее система предложит ввести кодовую фразу для дополнительной защиты SSH-подключения:

Enter passphrase (empty for no passphrase):

Пропустите этот и следующий шаги. Для этого нажимайте клавишу ENTER. В результате будет создан SSH-ключ.

    1. Создайте конфигурационный файл для SSH:

vim ~/.ssh/config

Содержимое конфигурационного файла:

Host kn0
       Hostname kn0
       User fmpadmin
Host kn1
       Hostname kn1
       User fmpadmin
Host kn2
       Hostname kn2
       User fmpadmin
Host kn3
       Hostname kn3
       User fmpadmin
Host kn4
       Hostname kn4
       User fmpadmin

Сохраните изменения и выйдите из редактора.

    1. Измените разрешения на файл:

chmod 644 ~/.ssh/config

  1. Соберите публичные ключи всех узлов (выполняется на узле kn0 под пользователем fmpadmin):

$ ssh-keyscan kn0 kn1 kn2 kn3 kn4 >> ~/.ssh/known_hosts

  1. Добавьте созданный SSH-ключ на все узлы:

ssh-copy-id kn1
ssh-copy-id kn2
ssh-copy-id kn3
ssh-copy-id kn4

Примечание. При запросе системой пароля введите пароль пользователя fmpadmin.

  1. Настройте NTP-cервер для синхронизации времени между узлами:

sudo apt-get install -y ntp ntpdate
cp /etc/ntp.conf /etc/ntp.conf.orig

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

На узле kn0:

cat << EOF > /etc/ntp.conf \
server 127.127.1.0 prefer \
fudge 127.127.1.0 stratum 10 \
interface ignore wildcard \
interface listen <адрес, который будет использоваться для ntp server lan ip> \
EOF
systemctl restart ntp.service

На остальных узлах:

server <адрес ntp server lan ip на узле kn0 > iburst
restrict default
interface ignore wildcard
interface listen <your ntp client lan ip>
sudo systemctl restart ntp.service

В результате будет выполнена подготовка узлов.

Установка пакета Heartbeat

Целевые узлы для пакета Heartbeat - три рабочих сервера с одним общим виртуальным IP-адресом. Непрерывная доступность сервисов обеспечивается с помощью пакета Heartbeat.

Примечание. Установка и настройка пакета Heartbeat выполняется на узлах kn3, kn4 и kn5.

Для установки и настройки пакета Heartbeat:

  1. Установите и настройте Heartbeat:

apt-get update && apt-get -y install heartbeat && systemctl enable heartbeat

Примечание. Все три сервера делят один IP-адрес - <main external cluster ip>. Этот виртуальный IP-адрес будет перемещаться между серверами, поэтому включите параметр net.ipv4.ip_nonlocal_bind, чтобы разрешить привязку системных служб к нелокальному IP-адресу.

  1. Добавьте эту возможность в файл /etc/sysctl.conf для узлов kn3, kn4, kn5:

# echo ‘net.ipv4.ip_nonlocal_bind=1’ >> /etc/sysctl.conf
# sysctl -p

  1. Создайте файл /etc/ha.d/authkeys. В этом файле Heartbeat хранит данные для взаимной аутентификации, файл должен быть одинаковым на обоих серверах:

# echo -n securepass | md5sum
bb77d0d3b3f239fa5db73bdf27b8d29a

# Где securepass – пароль для Heartbeat.
# Cкопируйте полученную хеш-сумму в буфер обмена.

kn3
$ sudo vi /etc/ha.d/authkeys
auth 1
1 md5 bb77d0d3b3f239fa5db73bdf27b8d29a

kn4
sudo  vi /etc/ha.d/authkeys
auth 1
1 md5 bb77d0d3b3f239fa5db73bdf27b8d29a

kn5
sudo vi /etc/ha.d/authkeys
auth 1
1 md5 bb77d0d3b3f239fa5db73bdf27b8d29a

  1. Проверьте, что файл /etc/ha.d/authkeys доступен только пользователю Root:

Kn3# sudo chmod 600 /etc/ha.d/authkeys
Kn4# sudo chmod 600 /etc/ha.d/authkeys
Kn5# sudo chmod 600 /etc/ha.d/authkeys

  1. Создайте основные файлы конфигурации для Heartbeat на выбранных серверах (для каждого сервера файл будет незначительно отличаться):

    1. Создайте файл /etc/ha.d/ha.cf на узлах kn3, kn4, kn5.

Примечание. Для получения параметров узлов для конфигурации запустите uname -n на всех трех серверах. Также используйте имя вашей сетевой карты вместо ens160.

Kn3# vi /etc/ha.d/ha.cf
#       keepalive: how many seconds between heartbeats
#
keepalive 2
#
#       deadtime: seconds-to-declare-host-dead
#
deadtime 10
#
#       What UDP port to use for udp or ppp-udp communication?
#
udpport        694
bcast  ens160
mcast ens160 225.0.0.1 694 1 0
ucast ens160 <main kn3 ip>
#       What interfaces to heartbeat over?
udp     ens160
#
#       Facility to use for syslog()/logger (alternative to log/debugfile)
#
logfacility     local0
#
#       Tell what machines are in the cluster
#       node    nodename ...    -- must match uname -n
node    kn3
node    kn4
node    kn5

kn4# vi /etc/ha.d/ha.cf
#       keepalive: how many seconds between heartbeats
#
keepalive 2
#
#       deadtime: seconds-to-declare-host-dead
#
deadtime 10
#
#       What UDP port to use for udp or ppp-udp communication?
#
udpport        694
bcast  ens160
mcast ens160 225.0.0.1 694 1 0
ucast ens160 <main kn4 ip>
#       What interfaces to heartbeat over?
udp     ens160
#
#       Facility to use for syslog()/logger (alternative to vlog/debugfile)
#
logfacility     local0
#
#       Tell what machines are in the cluster
#       node    nodename ...    -- must match uname -n
node    kn3
node    kn4
node    kn5

kn5# vi /etc/ha.d/ha.cf
#       keepalive: how many seconds between heartbeats
#
keepalive 2
#
#       deadtime: seconds-to-declare-host-dead
#
deadtime 10
#
#       What UDP port to use for udp or ppp-udp communication?
#
udpport        694
bcast  ens160
mcast ens160 225.0.0.1 694 1 0
ucast ens160 <main kn5 ip>
#       What interfaces to heartbeat over?
udp     ens160
#
#       Facility to use for syslog()/logger (alternative to vlog/debugfile)
#
logfacility     local0
#
#       Tell what machines are in the cluster
#       node    nodename ...    -- must match uname -n
node    kn3
node    kn4
node    kn5

    1. Создайте файл /etc/ha.d/haresources. В нём указывается общий виртуальный IP-адрес и задаётся, какой узел является главным по умолчанию. Файл должен быть одинаковым на всех узлах:

Kn3# vi /etc/ha.d/haresources
Kn3 <main virtual cluster ip>
Kn4# vi /etc/ha.d/haresources
Kn3 <main virtual cluster ip>
Kn5# vi /etc/ha.d/haresources
Kn3 <main cluster ip>   ### здесь и выше kn3 = hostname узла, выбранного “главным” по умолчанию для heartbeat.   

  1. Запустите службы Heartbeat на всех узлах и проверьте, что на узле kn3 установлен заявленный виртуальный IP-адрес:

Kn3# systemctl restart heartbeat
Kn4# systemctl restart heartbeat
Kn5# systemctl restart heartbeat
kn1# ip a s
ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
   link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
   inet <main kn3 ip>/24
      valid_lft forever preferred_lft forever
   inet <main cluster ip>/24

  1. Проверьте доступ по main cluster ip:

nc -v <main cluster ip> 22
Connection to x.x.x.x 22 port [tcp/*] succeeded!
SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.7

Установка и настройка пакета Heartbeat завершена.

Подготовка кластера системы Ceph

Установка Ceph

Для установки и настройки Ceph:

  1. Установите python:

apt-get update && apt-get install -y python python-pip parted

Примечание. Все команды необходимо выполнять на одном узле.

  1. Выполните команды:

sudo fdisk -l /dev/sdb
sudo parted -s /dev/sdb mklabel gpt mkpart primary xfs 0% 100%
sudo mkfs.xfs -f /dev/sdb
sudo fdisk -s /dev/sdb
sudo blkid -o value -s TYPE /dev/sdb

  1. Разверните Ceph сначала на узле kn0:

sudo -H pip install ceph-deploy
ceph-deploy new kn0

В текущей директории появится файл ceph.conf.

Отредактируйте ceph.conf в соответствии с файлом, входящим в поставку ./fmp_k8s_v1/ceph/ceph.conf:

[global]
fsid = a997355a-25bc-4749-8f3a-fb07df0f9105 - замените на значение из вашего файла ceph.conf
mon_initial_members = kn1,kn0,kn3 - замените на имена ваших узлов
mon_host = 10.30.217.17,10.30.217.20,10.30.217.23 - замените на адреса ваших узлов
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
# Our network address
public network = 10.30.217.0/24 - замените на адрес вашей сети
rbd default features = 3

[mon.kn0]
    host = kn0 - замените на имя вашего узла
    mon addr = 10.30.217.20:6789 - замените на адрес вашего узла

[mon.kn1]
    host = kn1 - замените на имя вашего узла
    mon addr = 10.30.217.17:6789 - замените на адрес вашего узла

[mon.kn3]
    host = kn3 - замените на имя вашего узла
    mon addr = 10.30.217.23:6789 - замените на адрес вашего узла

# added below config
[osd]
osd_journal_size = 512
osd_pool_default_size = 3
osd_pool_default_min_size = 1
osd_pool_default_pg_num = 64
osd_pool_default_pgp_num = 64

# timeouts for OSD
osd_client_watch_timeout = 15
osd_heartbeat_grace = 20
osd_heartbeat_interval = 5
osd_mon_heartbeat_interval = 15
osd_mon_report_interval = 4

[mon]
mon_osd_min_down_reporters = 1
mon_osd_adjust_heartbeat_grace = false
mon_client_ping_timeout = 15.000000

Примечание. Все имена и адреса узлов замените вашими.

  1. Установите пакеты Ceph сразу на всех узлах:

ceph-deploy install kn0 kn1 kn2 kn3 kn4 kn5

Данная операция займёт продолжительное время.

  1. Настройте мониторинг узла kn1:

# вместо create-initial можно указать узел
ceph-deploy mon create-initial

Данная команда создаст ключ роли мониторинга. Для получения ключа выполните команду:

ceph-deploy gatherkeys kn1

Добавление OSD-узлов

После установки Ceph на все узлы добавьте OSD-роли в кластер Ceph. Для хранения данных и журнала они будут использовать раздел /dev/sdb на диске.

  1. Проверьте на всех узлах, доступен ли раздел диска /dev/sdb:

ceph-deploy disk list kn3 kn4 kn5

  1. Удалите таблицы разделов на всех узлах:

ceph-deploy disk zap kn3 /dev/sdb
ceph-deploy disk zap kn4 /dev/sdb
ceph-deploy disk zap kn5 /dev/sdb

Данная команда удалит все данные из раздела /dev/sdb на узлах OSD Ceph.

  1. Подготовьте и активируйте все OSD-узлы, убедитесь в отсутствии ошибок:

ceph-deploy osd create kn3 --data /dev/sdb
The last output line should be: Host kn3 is now ready for osd use.
ceph-deploy osd create kn4 --data /dev/sdb
The last output line should be: Host kn4 is now ready for osd use.
ceph-deploy osd create kn5 --data /dev/sdb
The last output line should be: Host kn5 is now ready for osd use.

  1. Отправьте admin keys и конфигурацию на все узлы:

ceph-deploy admin kn0 kn1 kn2 kn3 kn4 kn5

  1. Измените права на key file. Выполните на всех узлах команду:

sudo chmod 644 /etc/ceph/ceph.client.admin.keyring

В результате будет создан кластер Ceph.

Важно. Необходимо явно добавить Ceph Manager Service.

Для добавления Ceph Manager Service:

  1. На узле kn0 (ceph-admin) выполните команду:

ceph auth get-or-create mgr.kn1 mon 'allow profile mgr' osd 'allow *' mds 'allow *'

Команда вернёт значение mgr keyring. Скопируйте его и переходите к следующему шагу.

  1. Выполните команду:

ssh (monitoring role node, e.g. kn1)
    sudo –i
    mkdir /var/lib/ceph/mgr/ceph-kn1

Затем отредактируйте файл vi /var/lib/ceph/mgr/ceph-kn1/keyring. Вставьте в него значение mgr keyring из предыдущего шага.

  1. Выполните команду:

chmod 600 /var/lib/ceph/mgr/ceph-kn1/keyring
chown ceph-ceph –R /var/lib/ceph/mgr/

  1. Запустите ceph-mgr менеджер:

sudo systemctl start ceph-mgr.target

  1. Проверьте статус кластера Ceph:

sudo ceph –s

cluster:
id:     a997355a-25bc-4749-8f3a-fb07df0f9105
health: HEALTH_OK

services:
mon: 3 daemons, quorum kn1,kn3, kn0
mgr: kn1(active)
mds: cephfs-1/1/1 up  {0=kn1=up:active}, 2 up:standby
osd: 3 osds: 3 up, 3 in

data:
pools:   0 pools, 0 pgs
objects: 0  objects, 0 B
usage:   3.0 GiB used, 147 GiB / 150 GiB avail
pgs:

Если кластер вернул ответ HEALTH_OK, то кластер работает.

Создание сервера метаданных

Для использования CephFS требуется, как минимум, один сервер метаданных. Для его создания выполните команду:

ceph-deploy mds create {ceph-node}

Развертывание Ceph-менеджеров

Ceph-менеджер работает в активном режиме или в режиме ожидания. Развертывание дополнительных Ceph-менеджеров гарантирует, что в случае выхода из строя одного из Ceph-менеджеров другой Ceph-менеджер сможет продолжить выполнение операций без перерывов в обслуживании.

Для развертывания дополнительных Ceph-менеджеров:

  1. Выполните команду:

ceph-deploy mgr create node2 node3

Выполните следующие команды для проверки работы Ceph:

sudo ceph -s

sudo ceph df

sudo ceph osd tree

  1. Создайте отдельный пул kube для кластера Kubernetes (k8s):

sudo ceph osd pool create kube 32 32
>> pool 'kube' created // The two ’30’s are important – you should review the ceph documentation for Pool, PG and CRUSH configuration to establish values for PG and PGP appropriate to your environment

  1. Проверьте количество реплик для пула:

$ sudo ceph osd pool get kube size
size: 3

  1. Проверьте количество placement groups для пула:

$ sudo ceph osd pool get kube pg_num
pg_num: 32

  1. Свяжите созданный пул с rbd-приложенем для его использования в качестве устройства RADOS:

$ sudo ceph osd pool application enable kube rbd
>>enabled application 'rbd' on pool 'kube'

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

$ sudo ceph auth get-or-create client.kube mon 'allow r' osd 'allow rwx pool=kube'

[client.kube]
       key = AQC6DX1cAJD3LRAAUC2YpA9VSBzTsAAeH30ZrQ==

 

mkdir ./to_etc
sudo ceph auth get-key client.admin > ./to_etc/client.admin
sudo cp ./to_etc/client.admin /etc/ceph/ceph.client.admin.keyring
sudo chmod 600 /etc/ceph/ceph.client.admin.keyring

  1. Приведите содержимое файла к виду:

[client.admin]
       key = AQCvWnVciE7pERAAJoIDoxgtkfYKMnoBB9Q6uA==
       caps mds = "allow *"
       caps mgr = "allow *"
       caps mon = "allow *"
       caps osd = "allow *"

 

sudo ceph auth get-key client.kube > ./to_etc/ceph.client
sudo cp ./to_etc/ceph.client  /etc/ceph/ceph.client.kube.keyring
sudo chmod 644 /etc/ceph/ceph.client.kube.keyring

  1. Приведите содержимое файла к виду:

[client.kube]
       key = AQCvWnVciE7pERAAJoIDoxgtkfYKMnoBB9Q6uA==
       caps mds = "allow *"
       caps mgr = "allow *"
       caps mon = "allow *"
       caps osd = "allow *"

Установка и настройка распределенной файловой системы Ceph завершена.

Подготовка кластера Kubernetes (k8s)

Все команды на главных узлах Kubernetes выполняйте от имени пользователя root. Ввиду возможных проблем с неправильной маршрутизацией трафика в обход iptables при использовании ОС RHEL / CentOS 7, убедитесь, что для net.bridge.bridge-nf-call-iptables в конфигурации sysctl установлено значение 1.

На каждом узле выполните:

  1. От имени пользователя root внесите изменения в system для правильной работы сетей в k8s:

cat >>/etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl –system

apt-get update && apt-get install -y apt-transport-https curl

  1. Добавьте в систему официальный Kubernetes GPG ключ:

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

  1. Добавьте Kubernetes репозиторий:

cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/kubernetes-xenial main
EOF

  1. Установите значение /proc/sys/net/bridge/bridge-nf-call-iptables равным 1 для корректной работы CNI (Container Network Interface). Для этого проверьте текущее значение:

cat /proc/sys/net/bridge/bridge-nf-call-iptables

Если текущее значение равно 0, то выполните команду:

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

На узле kn0 от имени пользователя root инициализируйте кластер Kubernetes:

  1. Перейдите в домашнюю директорию пользователя fmpadmin: /home/fmpadmin. Распакуйте архив, содержащий скрипты и yaml-файлы на одном управляющем узле:

% tar –xvzf ./fmp_k8s_v<номер версии>.tar

  1. Перейдите в директорию с распакованными скриптами:

% cd ./ fmp_k8s_v<номер версии>/

  1. Перейдите в поддиректорию rke:

% cd ./rke

  1. Выполните команду:

% ls –lh ./

Будет отображён список файлов в текущей директории:

-rwxr-xr-x 1 root     root       388 Mar 26 20:44 fmpclust.yml
-rw-rw-r-- 1 root     root      1.3K Mar 26 20:48 ReadMe.txt
-rwxr-xr-x 1 root     root      36M Mar 28 14:54 rke

  1. Переместите или скопируйте файл rke в директорию /usr/local/bin/:

% mv ./rke /usr/local/bin/

  1. Установите права на файл rke:

% chmod 755 /usr/local/bin/rke

  1. Отредактируйте содержимое файла fmpclust.yml в соответствии с вашей конфигурацией:

vi ./fmpclust.yuml
nodes:
 - address: m1
   user: ваш пользователь
   role: [controlplane,etcd]
 - address: m2
   user: ваш пользователь
   role: [controlplane,etcd]
 - address: m3
   user: ваш пользователь
   role: [controlplane,etcd]
 - address: w1
   user: ваш пользователь
   role: [worker]
 - address: w2
   user: ваш пользователь
   role: [worker]
 - address: w3
   user: ваш пользователь
   role: [worker]
services:
 kubelet:
   extra_binds:
     - "/lib/modules:/lib/modules"
   extra_args:
     node-status-update-frequency: 10s
 etcd:
   snapshot: true
   creation: 6h
   retention: 24h
 kube-api:
   extra_args:
     default-not-ready-toleration-seconds: 30
     default-unreachable-toleration-seconds: 30
 kube-controller:
   extra_args:
     node-monitor-period: 5s
     node-monitor-grace-period: 40s
     pod-eviction-timeout: 30s
authentication:
   strategy: x509
#    sans:
#      - "10.99.255.254"
network:
 plugin: flannel

Примечание. 10.99.255.254 — общий IP-адрес кластера серверов (если применимо); m1, m2, m3 - имена главных узлов Kubernetes; w1,w2, w3 - имена рабочих узлов Kubernetes; ваш пользователь - пользователь, от имени которого будет осуществляться взаимодействие между узлами (fmpadmin).

  1. Разверните и проинициализируйте кластер:

% rke up --config fmpclust.yml

Операция занимает значительное количество времени и сопровождается подробным выводом в консоль всех этапов развёртывания кластера.

Если всё сделано правильно, то развёртывание кластера пройдет успешно, и в консоль сервера будет выведена строка:

INFO[0103] Finished building Kubernetes cluster successfully

Если возникли ошибки, запустите rke up повторно с ключом debug для вывода подробной информации:

% rke -d up --config fmpclust.yml

  1. После инициализации кластера в текущей директории рядом с файлом fmpclust.yml появится файл kube_config_fmpclust.yml. Переместите или скопируйте его в профиль пользователя. Это позволит пользователю взаимодействовать с кластером. Выполняйте данную операцию от имени пользователя fmpadmin:

% mkdir ~/.kube
% cd ./ fmp_k8s_v<номер версии>/rke/
% cp ./kube_config_fmpclust.yml  ~/.kube/config
% sudo chown -R fmpadmin:fmpadmin /home/fmpadmin/.kube

В результате будет установлен и инициализирован кластер Kubernetes (k8s). Проверьте его работу:

  1. Проверьте версию сервера и клиента k8s:

% kubectl version - -short

В консоль будет выведено:

Client Version: v1.13.5
Server Version: v1.13.5

  1. Проверьте статус компонентов k8s:

% kubectl get cs

В консоль будет выведено:

NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health": "true"}
etcd-1               Healthy   {"health": "true"}
etcd-2               Healthy   {"health": "true"}

Установка Rancher

Rancher - это программное обеспечение для удобного управления кластером k8s.

Для установки и настройки Rancher:

  1. Создайте на узле kn4 папку для хранения информации Rancher:

% sudo mkdir –p /opt/rancher

  1. Запустите Rancher c монтированием на хост:

% sudo docker run -d --restart=unless-stopped -p 8180:80 -p 8446:443 -v /opt/rancher:/var/lib/rancher rancher/rancher:stable

  1. Откройте браузер и перейдите по адресу https://ip-address-of-kn0:8446, где ip-address-of-kn0 - это IP-адрес узла kn0. Установите пароль для роли администратора Rancher в веб-интерфейсе:

  1. Добавьте созданный кластер в Rancher. Нажмите кнопку «Add Cluster»:

  1. Выберите тип добавления. Нажмите «Import»:

  1. Укажите название и описание для добавляемого кластера и нажмите «Create»:

  1. Скопируйте последнюю команду на странице:

Общий вид команды:

% curl --insecure -sfL https://<server ip>:8446/v3/import/dtdsrjczmb2bg79r82x9qd8g9gjc8d5fl86drc8m9zhpst2d9h6pfn.yaml | kubectl apply -f -

Где <server ip> - это IP-адрес узла.

  1. Выполните скопированную команду в консоли узла kn0. В консоль будет выведено:

namespace/cattle-system created
serviceaccount/cattle created
clusterrolebinding.rbac.authorization.k8s.io/cattle-admin-binding created
secret/cattle-credentials-3035218 created
clusterrole.rbac.authorization.k8s.io/cattle-admin created
deployment.extensions/cattle-cluster-agent created
daemonset.extensions/cattle-node-agent created

  1. Ожидайте запуск системы:

После окончания инициализации статус кластера изменится на Active:

Общее состояние кластеров:

  1. Перейдите в раздел Projects/Namespaces и создайте Project для платформы:

  1. Нажмите «Add Project». Заполните поле «Project Name», добавьте описание в поле «Description» и нажмите «Create»:

  1. Нажмите «Add Namespace». Заполните поле «Name» и нажмите «Create»:

Настройка через графический веб-интерфейс завершена. Перейдите к консоли узлов.

Подготовка к запуску продукта «Форсайт. Мобильная платформа»

  1. Откройте консоль одного из главных узлов Kubernetes от имени пользователя fmpadmin. В домашнюю директорию пользователя был загружен архив с образами контейнеров приложения, а также архив с набором скриптов и yaml-файлов для запуска приложения в среде Kubernetes.

  2. Скопируйте архив fmp_v<номер версии>.tgz на рабочие узлы кластера.

  3. Загрузите образы контейнеров в систему:

docker load -i  fmp_v<номер версии>.tgz

Примечание. Данный архив распакуйте на всех рабочих узлах кластера.

После успешного импорта удалите архив.

  1. На одном управляющем узле распакуйте архив, содержащий скрипты и yaml-файлы:

% tar –xvzf ./fmp_k8s_v<номер версии>.tar

  1. Перейдите в директорию с распакованными скриптами:

% cd ./ fmp_k8s_v<номер версии>

  1. Отредактируйте содержимое yaml-файла ./storage/ceph-storage-ceph_rbd.yml:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-rbd
provisioner: kubernetes.io/rbd
parameters:
monitors: 10.30.217.17:6789, 10.30.217.20:6789, 10.30.217.23:6789
adminId: admin
adminSecretName: ceph-secret
adminSecretNamespace: "kube-system"
pool: kube
userId: kube
userSecretName: ceph-secret-kube

В строке monitors укажите IP-адреса или DNS-имена узлов Ceph-кластера с установленной ролью мониторинга. Для просмотра на каких именно узлах установлена эта роль используйте команду:

% sudo ceph -s

Результат выполнения команды, например:

cluster:
id:     a997355a-25bc-4749-8f3a-fb07df0f9105
health: HEALTH_OK
services:
mon: 3 daemons, quorum kn1,kn0,kn3
mgr: kn3(active), standbys: kn0
osd: 4 osds: 4 up, 4 in

Строка mon в разделе services указывает на имена узлов с установленной ролью мониторинга.

  1. Добавьте secret-keys распределённого файлового хранилища Ceph в Kubernetes:

    1. Получите ключ администратора Ceph:

% sudo ceph --cluster ceph auth get-key client.admin
>>   AQCvBnVciE8pERAAJoIDoxgtkfYKZnoBS9R6uA==

Скопируйте его в буфер обмена.

Важно. При копировании и последующей вставке ключа в команду для добавления в настройки Kubernetes пробелы не допускаются!

    1. Добавьте полученный ключ в секреты Kubernetes, явно указав его в команде:

% kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" \
  --from-literal=key='AQCvWnVciE7pERAAJoIDoxgtkfYKMnoBB9Q6uA==' --namespace=kube-system

Результат выполнения команды:

secret/ceph-secret created

    1. Создайте отдельный пул для узлов Kubernetes в кластере Ceph. Созданный пул будет использоваться в RBD на узлах:

% sudo ceph --cluster ceph osd pool create kube 32 32

    1. Создайте клиентский ключ. В кластере Ceph включена аутентификация Ceph:

% sudo ceph --cluster ceph auth get-or-create client.kube mon 'allow r' osd 'allow rwx pool=kube'

    1. Получите ключ client.kube:

% sudo ceph --cluster ceph auth get-key client.kube

    1. Создайте новый секрет в пространстве имён проекта:

% kubectl create secret generic ceph-secret-kube --type="kubernetes.io/rbd" \
--from-literal=key='AQC6DX1cAJD3LRAAUC2YpA9VSBzTsAAeH30ZrQ==' --namespace=fmpns

После добавления обоих секретов можно переходить к запуску продукта «Форсайт. Мобильная платформа».

Запуск продукта «Форсайт. Мобильная платформа»

Выполните скрипты в следующем порядке в директории fmp_k8s_v<номер версии>:

  1. create-rbds.sh. Скрипт создает и подготавливает тома для приложения fmp в Ceph (используется в случае наличия Ceph);

  2. fmp_k8s_storage_inst.sh. Скрипт выполняется при использовании распределённого файлового хранилища Ceph. Ранее в статье было показано, как настроить Ceph-кластер;

  3. Перейдите в директорию volumes. Откройте на редактирование скрипт set_my_monitors.sh и замените в нём IP-адреса на адреса ваших узлов с ролью Ceph Monitor в строках:

export mon1='192.1.1.1'
export mon2='192.1.1.2'
export mon3='192.1.1.3'

  1. В директории volumes выполните скрипт set_my_monitors.sh;

  1. Вернитесь в директорию выше;

  1. fmp_k8s_volumes_inst.sh. Скрипт создает и подготавливает тома для использования приложением fmp;

  1. fmp_k8s_configmap_inst.sh. Скрипт создает карту переменных;

  1. fmp_k8s_services_inst.sh. Скрипт настраивает сервисы для взаимодействия компонентов приложения fmp между собой;

  1. fmp_k8s_deployments_inst.sh. Скрипт настраивает условия для запуска компонентов приложения fmp;

  1. Init pod. При первом запуске происходит инициализация внутренних сервисов ФМП, это требует запуска отдельного Init pod. Как только Init pod выполнит все необходимые процедуры, он переходит в состояние Succeeded.

Вернитесь к веб-интерфейсу и убедитесь, что все необходимые объекты созданы, а контейнеры приложения запущены без ошибок:

  1. Проверьте наличие подключённого хранилища. Перейдите в раздел «Storage > Storage Classes»:

  1. Проверьте наличие созданных Persistent Volumes. Перейдите в раздел «Storage > Persistent Volumes»:

Затем выберите приложение fmp и перейдите в раздел «Workbooks» на вкладку «Volumes»:

  1. Проверьте наличие Config Maps  - списка загруженных переменных. Перейдите в раздел «Resources»:

  1. Перейдите в раздел «Workbooks» и убедитесь, что создались элементы на вкладках:

В результате будет подготовлен и развёрнут отказоустойчивый кластер и приложение «Форсайт. Мобильная платформа».

Откройте браузер и перейдите по IP-адресу <main cluster ip>, который был указан при настройке HAProxy. Будет открыта страница авторизации в приложении «Форсайт. Мобильная платформа»:

Перечень портов, используемых для работы кластера

Порты, используемые Kubernetes для функционирования главных узлов кластера, приведены в следующей таблице:

Протокол Направление Диапазон портов Назначение Использование

TCP

inbound

6443 Kubernetes API server all

TCP

inbound

2379-2380 etcd server client API kube-apiserver, etcd

TCP

inbound

10250 kubelet API self, сontrol plane

TCP

inbound

10251 kube-scheduler self

TCP

inbound

10252 kube-controller-manager self

Порты, используемые Kubernetes для функционирования рабочих узлов кластера, приведены в следующей таблице:

Протокол Направление Диапазон портов Назначение Использование

TCP

inbound

10250

kubelet API

self, сontrol plane

TCP

inbound

30000-32767

nodePort Services

all

RKE (Rancher Kebernetes Engine) узел - Порты для исходящих соединений приведены в следующей таблице:

Протокол Источник Диапазон портов Назначение

Описание

TCP

RKE-узел

22

все узлы, указанные в файле конфигурации кластера

настройка узлов через SSH, выполняемая RKE

TCP

RKE -узел

6443

управляющие узлы

Kubernetes API server

Примечание. В данной статье роли главных узлов и etcd-узлов объединены.

Порты для входящих соединений управляющих узлов приведены в следующей таблице:

Протокол Источник Диапазон портов

Описание

TCP

any that consumes Ingress services 80 ingress controller (HTTP)

TCP

any that consumes Ingress services 443 ingress controller (HTTPS)

TCP

rancher nodes 2376 Docker daemon TLS port used by Docker Machine
(only needed when using Node Driver/Templates)

TCP

etcd nodes;
control plane nodes; worker nodes
6443 Kubernetes API server

UDP

etcd nodes;
controlplane nodes;
worker nodes

8472 canal/flannel VXLAN overlay networking

TCP

control plane node itself (local traffic, not across nodes) 9099 canal/flannel livenessProbe/readinessProbe

TCP

control plane nodes 10250 kubelet

TCP

control plane node itself (local traffic, not across nodes) 10254 ingress controller livenessProbe/readinessProbe

TCP/UDP

any source that consumes NodePort services 30000-32767 NodePort port range

Порты для исходящих соединений управляющих узлов приведены в следующей таблице:

Протокол Назначение Диапазон портов

Описание

TCP

rancher nodes 443 rancher agent

TCP

etcd nodes 2379 etcd client requests

TCP

etcd nodes 2380 etcd peer communication

UDP

etcd nodes;
control plane nodes;
worker nodes
8472 canal/flannel VXLAN overlay networking

TCP

control plane node itself (local traffic, not across nodes) 9099 canal/flannel livenessProbe/readinessProbe

TCP

etcd nodes;
control plane nodes;
worker nodes
10250 kubelet

TCP

control plane node itself (local traffic, not across nodes) 10254 ingress controller livenessProbe/readinessProbe

Порты для входящих соединений рабочих узлов приведены в следующей таблице:

Протокол Источник Диапазон портов

Описание

TCP

any network that you want to be able to remotely access this node from

22 remote access over SSH

TCP

any that consumes Ingress services 80 ingress controller (HTTP)

TCP

any that consumes Ingress services 443 ingress controller (HTTPS)

TCP

rancher nodes 2376 Docker daemon TLS port used by Docker Machine
(only needed when using Node Driver/Templates)

UDP

etcd nodes;
control plane nodes;
worker nodes

8472 canal/flannel VXLAN overlay networking

TCP

worker node itself (local traffic, not across nodes) 9099 canal/flannel livenessProbe/readinessProbe

TCP

control plane nodes 10250 kubelet

TCP

worker node itself (local traffic, not across nodes) 10254 ingress controller livenessProbe/readinessProbe

TCP/UDP

any source that consumes NodePort services 30000-32767 NodePort port range

Порты для исходящих соединений рабочих узлов приведены в следующей таблице:

Протокол Назначение Диапазон портов

Описание

TCP

rancher nodes 443 rancher agent

TCP

control plane nodes

6443

Kubernetes API server

UDP

etcd nodes;
control plane nodes;
worker nodes

8472

canal/flannel VXLAN overlay networking

TCP

worker node itself (local traffic, not across nodes)

9099

canal/flannel livenessProbe/readinessProbe

TCP

worker node itself (local traffic, not across nodes)

10254

ingress controller livenessProbe/readinessProbe

См. также:

Установка и настройка продукта «Форсайт. Мобильная платформа»