Kubernetes -  использование совместно с GlusterFS
О технологиях

Kubernetes - использование совместно с GlusterFS

9032
17 минут

GlusterFS нравится мне тем, что это открытая, производительная и масштабируемая файловая система. В этой статье я покажу, как начать использовать GlusterFS для предоставления контейнерам Kubernetes общего дискового пространства.

Kubernetes-Volumes-on-GlusterFS.png


Подразумевается, что у вас уже выполнена установка Kubernetes кластера, т.к. мы начнем сразу с установки кластера GlusterFS на все вычислительные узлы Kubernetes, построенного на CentOS 7. Если установленного кластера у вас еще нет, вы можете быстро это исправить, воспользовавшись статьей "Kubeadm: создание Kubernetes кластера за 10 минут".


Установка кластера GlusterFS

У GlusterFS отличная документация, более того, в Интернете полно статей, описывающих установку кластера GlusterFS на то или иное количество ваших серверов (например, можно воспользоваться официальной документацией с Wiki CentOS), поэтому я не буду сильно углубляться в описание процедуры установки. Единственное, что стоит отметить, я подключу по отдельному виртуальному диску к каждому виртуальному серверу, чтобы собрать на них том GlusterFS (gv0). Конечная архитектура решения изображена на рисунке ниже.

Kubernetes-minimal-cluster-GlusterFS.png


Подготовка дисков и установка пакетов

На каждом вычислительном сервере кластера необходимо выполнить следующие команды:


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)

 

 

19 октября 2023
Контейнеры: технологии и процессы глазами разработчика

В выпуске#9 видеоподкаста «Откровенно об ИТ-инфраструктуре» поговорили о роли контейнеров в разработке. Приглашенные эксперты обсудили специфику использования Kubernetes и сокращение time-to-market в контексте контейнеризации.

В гостях Михаил Гудов, Orion soft, и Василий Колосов, Smartex.
1 минута
785
19 июня 2023
Семь трендов на рынке облачных услуг в 2023 году
До 2022 года на рынке облаков в России главенствовали мировые тренды, но сейчас наша страна пошла своим путем. О том, для чего сейчас компании используют облачные технологии и как меняется рынок, рассказал директор по развитию КРОК Облачные сервисы Сергей Зинкевич.
1 минута
2199
16 июня 2023
Рулевой в океане контейнеров
Выпуск#3 видеоподкаста «Откровенно об ИТ-инфраструктуре» посвящен Kubernetes и профессиональным платформам оркестрации контейнеров. Обсудили, как сегодня складывается ситуация на российском рынке контейнерных платформ, что востребовано и почему, особенности и перспективы работы с Kubernetes.

В гостях Александр Баталов, Генеральный директор Флант
1 минута
1515
29 марта 2023
Сетевые балансировщики нагрузки и другие обновления Облака КРОК

Мы рады вам представить новый сервис Облака КРОК для распределения трафика между экземплярами – Балансировщики нагрузки. Кроме того, мы автоматизировали обновление сертификатов Kubernetes и добавили возможность удаления рабочих узлов из кластера Kubernetes.

2 минуты
918
13 февраля 2023
Замена игрока: выбираем альтернативу зарубежному системному ПО (взгляд облачного провайдера)

На поле ИТ сегодня захватывающая интрига – выбор адекватной замены зарубежным системам, производители которых массово вышли из игры. На онлайн-митапе поделились опытом подбора, внедрения и сопровождения решений, способных заместить платформу виртуализации, почту, файловое хранилище, каталог пользователей, backup и др.

Предлагаем вашему вниманию запись и расшифровку митапа.

2 минуты
2186
scrollup