GlusterFS Docker

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску

GlusterFS и Docker

Тут краткое описание о "докеризации" GlusterFS

Постановка Задачи

Есть 3 хардварных ноды, на каждой из которых будет запущено приложение. Для организации общего хранилища требуется настроить GlusterFS. Требования от заказчика - все процессы запускать в докер-контейнерах

  • Базовая система - CentOS 7
  • Docker 1.10
  • ??

Имеется три ноды (именование сквозное потому номера идут не с 1)

  • node-3
  • node-4
  • node-6

На кадой из них установлен CentOS 7

# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

Хранилище будет подмонтированно на всех 3-х нодах.

Устновка Docker

Установка докера хорошо описана в документации: https://docs.docker.com/engine/installation/linux/centos/

# rpm -qa | grep docker
docker-engine-selinux-1.10.2-1.el7.centos.noarch
docker-engine-1.10.2-1.el7.centos.x86_64

Включить в автозагрузку

# systemctl enable docker

Запустить:

# service docker start

GlusterFS в докере

Существует пре-собранный образ (а точнее 2 образа) которые содержат все что нужно для GlusterFS.
Однако к минусам этих образов я отнесу то, что на хост-системе Centos 6.5 (в том числе и со свежим ядром из elrepo) эти образа не работают. Проблема в том что для systemd который работает внутри нужны "капабилитез" (https://www.opennet.ru/man.shtml?topic=capabilities) котоые внутрь контейнера не пробрасываются. Беглый просмотр образов наводит на мысль что исправить это можно, нагородив костылей вместо использования родного для Centos 7 systemd однако практического смысла в этом нет, а на хост-стстеме с Centos 7 проблема не воспроизводится.

Установка

Установка предельно проста (потому мы и используме докер!)

  • Скачать образ
# docker pull gluster/gluster-centos
  • Запустить контейнер
#!/bin/bash

docker run \
--privileged \
-d \
-p 10022:22 \
-p 111:111 \
-p 24007:24007 \
-p 24008:24008 \
-p 24009:24009 \
-p 24010:24010 \
-p 24011:24011 \
-p 24012:24012 \
-p 24013:24013 \
-p 24014:24014 \
-p 24015:24015 \
-p 24016:24016 \
-p 24017:24017 \
-p 24018:24018 \
-p 24019:24019 \
-p 24020:24020 \
-p 24021:24021 \
-p 24022:24022 \
-p 24023:24023 \
-p 24024:24024 \
-p 24025:24025 \
-p 24026:24026 \
-p 24027:24027 \
-p 24028:24028 \
-p 24029:24029 \
-p 24030:24030 \
-p 24031:24031 \
-p 24032:24032 \
-p 24033:24033 \
-p 24034:24034 \
-p 24035:24035 \
-p 24036:24036 \
-p 24037:24037 \
-p 24038:24038 \
-p 24039:24039 \
-p 24040:24040 \
-p 24041:24041 \
-p 24042:24042 \
-p 24043:24043 \
-p 24044:24044 \
-p 24045:24045 \
-p 24046:24046 \
-p 24047:24047 \
-p 24048:24048 \
-p 24049:24049 \
-p 24050:24050 \
-p 49152:49152 \
-p 49153:49153 \
-p 49154:49154 \
-p 49155:49155 \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
-v /gluster_file:/var/lib/glusterd \
-v /gluster_storage:/gluster_storage \
-v /etc/hosts:/etc/hosts \

На параметрах запуска остановлюсь подробнее:

  • --privileged : For systemd to run without crashing it is necessary to run the container in the privileged mode since systemd requires CAP_SYS_ADMIN capability.
  • -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ - проброс sysfs
  • -v /gluster_file:/var/lib/glusterd - вся конфигурация GlusterFS будет храниться на хост системе (gluster_file), для того что бы контейнер можно было смело пересоздавать или обновлять. По-хорошему никакие данные не следует хранить внутри контейнера.
  • -v /gluster_storage:/gluster_storage: Мортируем внутрь контейнера папку которая будет использоваться для данных
  • -v /etc/hosts:/etc/hosts - для простоты работы вся информация вноситься в хосты что бы упростить конфигурацию

На этом моменте нужно остановиться подробнее - тут существует тонкость.
Напомню, в нашей схеме учавствуют три хоста (host-4, host-5 и host-6). На каждом из них создаем нужные записи, причем информация о самом хосте указывает на localhost. Например, для host-6:


192.168.56.101 node-4
127.0.0.1    node-6
192.168.56.102 node-5

Если это не сделать, то возникает проблема с хождением через nat да и в целом конфигурация выглядит логично.

Насройка GlusterFS

Базовую настройку производим изнутри контейнеров
Для подключения к контейнеру

  • Уточнить ID контейнера
 docker ps
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS                                                                                                                                                                                                                             NAMES
b9ebafb93e82        gluster/gluster-centos   "/usr/sbin/init"    21 hours ago        Up 5 hours          245/tcp, 443/tcp, 2049/tcp, 6010-6012/tcp, 0.0.0.0:111->111/tcp, 8080/tcp, 38465-38466/tcp, 0.0.0.0:24007-24050->24007-24050/tcp, 38468-38469/tcp, 0.0.0.0:49152-49155->49152-49155/tcp, 49156-49162/tcp, 0.0.0.0:10022->22/tcp   desperate_raman
  • Подключиться к контейнеру
docker exec -it b9ebafb93e82 /bin/bash

Далее внутри контейнера доступна утилита gluster
Создаем кластер:

gluster peer probe  node-5
gluster peer probe  node-4

Проверить результат:

# gluster peer status
Number of Peers: 2

Hostname: node-4
Uuid: c82db9d5-230f-4d79-a466-c62e0b82d74d
State: Peer in Cluster (Connected)

Hostname: node-5
Uuid: 4038195f-d9e8-4fcd-b7ba-d9a66e6d3518
State: Peer in Cluster (Connected)

2 ноды (плюс третья - та на которой выполняется команда) - как и ожидалось.

Следующий шаг - создание volume

gluster volume create replicated_data  replica 3 transport tcp node-4:/gluster_storage node-5:/gluster_storage node-6:/gluster_storage force

В этой команде параметры означают следующее:

  • replicated_data - имя volume - может быть любым
  • replica - тип volume, в нашем случае - это аналог "зеркала" RAID1 (другие типы нас в данной момент не интересуют - наша цель отказоустойчивость)
  • 3 - "replication factor" - количество копий. У нас - по одной копии на ноду, хотя при наличии нескольких физических дисков можно "размазать" данные и более по-другому, например в соотношении 2-2-1 или еще как-то :)
  • tcp - протокол который использовать для этого volume (кстати надо уточнить - только для репликации или и для монтирования?)
  • node-4:/gluster_storage node-5:/gluster_storage node-6:/gluster_storage - список нод и директорий которые будут хранить данные. В нашем случае - это проброшенная внутрь контейнера директория с хост-системы, таким образом все данные будут храниться на хост-системе.
  • force - принудительное создание (папки, а не выделеные диски - не то о чем мечтает GlusterFS но force заставляет работать с папками)

Старт volume

gluster volume start replicated_data

Проверить статус: (вроде-бы все выглядит нормально)

 gluster volume status
Status of volume: replicated_data
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node-4:/gluster_storage               49152     0          Y       399
Brick node-5:/gluster_storage               49152     0          Y       398
Brick node-6:/gluster_storage               49152     0          Y       398
NFS Server on localhost                     N/A       N/A        N       N/A
Self-heal Daemon on localhost               N/A       N/A        Y       393
NFS Server on node-5                        N/A       N/A        N       N/A
Self-heal Daemon on node-5                  N/A       N/A        Y       393
NFS Server on node-4                        N/A       N/A        N       N/A
Self-heal Daemon on node-4                  N/A       N/A        Y       416

Task Status of Volume replicated_data
------------------------------------------------------------------------------
There are no active volume tasks
gluster volume info

Volume Name: replicated_data
Type: Replicate
Volume ID: 6462ffa2-7378-4d5f-a302-a2734fbcfcaa
Status: Started
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: node-4:/gluster_storage
Brick2: node-5:/gluster_storage
Brick3: node-6:/gluster_storage
Options Reconfigured:
performance.readdir-ahead: on

Подключение volumе к хост-системе

Ссылки