Kubernetes - использование совместно с GlusterFS
GlusterFS нравится мне тем, что это открытая, производительная и масштабируемая файловая система. В этой статье я покажу, как начать использовать GlusterFS для предоставления контейнерам Kubernetes общего дискового пространства.
Подразумевается, что у вас уже выполнена установка Kubernetes кластера, т.к. мы начнем сразу с установки кластера GlusterFS на все вычислительные узлы Kubernetes, построенного на CentOS 7. Если установленного кластера у вас еще нет, вы можете быстро это исправить, воспользовавшись статьей "Kubeadm: создание Kubernetes кластера за 10 минут".
Установка кластера GlusterFS
У GlusterFS отличная документация, более того, в Интернете полно статей, описывающих установку кластера GlusterFS на то или иное количество ваших серверов (например, можно воспользоваться официальной документацией с Wiki CentOS), поэтому я не буду сильно углубляться в описание процедуры установки. Единственное, что стоит отметить, я подключу по отдельному виртуальному диску к каждому виртуальному серверу, чтобы собрать на них том GlusterFS (gv0). Конечная архитектура решения изображена на рисунке ниже.
Подготовка дисков и установка пакетов
На каждом вычислительном сервере кластера необходимо выполнить следующие команды:
yum -y install centos-release-gluster # подключение репозитория с GlusterFS
cfdisk # для создания партиции на диске /dev/vdb, которая будет отдана под общий сторадж
mkfs.xfs -i size=512 /dev/vdb1 # создание файловой системы на диске для общего стораджа
mkdir -p /bricks/brick1 # создание точки монтирования для брика текущего сервера
mkdir /bricks/brick1/gv0 # создание точки монтирования для диска общего стораджа
Далее необходимо отредактировать файл /etc/fstab, добавив туда строчку:
/dev/vdb1 /bricks/brick1 xfs defaults 1 2
echo '/dev/vdb1 /bricks/brick1 xfs defaults 1 2' >> /etc/fstab
Перечитаем /etc/fstab и выполним монтирование брика:
mount -a
Установим пакеты с GlusterFS и запустим его демон:
yum -y install glusterfs-server
systemctl enable glusterd
systemctl start glusterd
Создание доверенного пула
На node-1.comp.avmaksimov.ru необходимо установить связь с node-2.comp.avmaksimov.ru, а следом и с node-3.comp.avmaksimov.ru. Доверенный пул создается после создания связи между двумя серверами. Подключение дополнительных серверов осуществляется путем выполнения команд с узлов, уже принадлежащих кластеру GlusterFS.
Итак, на node-1.comp.avmaksimov.ru выполните команды:
gluster peer probe 192.168.0.6 # приватный IP-адрес node-2.comp.avmaksimov.ru
gluster peer probe 192.168.0.7 # приватный IP-адрес node-3.comp.avmaksimov.ru
Создание общего распределенного тома
На любом из серверов кластера GlusterFS выполните команды:
gluster volume create gv0 disperse 3 192.168.0.{5..7}:/bricks/brick1/gv0
gluster volume start gv0
Посмотреть статус вашего GlusterFS тома можно командой:
gluster volume info gv0
Вывод должен быть аналогичным:
Volume Name: gv0
Type: Disperse
Volume ID: 46b24f48-9c79-4c9a-a12b-1ee9e36247bc
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x (2 + 1) = 3
Transport-type: tcp
Bricks:
Brick1: 192.168.0.5:/bricks/brick1/gv0
Brick2: 192.168.0.6:/bricks/brick1/gv0
Brick3: 192.168.0.7:/bricks/brick1/gv0
Options Reconfigured:
transport.address-family: inet
performance.readdir-ahead: on
nfs.disable: on
Подключение GlusterFS к Kubernetes кластеру
Весь процесс подключения GlusterFS тома к кластеру Kubernetes сводится к созданию точек подключения (endpoints) и сервиса их объединяющего.
Для начала необходимо создать конфигурационный файл для точек подключения (endpoints). На мастер-сервере или узле, с которого вы управляете кластером Kubernetes, для удобства создайте директорию glusterfs. В нее необходимо поместить файл glusterfs-endpoints.json, который содержит настройки точек подключения GlusterFS для кластера Kubernetes, следующего содержания:
{
"kind": "Endpoints",
"apiVersion": "v1",
"metadata": {
"name": "glusterfs-cluster"
},
"subsets": [
{
"addresses": [
{
"ip": "192.168.0.5"
}
],
"ports": [
{
"port": 1
}
]
},
{
"addresses": [
{
"ip": "192.168.0.6"
}
],
"ports": [
{
"port": 1
}
]
},
{
"addresses": [
{
"ip": "192.168.0.7"
}
],
"ports": [
{
"port": 1
}
]
}
]
}
Примените эти настройки командой:
kubectl --kubeconfig ./admin.conf apply -f glusterfs-endpoints.json
Как вы заметили, поле “ip” содержит приватный IP-адрес каждой вычислительной ноды Kubernetes кластера, где был установлен GlusterFS.
Проверить корректное создание точек подключения можно командой:
kubectl --kubeconfig ./admin.conf get endpoints
Создание сервиса
Для того, чтобы кластер Kubernetes мог автоматически управлять подключениями к точкам подключения GlusterFS, создадим сервис их объединяющий. Создайте файл glusterfs-service.json следующего содержания:
{
"kind": "Service",
"apiVersion": "v1",
"metadata": {
"name": "glusterfs-cluster"
},
"spec": {
"ports": [
{"port": 1}
]
}
}
Этот сервис не содержит селекторов для точек подключения для того, чтобы иметь возможность самостоятельно указывать группу точек подключения в процессе создания Pod-ов.
Создайте сервис командой:
kubectl --kubeconfig ./admin.conf apply -f glusterfs-service.json
Поздравляю, вы успешно подключили GlusterFS к кластеру Kubernetes!
Создание контейнера с диском на GlusterFS
Давайте проверим нашу конфигурацию, создав тестовый Pod. Для этого создайте файл glusterfs-pod.json следующего содержания:
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "glusterfs-test"
},
"spec": {
"containers": [
{
"name": "glusterfs",
"image": "kubernetes/pause",
"volumeMounts": [
{
"mountPath": "/mnt/glusterfs",
"name": "glusterfsvol"
}
]
}
],
"volumes": [
{
"name": "glusterfsvol",
"glusterfs": {
"endpoints": "glusterfs-cluster",
"path": "gv0",
"readOnly": true
}
}
]
}
}
По данному описанию будет создан Pod из шаблона kubernetes/pause. Внутрь этого шаблона будет смонтирован диск с именем glusterfsvol, и он будет доступен внутри него по пути /mnt/glusterfs.
В секции volumes содержится описание диска glusterfsvol
- endpoints – указывает на определенные нами точки подключения
- path– указывает на имя диска в кластере GlusterFS
- readOnly – позволяет подключить диск к Pod в режиме для чтения, если используется true
Запустите тестовый Pod командой:
kubectl --kubeconfig ./admin.conf apply -f glusterfs-pod.json
Проверьте, что ваш Pod запустился:
kubectl --kubeconfig ./admin.conf get pods
Уточним, на каком именно сервере запущен наш Pod:
kubectl --kubeconfig ./admin.conf get pods glusterfs | grep Node
Вывод:
Node: node-1.comp.avmaksimov.ru/185.12.28.80
Зайдите на вычислительный узел, на котором запустился наш Pod и выполните команду mount, чтобы увидеть, что внутрь контейнера смонтирована директория из GlusterFS:
192.168.0.5:gv0 on /var/lib/kubelet/pods/2ac5c2ca-f534-11e6-af19-d00db0916b80/volumes/kubernetes.io~glusterfs/glusterfsvol type fuse.glusterfs (ro,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)