☸️ Настройка динамического постоянного хранения томов Kubernetes / OpenShift с помощью GlusterFS и Heketi

by itisgood

Добро пожаловать в наше руководство по настройке динамической инициализации постоянных томов с использованием GlusterFS и Heketi для ваших кластеров Kubernetes / OpenShift.

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

Он использует стандартное аппаратное обеспечение.

В моей настройке я решил развернуть GlusterFS как гиперконвергентную службу на узлах Kubernetes.

Это откроет возможности динамически предоставляемых, постоянных томов GlusterFS в Kubernetes.

Мы будем использовать проект gluster-kubernetes, который предоставляет администраторам Kubernetes механизм для простого развертывания GlusterFS в качестве собственной службы хранения в существующем кластере Kubernetes.

Здесь GlusterFS управляется как любое другое приложение в Kubernetes.

heketi – это интерфейс управления томами RESTful для GlusterFS.

Это позволяет создавать и управлять томами Gluster с помощью API.

Требования к инфраструктуре

Ниже приведены основные требования к настройке.

  1. Должно быть как минимум три узла
  2. Каждый узел должен иметь хотя бы одно необработанное блочное устройство, подключенное для использования heketi.
  3. Для каждого узла должны быть открыты следующие порты для связи GlusterFS: 2222 для sshd модуля GlusterFS, 24007 для демона GlusterFS, 24008 для управления GlusterFS, 49152–49251 для каждого блока, созданного на хосте.
  4. Следующие модули ядра должны быть загружены:
  • dm_snapshot
  • dm_mirror
  • dm_thin_pool

     5. Каждый узел требует наличия команды mount.glusterfs.
6. Версия клиента GlusterFS, установленная на узлах, должна быть как можно ближе к версии сервера.

Шаг 1: Настройка Kubernetes / OpenShift кластера

Эта настройка предполагает, что у вас есть работающий кластер Kubernetes / OpenShift (OKD).

Обратитесь к нашим руководствам о том, как быстро развернуть кластер для тестового / производственного использования.

Шаг 2: Установите glusterfs на все узлы / Настройте брандмауэр

Если вы используете дистрибутив Linux на основе Red Hat, установите пакет glusterfs-fuse, который предоставляет команду mount.glusterfs.

sudo yum -y install glusterfs-fuse

Для Ubuntu / Debian:

sudo apt-get install glusterfs-client

Загрузите все необходимые модули ядра

for i in dm_snapshot dm_mirror dm_thin_pool; do sudo modprobe $i; done

Проверьте, загружены ли модули.

$ sudo lsmod |  egrep 'dm_snapshot|dm_mirror|dm_thin_pool'
dm_thin_pool           66358  0 
dm_persistent_data     75269  1 dm_thin_pool
dm_bio_prison          18209  1 dm_thin_pool
dm_mirror              22289  0 
dm_region_hash         20813  1 dm_mirror
dm_log                 18411  2 dm_region_hash,dm_mirror
dm_snapshot            39103  0 
dm_bufio               28014  2 dm_persistent_data,dm_snapshot
dm_mod                124461  5 dm_log,dm_mirror,dm_bufio,dm_thin_pool,dm_snapshot
Проверьте версию установки.
$ glusterfs --version
glusterfs 3.12.2
Также откройте необходимые порты на брандмауэре – CentOS / RHEL / Fedora
for i in 2222 24007 24008 49152-49251; do
  sudo firewall-cmd --add-port=${i}/tcp --permanent
done
sudo firewall-cmd --reload

Чтобы просмотреть точную версию запущенного Kubernetes, используйте:

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:05:50Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}

Шаг 4: Добавьте вторичные необработанные диски к вашим узлам

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

Я добавил 2 виртуальных диска по 50 ГБ каждый на мои узлы k8s.

[worker01 ~]$ lsblk 
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  20G  0 disk 
└─vda1 253:1    0  20G  0 part /
vdc    253:32   0   50G 0 disk 
vdd    253:48   0   50G 0 disk 

[worker02 ~]$ lsblk 
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  20G  0 disk 
└─vda1 253:1    0  20G  0 part /
vdc    253:32   0   50G 0 disk 
vdd    253:48   0   50G 0 disk 

[worker03 ~]$ lsblk 
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  20G  0 disk 
└─vda1 253:1    0  20G  0 part /
vdc    253:32   0   50G 0 disk 
vdd    253:48   0   50G 0 disk 

Шаг 5: Создайте файл топологии

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

Поскольку я выполняю все операции на главном узле Kubernetes, давайте вытянем gluster-kubernetes из Github.

sudo yum -y install git vim
git clone https://github.com/gluster/gluster-kubernetes.git

Скопируйте и отредактируйте шаблон информации о топологии.

cd gluster-kubernetes/deploy/
cp topology.json.sample topology.json

Это то, что у меня есть в моей конфигурации.

{
  "clusters": [
    {
      "nodes": [
        {
          "node": {
            "hostnames": {
              "manage": [
                "worker01"
              ],
              "storage": [
                "10.10.1.193"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/vdc",
            "/dev/vdd"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "worker02"
              ],
              "storage": [
                "10.10.1.167"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/vdc",
            "/dev/vdd"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "worker03"
              ],
              "storage": [
                "10.10.1.178"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/vdc",
            "/dev/vdd"
          ]
        }
      ]
    }
  ]
}

При создании собственного файла топологии:

  • Убедитесь, что в файле топологии перечислены только блочные устройства, предназначенные для использования Heketi. heketi необходим доступ ко всем блочным устройствам (например, /dev/vdc, /dev/vdd), которые он будет разделять и форматировать.
  • Массив hostnames немного вводит в заблуждение. управление должно быть списком имен хостов для узла, но хранилище должно быть списком IP-адресов на узле для взаимодействия с внутренним хранилищем.

Шаг 6: Запустите скрипт развертывания

Создав файл топологии, вы готовы запустить скрипт gk-deploy с компьютера с административным доступом к вашему кластеру Kubernetes.

Если не запускается с главного узла, скопируйте файл конфигурации Kubernetes в ~/.kube/config.

Ознакомьтесь с доступными опциями.

./gk-deploy -h

Общие параметры:

-g, --deploy-gluster: Deploy GlusterFS pods on the nodes in the topology that contain brick devices
--ssh-user USER: User to use for SSH commands to GlusterFS nodes. Non-root users must have sudo permissions on the nodes. Default is 'root'
--user-key USER_KEY: Secret string for general heketi users. This is a                                                                  required argument.
-l LOG_FILE, --log-file LOG_FILE: Save all output to the specified file.
-v, --verbose: Verbose output

Запустите приведенную ниже команду, чтобы начать развертывание GlusterFS / Heketi, заменив MyUserStrongKey и MyAdminStrongKey значениями ключей.

./gk-deploy -g \
 --user-key MyUserStrongKey \
 --admin-key MyAdminStrongKey \
 -l /tmp/heketi_deployment.log \
 -v topology.json

Нажмите клавишу Y, чтобы принять установку.

Do you wish to proceed with deployment?

[Y]es, [N]o? [Default: Y]: Y
Если развертывание прошло успешно, вы должны получить сообщение:
heketi is now running and accessible viahttp://10.233.108.5:8080
Смотрите скриншот ниже.

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

GlusterFS и heketi должны быть установлены и готовы к работе.

$ kubectl  get deployments
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
heketi   1/1     1            1           75m

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
glusterfs-44jvh          1/1     Running   0          110m
glusterfs-j56df          1/1     Running   0          110m
glusterfs-lttb5          1/1     Running   0          110m
heketi-b4b94d59d-bqmpz   1/1     Running   0          76m


$ kubectl  get services
NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
heketi                     ClusterIP   10.233.42.58    <none>        8080/TCP   76m
heketi-storage-endpoints   ClusterIP   10.233.41.189   <none>        1/TCP      76m
kubernetes                 ClusterIP   10.233.0.1      <none>        443/TCP    127m

$ kubectl get endpoints
NAME                       ENDPOINTS                                   AGE
heketi                     10.233.108.5:8080                           76m
heketi-storage-endpoints   10.10.1.167:1,10.10.1.178:1,10.10.1.193:1   77m
kubernetes                 10.10.1.119:6443     

Шаг 7: Установите и используйте heketi-cli для взаимодействия с GlusterFS


Heketi-cli используется для взаимодействия с GlusterFS, развернутой в кластере Kubernetes.

Загрузите последнюю версию и поместите бинарный файл в вашу переменную PATH.

curl -s https://api.github.com/repos/heketi/heketi/releases/latest \
  | grep browser_download_url \
  | grep linux.amd64 \
  | cut -d '"' -f 4 \
  | wget -qi -
Извлеките загруженные архивные файлы – это будет как клиент, так и сервер.
for i in `ls | grep heketi | grep .tar.gz`; do tar xvf $i; done
Скопируйте heketi-cli в каталог /usr/local/bin.
sudo cp ./heketi-client/bin/heketi-cli /usr/local/bin

Вы должны иметь возможность получить версию Heketi-Cli, как любой пользователь, вошедший на сервер.

$ heketi-cli --version
heketi-cli v9.0.0
Вы можете установить переменную среды HEKETI_CLI_SERVER для heketi-cli, чтобы читать ее напрямую.
export HEKETI_CLI_SERVER=$(kubectl get svc/heketi --template 'http://{{.spec.clusterIP}}:{{(index .spec.ports 0).port}}')

Подтвердите значение переменной:

$ echo $HEKETI_CLI_SERVER
http://10.233.108.5:8080

Детали кластера запросов

$ heketi-cli cluster list --user admin --secret  MyAdminStrongKey
Clusters:
Id:88ed1913182f880ab5eb22ca2f904615 [file][block]

$ heketi-cli cluster info 88ed1913182f880ab5eb22ca2f904615
Cluster id: 88ed1913182f880ab5eb22ca2f904615
Nodes:
1efe9a69341b50b00a0b15f6e7d8c797
2d48f05c7d7d8d1e9f4b4963ef8362e3
cf5753b191eca0b67aa48687c08d4e12
Volumes:
e06893fc6e4f5fa23994432a40877889
Block: true

File: true

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

$ export HEKETI_CLI_USER=admin
$ export HEKETI_CLI_KEY=MyAdminStrongKey
$ heketi-cli cluster list
Clusters:
Id:5c94db92049afc5ec53455d88f55f6bb [file][block]

$ heketi-cli cluster info 5c94db92049afc5ec53455d88f55f6bb
Cluster id: 5c94db92049afc5ec53455d88f55f6bb
Nodes:
3bd2d62ea6b8b8c87ca45037c7080804
a795092bad48ed91be962c6a351cbf1b
e98fd47bb4811f7c8adaeb572ca8823c
Volumes:
119c23455c894c33e968a1047b474af2
Block: true

File: true

$  heketi-cli node list
Id:75b2696a9e142e6900ee9fd2d1eb56b6     Cluster:23800e4b6bdeebaec4f6c45b17cabf55
Id:9ca47f98eaa60f0e734ab628897160fc     Cluster:23800e4b6bdeebaec4f6c45b17cabf55
Id:c43023282eef0f10d4109c68bcdf0f9d     Cluster:23800e4b6bdeebaec4f6c45b17cabf55

Просмотр информации о топологии:

$ heketi-cli topology info

Cluster Id: 698754cfaf9642b451c4671f96c46a0b

    File:  true
    Block: true

    Volumes:


    Nodes:

        Node Id: 39e8fb3b09ccfe47d1d3f2d8e8b426c8
        State: online
        Cluster Id: 698754cfaf9642b451c4671f96c46a0b
        Zone: 1
        Management Hostnames: worker03
        Storage Hostnames: 10.10.1.178
        Devices:

        Node Id: b9c3ac6737d27843ea0ce69a366de48c
        State: online
        Cluster Id: 698754cfaf9642b451c4671f96c46a0b
        Zone: 1
        Management Hostnames: worker01
        Storage Hostnames: 10.10.1.193
        Devices:

        Node Id: c94636a003af0ca82e7be6962149869b
        State: online
        Cluster Id: 698754cfaf9642b451c4671f96c46a0b
        Zone: 1
        Management Hostnames: worker02
        Storage Hostnames: 10.10.1.167
        Devices:

Создайте StorageClass для динамического предоставления.

$ vim gluster-storage-class.yaml 
---
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: glusterfs-storage
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://10.233.108.5:8080"
  restuser: "admin"
  restuserkey: "MyAdminStrongKey"

$ kubectl create -f gluster-storage-class.yaml
storageclass.storage.k8s.io/glusterfs-storage created

$ kubectl  get storageclass
NAME             PROVISIONER               AGE
glusterfs-storage   kubernetes.io/glusterfs   18s

$ kubectl  describe storageclass.storage.k8s.io/glusterfs-storage
Name:                  glusterfs-storage
IsDefaultClass:        No
Annotations:           <none>
Provisioner:           kubernetes.io/glusterfs
Parameters:            resturl=http://10.233.108.5:8080,restuser=admin,restuserkey=MyAdminStrongKey
AllowVolumeExpansion:  <unset>
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>

Создание PVC

$ cat  gluster-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: glusterpvc01
 annotations:
   volume.beta.kubernetes.io/storage-class: glusterfs-storage
spec:
 accessModes:
  - ReadWriteOnce
 resources:
   requests:
     storage: 1Gi

$ kubectl create -f gluster-pvc.yaml
persistentvolumeclaim/glusterpvc01 created

Где:

  • glusterfs-storage – это аннотация класса хранения Kubernetes и имя класса хранения.
  • 1Gi – объем запрошенной памяти

 

You may also like

Leave a Comment