Перейти к основному контенту

Лабораторная работа

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

  1. Запустить 3 инстанса с характеристиками:

    • Имена инстансов: ceph-01, ceph-02, ceph-03
    • Источник: Образ Ubuntu-server-20.04
    • Тип инстанса: small
    • Сети: ???
  2. Создать 3 диска по 2 Гб, подключить каждый к созданным инстансам попарно.

  3. На каждом хосте добавить записи в файл /etc/hosts:

    192.168.0.21 ceph-01
    192.168.0.22 ceph-02
    192.168.0.23 ceph-03
    
  4. Создать пару ключей на ceph-01 для соединения между узлами:

    ssh-keygen
    
  5. Скопировать публичный ключ ceph-01 на каждый хост кластера:

    ssh-copy-id ceph-01  
    ssh-copy-id ceph-02  
    ssh-copy-id ceph-03
    

Запуск кластера Ceph

Установка Ceph

На данном этапе необходимо установить пакет ceph на каждый узел.
Для этого нужно предварительно добавить ключ безопасности репозитория в список доверенных и добавить репозиторий для скачивания указанных пакетов.

  1. Для этого на каждом узле выполнить следующие команды:

    for NODE in ceph-01 ceph-02 ceph-03
    do
        ssh $NODE "sudo apt update; \
                   sudo apt install -y ca-certificates; \
                   wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -; \
                   sudo apt-add-repository 'deb https://download.ceph.com/debian-quincy/ focal main'; \
                   sudo apt update && sudo apt install ceph ceph-mds -y"
    done
    
    • Либо использовать скрипт:

      Скрипт для запуска на ceph-01
      #!/bin/bash
      
      for NODE in ceph-01 ceph-02 ceph-03
      do
        ssh $NODE \
          "sudo apt update; \
      	  sudo apt install -y ca-certificates; \
          wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -; \
          sudo apt-add-repository 'deb https://download.ceph.com/debian-quincy/ focal main'; \
          sudo apt update && sudo apt install ceph ceph-mds -y"
      done
      
  2. Проверить статус установки можно с помьщью команды:

    ceph -v
    
Запуск демонов ceph-mon, ceph-mgr, ceph-osd, ceph-mds
Подготовка к запуску демонов

На узле ceph-01 необходимо выполнить следующие действия:

  1. Получить уникальный идентификатор для кластера (можно с помощью команды uuidgen):
    ad56ab6d-7f7a-4ee4-8b02-9c7ef1ddb438 - используется в качетсве примера

  2. Создать файл конфигурации для кластера по пути /etc/ceph/ceph.conf. Необходимо вставить свои значения параметров: fsid, адреса ???.
    vi /etc/ceph/ceph.conf:

[global]
  fsid = ad56ab6d-7f7a-4ee4-8b02-9c7ef1ddb438
  mon initial members = ceph-01, ceph-02, ceph-03
  mon host = <ceph-01 ext-ip>, <ceph-02 ext-ip>, <ceph-03 ext-ip>
  cluster network = 192.168.0.0/24
  public network = 172.17.5.0/24
  auth cluster required = cephx
  auth service required = cephx
  auth client required = cephx
  osd journal size = 1024
  osd pool default size = 3
  osd pool default min size = 2
  osd pool default pg num = 64
  osd pool default pgp num = 64
  osd crush chooseleaf type = 1
  1. Создать связку ключей для своего кластера и сгенерировать секретный ключ монитора. Также создать связку ключей администратора, client.admin пользователя и добавить пользователя в связку ключей. Создать связку ключей bootstrap-osd, client.bootstrap-osd пользователя и добавить пользователя в связку ключей:

    sudo ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
    sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring \
     --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' \
     --cap mds 'allow *' --cap mgr 'allow *'
    sudo ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring \
     --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' \
     --cap mgr 'allow r'
    
  2. Добавить сгенерированные ключи в связку ceph.mon.keyring:

    sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
    sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
    
  3. Сгенерировать карту мониторов, используя имена хостов, адреса хостов и FSID. Сохранить как /tmp/monmap:

    monmaptool --create --fsid ad56ab6d-7f7a-4ee4-8b02-9c7ef1ddb438 \
     --add ceph-01 <ceph-01 ext-ip> --add ceph-02 <ceph-02 ext-ip> \
     --add ceph-03 <ceph-03 ext-ip> /tmp/monmap
    
Запуск ceph-mon
  1. Необходимо скопировать файлы /etc/ceph/ceph.conf, /etc/ceph/ceph.client.admin.keyring, /tmp/monmap, /tmp/ceph.mon.keyring, /var/lib/ceph/bootstrap-osd/ceph.keyring с ceph-01 на ceph-02 и ceph-03. Далее создадим каталог для данных мониторов на хостах. Заполним демоны монитора картой мониторов и набором ключей. Это можно сделать с помощью следующих команд на каждом хосте:

    sudo chown ceph:ceph /tmp/ceph.mon.keyring
    sudo -u ceph mkdir /var/lib/ceph/mon/ceph-$HOSTNAME
    sudo -u ceph ceph-mon --mkfs -i $HOSTNAME \
     --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
    sudo systemctl enable ceph-mon@$HOSTNAME --now
    
    • Либо использовать скрипт:

      Скрипт для запуска на ceph-01
      #!/bin/bash
      
      for NODE in ceph-01 ceph-02 ceph-03
      do
        ssh $NODE \
      	  "sudo chown ceph:ceph /tmp/ceph.mon.keyring; \
      	  sudo -u ceph mkdir /var/lib/ceph/mon/ceph-$HOSTNAME; \
      	  sudo -u ceph ceph-mon --mkfs -i $HOSTNAME \
      	   --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring; \
      	  sudo systemctl enable ceph-mon@$HOSTNAME --now"
      done
      
  2. Включим протокол MESSENGER V2, отключим небезопасное использование клиентами глобальных идентификаторов и установим вывод предупреждений о малом свободном пространстве на основном диске хоста при остакте в 10% (иначе без этих параметров кластер может иметь статус HEALTH_WARN). Также установим параметр, позволяющий удалять пулы, в значение true:

    sudo ceph mon enable-msgr2
    sudo ceph config set mon auth_allow_insecure_global_id_reclaim false
    sudo ceph config set mon mon_data_avail_warn 10
    sudo ceph config set mon allow pool delete true
    
  3. Так как ещё не добавлено никаких устройств хранения, то в выводе состояния нас интересует только образовавшийся кворум мониторов:

    sudo ceph -s
    
Запуск ceph-mgr

На каждом узле, где вы запускаете демон ceph-mon, вы также должны настроить демон ceph-mgr. Сначала создадим ключ аутентификации для демона. Поместим этот ключ как файл keyring в путь /var/lib/ceph/mgr/ceph-$HOSTNAME/keyring и запустим демон ceph-mgr.

  1. Для этого небоходимо выполнить данные действия на каждом хосте:

    sudo ceph auth get-or-create mgr.$HOSTNAME mon 'allow profile mgr' osd 'allow *' mds 'allow *'
    sudo ceph auth get-or-create mgr.$HOSTNAME > /tmp/mgr.admin.keyring
    sudo -u ceph mkdir /var/lib/ceph/mgr/ceph-$HOSTNAME
    sudo cp /tmp/mgr.admin.keyring /var/lib/ceph/mgr/ceph-$HOSTNAME/keyring
    sudo chown -R ceph. /var/lib/ceph/mgr/ceph-$HOSTNAME
    sudo systemctl enable --now ceph-mgr@$HOSTNAME
    
    • Либо использовать скрипт:

      Скрипт для запуска на ceph-01
      #!/bin/bash
      
      for NODE in ceph-01 ceph-02 ceph-03
      do
        ssh $NODE \
      	  "sudo ceph auth get-or-create mgr.$HOSTNAME \
      	   mon 'allow profile mgr' osd 'allow *' mds 'allow *'; \
      	  sudo ceph auth get-or-create mgr.$HOSTNAME > /tmp/mgr.admin.keyring; \
      	  sudo -u ceph mkdir /var/lib/ceph/mgr/ceph-$HOSTNAME; \
      	  sudo cp /tmp/mgr.admin.keyring /var/lib/ceph/mgr/ceph-$HOSTNAME/keyring; \
          sudo chown -R ceph. /var/lib/ceph/mgr/ceph-$HOSTNAME; \
      	  sudo systemctl enable --now ceph-mgr@$HOSTNAME"
      done
      
  2. На данном этапе мы можем увидеть статус запуска демонов менеджеров:

    sudo ceph -s
    
Запуск ceph-osd

Ceph предоставляет ceph-volume утилиту, которая может подготовить логический том, диск или раздел для использования с Ceph. Утилита ceph-volume создает идентификатор OSD путем увеличения индекса. Кроме того, ceph-volume добавит новый OSD в карту CRUSH хоста.

  1. На каждом хосте выполнить:

    sudo ceph-volume lvm create --data /dev/vdb
    
    • Либо использовать скрипт:

      Скрипт для запуска на ceph-01
      #!/bin/bash
      
      for NODE in ceph-01 ceph-02 ceph-03
      do
          ssh $NODE "sudo ceph-volume lvm create --data /dev/vdb"
      done
      
  2. На данном этапе кластер должен иметь статус HEALTH_OK:

    sudo ceph -s
    
Запуск ceph-mds

Чтобы услуга Ceph FS работала для клиентов, необходимо запустить демон сервера метаданных (MDS). Для этого создадим папку для демона, пользователя Ceph и запустим службу ceph-mds.

  1. Запустить демоны MDS на хостах ceph-02, ceph-03:

    sudo mkdir -p /var/lib/ceph/mds/ceph-$HOSTNAME
    sudo ceph-authtool --create-keyring /var/lib/ceph/mds/ceph-$HOSTNAME/keyring \
     --gen-key -n mds.$HOSTNAME
    sudo chown -R ceph. /var/lib/ceph/mds/ceph-$HOSTNAME
    sudo ceph auth add mds.$HOSTNAME osd "allow rwx" mds "allow" mon "allow profile mds" \
     -i /var/lib/ceph/mds/ceph-$HOSTNAME/keyring
    sudo systemctl enable --now ceph-mds@$HOSTNAME
    
    • Либо использовать скрипт:
    Скрипт для запуска на ceph-01
    #!/bin/bash
    
    for NODE in ceph-02 ceph-03
    do
      ssh $NODE \
    	  "sudo mkdir -p /var/lib/ceph/mds/ceph-$HOSTNAME; \
    	  sudo ceph-authtool --create-keyring /var/lib/ceph/mds/ceph-$HOSTNAME/keyring \
    	   --gen-key -n mds.$HOSTNAME; \
    	  sudo chown -R ceph. /var/lib/ceph/mds/ceph-$HOSTNAME; \
        sudo ceph auth add mds.$HOSTNAME osd "allow rwx" mds "allow" mon "allow profile mds" \
    	   -i /var/lib/ceph/mds/ceph-$HOSTNAME/keyring; \
        sudo systemctl enable --now ceph-mds@$HOSTNAME"
    done
    

Интеграция Ceph и libvirt

Установка libvirt

sudo apt install -y qemu-kvm virtinst libvirt-clients libvirt-daemon-system cloud-image-utils

Добавление пула Ceph в libvirt
  1. Во-первых, нам нужно создать пул Ceph OSD специально для использования хранилища kvm, qemu, libvirt:

    sudo ceph osd pool create libvirt-pool 64 64
    sudo rbd pool init libvirt-pool
    
  2. Во-вторых, нам нужен пользователь Ceph для манипулирования только что созданным пулом.

    sudo ceph auth get-or-create "client.libvirt" mon "profile rbd" osd "profile rbd pool=libvirt-pool"
    
  3. Нам нужно добавить файл с секретом libvirt для аутентификации.
    uuidgen -> e6ca4cff-bf4f-4444-9089-8bd1304b3500 - для libvirt секрета
    sudo vi /tmp/libvirt-secret.xml:

    <secret ephemeral='no' private='no'>
      <uuid>e6ca4cff-bf4f-4444-9089-8bd1304b3500</uuid>
      <usage type='ceph'>
        <name>client.libvirt secret</name>
      </usage>
    </secret>
    
  4. Встраиваем ключ авторизации пользователя Ceph в файл с секретом с указанным uuid.

    sudo virsh secret-define --file "/tmp/libvirt-secret.xml"
    sudo rm -f "/tmp/libvirt-secret.xml"
    sudo virsh secret-set-value --secret "e6ca4cff-bf4f-4444-9089-8bd1304b3500" \
     --base64 "$(sudo ceph auth get-key client.libvirt)"
    
  5. Нам также необходимо определить пул хранения RBD в libvirt. Сначала нам нужно создать файл определения пула хранения:
    vi /tmp/libvirt-rbd-pool.xml:

    <pool type="rbd">
      <name>libvirt-pool</name>
      <source>
        <name>libvirt-pool</name>
        <host name='ceph-01' port='6789' />
        <host name='ceph-02' port='6789' />
        <host name='ceph-03' port='6789' />
        <auth username='libvirt' type='ceph'>
          <secret uuid='e6ca4cff-bf4f-4444-9089-8bd1304b3500'/>
        </auth>
      </source>
    </pool>
    
  6. Теперь мы можем определить и запустить пул.

    sudo virsh pool-define "/tmp/libvirt-rbd-pool.xml"
    sudo rm -f "/tmp/libvirt-rbd-pool.xml"
    sudo virsh pool-autostart "libvirt-pool"
    sudo virsh pool-start "libvirt-pool"
    

Запуск ВМ с использованием Ceph FS

Запуск файловой системы

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

  1. Чтобы запустить файловую систему ceph, нужно создать два пула: пул для данных и пул для метаданных:

    sudo ceph osd pool create cephfs_data 64
    sudo ceph osd pool create cephfs_metadata 64
    
  2. Создадим файловую систему:

    sudo ceph fs new cephfs cephfs_metadata cephfs_data
    

    С помощью данных команд можно просмотреть статус файловой системы:

    sudo ceph fs ls
    sudo ceph mds stat
    sudo ceph fs status cephfs
    
  3. Создадим пользователя для подключения к файловой системе и запишем ключ пользователя в отдельный файл:

    sudo ceph fs authorize cephfs client.fsclient / rw
    sudo ceph auth get-or-create-key client.fsclient -o /etc/ceph/ceph.client.fsclient.secret
    
  4. Необходимо скопировать файл /etc/ceph/ceph.client.fsclient.secret на остальные узлы.

Монтирование Ceph FS
  1. На каждом узле кластера необходимо выполнить следующие команды:

    sudo mkdir /mnt/cephfs
    sudo mount -t ceph fsclient@.cephfs=/ /mnt/cephfs -o secretfile=/etc/ceph/fsclient.secret
    
  2. Проверить статус монтирования:

    df -hT
    
Запуск ВМ
  1. Скачать образ cirros и скопировать его в /mnt/cephfs/, где примонтирована Ceph FS

    wget http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64-disk.img
    sudo cp cirros-0.5.1-x86_64-disk.img /mnt/cephfs/cirros.img
    
  2. Создать Ceph RBD как дополнительное хранилище для виртуальной машины:

    sudo virsh vol-create-as libvirt-pool cirros-img --capacity 1G --format raw
    
  3. Создать ВМ:

    sudo virt-install --connect qemu:///system --virt-type kvm --name Test-VM \
      --vcpus 1 --memory 128 --disk "path=/mnt/cephfs/cirros.img" \
      --disk "vol=libvirt-pool/cirros-storage" --import --autostart
    
  4. Проверить работоспособность запущенной ВМ:

    sudo virsh list --all
    sudo virsh console Test-VM
    

Настройка динамической миграции

Установка Pacemaker/Corosync
sudo apt install pacemaker corosync pcs resource-agents`
sudo systemctl enable --now pcsd
Запуск кластера
  1. Задать пароль пользователя hacluster на всех узлах (в примере используется пароль password):

    sudo passwd hacluster
    
  2. С помощью pcs создать кластер (на одном из узлов):

    sudo pcs host auth ceph-01 addr=??? \ 
     ceph-02 addr=??? ceph-03 addr=??? \ 
     -u hacluster -p password
    sudo pcs cluster setup newcluster ceph-01 ceph-02 ceph-03 --force
    sudo pcs cluster start --all
    
  3. Отключить fencing (в рамках работы он не рассматривается):

    sudo pcs property set stonith-enabled=false
    
  4. Включить автозапуск сервисов на всех трех машинах:

    sudo systemctl enable pacemaker corosync
    
  5. Просмотреть информацию о кластере и кворуме:

    sudo pcs status
    sudo corosync-quorumtool
    
Создание ресурса
  1. Создать дамп созданной ВМ и затем удалить её:

    sudo virsh dumpxml Test-VM | tee vm_conf.xml
    sudo virsh undefine Test-VM
    sudo virsh destroy Test-VM
    
  2. Скопировать дамп с ceph-01 на ceph-02 и ceph-03:

    scp vm_conf.xml ceph-02:~
    scp vm_conf.xml ceph-03:~
    
  3. На ceph-01, ceph-02 и ceph-03 переместить файл в /etc/pacemaker/

    sudo mv vm_conf.xml /etc/pacemaker/
    sudo chown hacluster:haclient /etc/pacemaker/vm_conf.xml
    
  4. Теперь добавить сам ресурс:

    sudo pcs resource create test-vm VirtualDomain \
    сonfig="/etc/pacemaker/vm_conf.xml" \
    migration_transport=tcp meta allow-migrate=true
    
  5. Просмотреть список добавленных ресурсов:

    sudo pcs status
    sudo pcs resource show test-vm
    
  6. Проверить список виртуальных машин на узле, на котором запустился ресурс:

    sudo virsh list --all
    
  7. Проверить, что ресурс успешно запустился.

Настройка миграции

Выполнить действия на всех узлах

  1. Необходимо отредактировать файл /etc/libvirt/libvirtd.conf:

    listen_tls = 0
    listen_tcp = 1
    auth_tcp = "none"
    
  2. Отредактировать файл /etc/default/libvirtd:

    libvirtd_opts="--config /etc/libvirt/libvirtd.conf"
    
  3. Запустить сокет libvirt-tcp:

    sudo systemctl stop libvirtd && sudo systemctl start libvirtd-tcp.socket
    
Миграция ресурса
  1. Нужно переместить ресурс на ceph-02:

    sudo pcs resource move test-vm ceph-02
    
  2. На ceph-02 посмотреть статус кластера, и проверить список запущенных гостевых машин можно следующими командами:

    sudo pcs status
    sudo virsh list --all
    
  3. Команда move добавляет ресурсу правило, заставляющее его запускаться только на указанном узле. Для того, чтобы очистить все добавленные ограничения - clear:

    sudo pcs resource clear test-vm