:ceph

Инструкция по установке CEPH в изолированном окружении.

Часть работ производится на машине с доступом в интернет, потом полученные файлы передаются в закрытый контур и там производится установка.

Шаги подготовки, выполняются на машине с доступом в интернет.

  1. Качаем минимальный дистрибутив CentOS 7.8, например отсюда:
    curl https://mirror.yandex.ru/centos/7.8.2003/isos/x86_64/CentOS-7-x86_64-Minimal-2003.iso -o CentOS-7-x86_64-Minimal-2003.iso
  2. Устанавливаем скачанный дистрибутив в минимальной конфигурации.
  3. Устанавливаем необходимые утилиты, пакеты будут качаться из интернета:
    yum install wget docker yum-utils createrepo git epel-release
  4. Добавляем репозитории ceph и ganesha:
  ```
  cat >> /etc/yum.repos.d/ceph.repo << EOF
  [nfs_ganesha_stable]
  baseurl = http://download.ceph.com/nfs-ganesha/rpm-V2.7-stable/nautilus/\$basearch
  gpgcheck = 1
  gpgkey = https://download.ceph.com/keys/release.asc
  name = nfs-ganesha stable repo
  
  [ceph_stable]
  baseurl = http://download.ceph.com/rpm-nautilus/el7/\$basearch
  gpgcheck = 1
  gpgkey = https://download.ceph.com/keys/release.asc
  name = Ceph Stable $basearch repo
  priority = 2
  
  [ceph_stable_noarch]
  baseurl = http://download.ceph.com/rpm-nautilus/el7/noarch
  gpgcheck = 1
  gpgkey = https://download.ceph.com/keys/release.asc
  name = Ceph Stable noarch repo
  priority = 2
  EOF
  ```

5. Создаём срез репозиториев для установки без интернета:

  ```
  cd /root
  mkdir repos
  cd repos
  reposync --newest-only
  ```

6. Создаём структуру-описание репозиториев:

  ```
  cd /root/repos
  cd base
  createrepo .
  cd ../ceph_stable
  createrepo .
  cd ../ceph_stable_noarch
  createrepo .
  cd ../epel
  createrepo .
  cd ../extras
  createrepo .
  cd ../nfs_ganesha_stable
  createrepo .
  cd ../updates
  createrepo .
  ```

7. Качаем контейнеры Docker

  ```
  systemctl start docker
  docker pull grafana/grafana:5.4.3
  docker pull prom/prometheus:v2.7.2
  docker pull prom/alertmanager:v0.16.2
  docker pull prom/node-exporter:v0.17.0
  ```

8. Проверим что все 4 контейнера на месте:

  ```
  docker images
  ```
  > REPOSITORY TAG IMAGE ID CREATED SIZE
  >
  > docker.io/prom/alertmanager v0.16.2 a1c1bd95a2dd 12 months ago 42.5 MB
  >
  > docker.io/prom/prometheus v2.7.2 2a68492b2466 14 months ago 101 MB
  >
  > docker.io/grafana/grafana 5.4.3 d0454da13c84 15 months ago 240 MB
  >
  > docker.io/prom/node-exporter v0.17.0 b3e7f67a1480 17 months ago 21 MB

9. Выгружаем скачанные контейнеры

  ```
  cd /root
  mkdir docker
  cd docker
  docker save docker.io/prom/alertmanager > alertmanager.tar
  docker save docker.io/prom/prometheus > prometheus.tar
  docker save docker.io/grafana/grafana > grafana.tar
  docker save docker.io/prom/node-exporter > node-exporter.tar
  systemctl stop docker
  ```

10. Делаем слепок репозитория ceph-ansible

  ```
  cd /root
  git clone https://github.com/ceph/ceph-ansible.git
  ```

11. Переключаем ветку

  ```
  cd ceph-ansible
  git checkout stable-4.0
  ```

12. Переносим скачанные ресурсы в закрытый контур.

## Шаги подготовки, выполняемые в закрытом сегменте

1. Устанавливаем CentOS 7.8 со скачанного диска на ВМ для создания управляющего узла ansible и на целевые узлы кластера. 2. Копируем скачанные файлы в каталог /root на ВМ с ansible. 3. Создаем каталоги для веб-сервера

  ```
  mkdir -p /var/www/html
  ```

4. Переносим содержимое каталога repos в /var/www/html

  ```
  cd /root
  mv repos/* /var/www/html/
  ```

5. Удаляем стандартные репозитории:

  ```
  cd /root
  mkdir OLD
  mv /etc/yum.repos.d/Cent* OLD/
  ```

6. Прописываем локальные репозитарии для установки ansible, httpd:

  ```
  cat >> /etc/yum.repos.d/local.repo << EOF
  [base-local]
  name=Base local repos
  baseurl = file:///var/www/html/base
  gpgcheck=0
  enable=1
  
  [epel-local]
  name=EPEL local repos
  baseurl = file:///var/www/html/epel
  gpgcheck=0
  enable=1
  
  [updates-local]
  name=Base local repos
  baseurl = file:///var/www/html/updates
  gpgcheck=0
  enable=1
  
  EOF
  ```

7. Устаналиваем ansbile, httpd, createrepo, python-netaddr, убеждаемся, что версия ansible выше 2.8 (2.9.6-1.el7):

  ```
  yum install ansible createrepo httpd python-netaddr
  ```

8. Настраеваем политику selinux для раздачи наших репозиториев:

  ```
  chown apache:apache -R /var/www
  restorecon -Rv /var/www/ 
  ```

9. Включаем httpd для раздачи файлов и настраиваем файервол:

  ```
  systemctl enable httpd
  systemctl start httpd
  firewall-cmd --zone=public --add-service=http --permanent
  firewall-cmd --reload
  ```

10. Копируем файл примера в рабочий вариант установки:

  ```
  cp site.yml.sample site.yml
  ```

11. Создаём файл inventory и вносим в него все наши узлы одного кластера, а так же задаём роли этим узлам, пример ниже:

  ```
  cd /root
  cd ceph-ansible
  cat >> inventory << EOF
  ceph-n4 ansible_host=192.168.200.4 ansible_user=support 
  ceph-n5 ansible_host=192.168.200.5 ansible_user=support 
  ceph-n6 ansible_host=192.168.200.6 ansible_user=support 
  
  [mons]
  ceph-n[4:6]
  
  [osds]
  ceph-n[4:6]
  
  [mdss]
  ceph-n[4:6]
  
  [nfss]
  ceph-n[4:6]
  
  [rgws]
  ceph-n[4:6]
  
  [grafana-server]
  ceph-n[4:6]
  
  EOF
  ```

12. Создаем вспомогательных скрипт загрузки контейнеров docker:

  ```
  cat >> /root/docker/load.sh
  #!/bin/bash
  
  docker load < /tmp/alertmanager.tar
  docker load < /tmp/grafana.tar
  docker load < /tmp/node-exporter.tar
  docker load < /tmp/prometheus.tar
  
  EOF
  ```

13. Создаём промежуточный рецепт ansible, который пропишет наши репозитории и добавить контейнеры docker, лучше его брать готовым файлом, что бы не искать потерянный/лишний пробел, не забыть поправить IP адрес узла с ansible:

  ```
  cd /root
  cd ceph-ansible
  cat >> iteco.yml << EOF
  - name: Apply settings for without internet installation
    hosts: all
    become: yes
    become_user: root
    vars:
      check: yes
  
    tasks:
      - name: Install epel-repos
        yum:
          name: http://192.168.200.251/extras/Packages/epel-release-7-11.noarch.rpm
          state: present
  
      - name: Delete file CentOS-Base.repo
        file:
          path: "/etc/yum.repos.d/CentOS-Base.repo"
          state: absent
  
      - name: Delete file CentOS-CR.repo
        file:
          path: "/etc/yum.repos.d/CentOS-CR.repo"
          state: absent
  
      - name: Delete file CentOS-Debuginfo.repo
        file:
          path: "/etc/yum.repos.d/CentOS-Debuginfo.repo"
          state: absent
  
      - name: Delete file CentOS-fasttrack.repo
        file:
          path: "/etc/yum.repos.d/CentOS-fasttrack.repo"
          state: absent
  
      - name: Delete file CentOS-Media.repo
        file:
          path: "/etc/yum.repos.d/CentOS-Media.repo"
          state: absent
  
      - name: Delete file CentOS-Sources.repo
        file:
          path: "/etc/yum.repos.d/CentOS-Sources.repo"
          state: absent
  
      - name: Delete file CentOS-Vault.repo
        file:
          path: "/etc/yum.repos.d/CentOS-Vault.repo"
          state: absent
  
      - name: Delete file epel-testing.repo
        file:
          path: "/etc/yum.repos.d/epel-testing.repo"
          state: absent
  
      - name: Delete file epel.repo
        file:
          path: "/etc/yum.repos.d/epel.repo"
          state: absent
  
      - name: Add Base repo from ansible host
        yum_repository:
          name: base-local
          description: Base local Repo
          file: local
          baseurl: http://192.168.200.251/base
          gpgcheck: no
  
      - name: Add updates repo from ansible host
        yum_repository:
          name: updates-local
          description: Updates Repo
          file: local
          baseurl: http://192.168.200.251/updates
          gpgcheck: no
  
      - name: Add extras repo from ansible host
        yum_repository:
          name: extras-local
          description: Extrass Repo
          file: local
          baseurl: http://192.168.200.251/extras
          gpgcheck: no
  
      - name: Add epel repo from ansible host
        yum_repository:
          name: repo-local
          description: Epel Repo
          file: local
          baseurl: http://192.168.200.251/epel
          gpgcheck: no
  
      - name: Add CEPH repo from ansible host
        yum_repository:
          name: ceph_stable
          description: Ceph stable Repo
          file: local
          baseurl: http://192.168.200.251/ceph_stable
          gpgcheck: no
  
      - name: Add Ceph noarch repo from ansible host
        yum_repository:
          name: ceph_stable_noarch
          description: Ceph stable noarch Repo
          file: local
          baseurl: http://192.168.200.251/ceph_stable_noarch
          gpgcheck: no
  
      - name: Add NFS repo from ansible host
        yum_repository:
          name: nfs_ganesha_stable
          description: NFS Repo
          file: local
          baseurl: http://192.168.200.251/nfs_ganesha_stable
          gpgcheck: no
  
      - name: Install docker
        yum:
          name:
            - docker
            - python-docker-py
          state: present
  
      - name: Starting Docker
        systemd:
          state: started
          name: docker
  
      - name: Copy alertmanager container to hosts
        copy:
          src: /root/docker/alertmanager.tar
          dest: /tmp/alertmanager.tar
  
      - name: Copy grafana container to hosts
        copy:
          src: /root/docker/grafana.tar
          dest: /tmp/grafana.tar
  
      - name: Copy node-exporter container to hosts
        copy:
          src: /root/docker/node-exporter.tar
          dest: /tmp/node-exporter.tar
  
      - name: Copy prometheus container to hosts
        copy:
          src: /root/docker/prometheus.tar
          dest: /tmp/prometheus.tar
  
      - name: Copy load script to tmp
        copy:
          src: /root/docker/load.sh
          dest: /tmp/load.sh
          mode: '0755'
  
      - name: Load docker images to docker
        command: /tmp/load.sh
  EOF
  ```

14. Выполняем

  ```
  ansible-playbook -i inventory iteco.yml --ask-become-pass --ask-pass
  ```

15. Подготавливаем файл с переменными установки CEPH, за основу можно взять файл groupvars/all.yml.sample или взять уже готовый пример для изолированного окружения:

  ```
  cp groupvars/all.yml.sample groupvars/all.yml
  ```
  или
  ```
  cat >> groupvars/all.yml << EOF
  ---
  dummy:
  cluster: akademia
  configure_firewall: True
  ceph_mon_firewall_zone: public
  ceph_mgr_firewall_zone: public
  ceph_osd_firewall_zone: public
  ceph_rgw_firewall_zone: public
  ceph_mds_firewall_zone: public
  ceph_nfs_firewall_zone: public
  ceph_rbdmirror_firewall_zone: public
  ceph_iscsi_firewall_zone: public
  ceph_dashboard_firewall_zone: public
  ceph_rgwloadbalancer_firewall_zone: public
  ntp_daemon_type: chronyd
  ceph_origin: distro
  ceph_repository: custom
  ceph_custom_repo: http://192.168.200.251/ceph_stable
  monitor_address_block: 192.168.200.0/24
  public_network: 192.168.200.0/24
  cluster_network: 10.10.10.0/24
  osd_mkfs_type: ext4
  radosgw_civetweb_port: 8080
  radosgw_address_block: 192.168.200.0/24
  nfs_file_gw: true
  nfs_obj_gw: true
  dashboard_enabled: True
  dashboard_protocol: http
  dashboard_port: 8443
  dashboard_admin_user: admin
  dashboard_admin_password: password
  grafana_admin_user: admin
  grafana_admin_password: admin
  grafana_container_image: "grafana/grafana:5.4.3"
  grafana_container_memory: 1
  EOF
  ```

16. Подготавливаем файл с переменными для серверов osd, включим на всех узлав автоматическое обнаружение пустых и свободных дисков, для включения их в состав хранилища:

  ```
  cp groupvars/osds.yml.sample groupvars/osds.yml
  ```
  или
  ```
  cat >> groupvars/osds.yml << EOF
  ---
  dummy:
  osd_auto_discovery: true
  
  EOF
  ```

17. Удаляем плагины из сервиса grafana-server, удаляем 23 строку, где перечислены плагины:

  ```
  cp roles/ceph-grafana/templates/grafana-server.service.j2 roles/ceph-grafana/templates/grafana-server.service.j2-old
  vi roles/ceph-grafana/templates/grafana-server.service.j2
  23 gg
  dd
  :wq
  
  ```

18. Подготовка завершена.

## Шаги установки кластера:

1. Запустить команду

``` time ansible-playbook -i inventory site.yml –ask-become-pass –ask-pass ```

2. Ждать. Обычно установка занимает не больше 20 минут, для кластера из 3х узлов. 3. Готово 4. ????? 5. PROFIT

## Итоги

Будет развернут кластер CEPH, у которого будет web-интерфейс управления и доступ по NFS. Для управления доступом по nfs необходимо использовать данный метод установки, путем подготовки кластера, в виде создания учетных записей для хранения объектов, и создания файла шаблона конфигурации ganesha_nfs, лежащий по пути:

``` ./roles/ceph-nfs/templates/ganesha.conf.j2 ```

Или править содtржимое файла /etc/ganesha/ganesha.conf на всех узлах с ролью NFS.

## Дополнительно

Можно настроить HAproxy для доступа к radosgw по плавающему IP адресу, для этого необходимо произвести настройку в файле group_vars/rgwloadbalancers.yml:

``` cat group_vars/rgwloadbalancers.yml | grep -v \# | grep -v '^$' — dummy: haproxy_frontend_port: 8088 virtual_ips:

  1. 172.26.29.116

virtual_ip_netmask: 24 virtual_ip_interface: ens192 ```

и определить узлы для участия в кластере HAproxy, указав в файле inventory:

``` [rgwloadbalancers] ceph-n[7:9] ```

В процессе установки по какой-то причине не все параметры selinux выставляются, наобходимо вручную добавить правило:

``` setsebool -P haproxy_connect_any 1 ```

После произвести перезапуск:

``` systemctl restart haproxy ```

## Интеграция

Для интеграции с elasticsearch необходимо создать real и произвести создание дополнительной зоны для хранения метаданных и еще один инстанс radosgw, который будет отправлять данные в elasticsearch.

## Подсказки

Если в параметрах установки кластера указано имя кластера, то для корректного вызова команды ceph или radosgw-admin необходимо добавлять ключ –cluster <cluster-name>, например:

``` ceph -s –cluster akademia ```

Иначе будет сообщение об ошибке.

# PXE загрузка и установка по сети

Если в системе отсутствуют средства автоматизированной установки ОС, то можно поднять самому.

Ставим пакеты:

``` yum install dhcp tftp tftp-server syslinux xinetd ```

Настраеваем DHCP сервер (меняем IP адреса по месту):

``` vim /etc/dhcp/dhcpd.conf ddns-update-style interim; ignore client-updates; authoritative; allow booting; allow bootp; allow unknown-clients;

# internal subnet for my DHCP Server subnet 192.168.100.0 netmask 255.255.255.0 {

  range 192.168.100.100 192.168.100.200;
  option domain-name-servers 192.168.100.1;
  option domain-name "ceph.lab";
  option routers 192.168.100.1;
  option broadcast-address 192.168.100.255;
  default-lease-time 600;
  max-lease-time 7200;
  # IP of PXE Server
  next-server 192.168.100.1;
  filename "pxelinux.0";

} ```

Включаем демона tftpd в файле /etc/xinetd.d/tftp, путем правки строки

```

      disable                 = yes

```

на

```

      disable                 = no

```

Копируем загрузчик и создаем структуру каталогов

``` cp -v /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot cp -v /usr/share/syslinux/menu.c32 /var/lib/tftpboot cp -v /usr/share/syslinux/memdisk /var/lib/tftpboot cp -v /usr/share/syslinux/mboot.c32 /var/lib/tftpboot cp -v /usr/share/syslinux/chain.c32 /var/lib/tftpboot mkdir /var/lib/tftpboot/pxelinux.cfg mkdir /var/lib/tftpboot/networkboot ```

Делаем копию загрузочного диска, доступной по сети:

``` mount CentOS-7-x86_64-Minimal-2003.iso -o loop /mnt/ mkdir /var/www/html/pub/ cd /mnt cp -av * /var/www/html/pub/ ```

Копируем ядро и initrd в каталог tftp:

``` cp /mnt/images/pxeboot/vmlinuz /var/lib/tftpboot/networkboot/ cp /mnt/images/pxeboot/initrd.img /var/lib/tftpboot/networkboot/ ```

Отмонтируем диск

``` cd /root umount /mnt ```

Создаем kickstart файл для автоматической учтановки:

``` vim /var/www/html/pub/centos-7.8.cfg #platform=x86, AMD64, or Intel EM64T #version=DEVEL # Firewall configuration # firewall –disabled # Install OS instead of upgrade install # Use FTP installation media url –url=«http://192.168.100.1/pub/» # Root password rootpw –iscrypted $1$t1aZtdCZ$UzUiam2xL2/gYbQp.pup71 # System authorization information auth useshadow passalgo=sha512 # Use graphical|text install text firstboot disable # System keyboard keyboard us # System language lang en_US # SELinux configuration # selinux disabled # Installation logging level logging level=info # Reboot machine reboot # System timezone timezone Europe/Moscow # System bootloader configuration #ignoredisk –only-use=sda bootloader location=mbr clearpart –all –initlabel #part swap –ondisk=sda –asprimary –fstype=«swap» –size=4096 part /boot –ondisk=sda –fstype ext2 –size=1024 part pv.156 –size=1 –ondisk=sda –grow volgroup system pv.156 logvol swap –fstype=«swap» –size=4096 –name=swap –vgname=system logvol / –fstype xfs –name=root –vgname=system –size=1 –grow %packages @^minimal @core %end %addon com_redhat_kdump –disable –reserve-mb='auto' %end

```

Создаем файл загрузочного меню:

``` vim /var/lib/tftpboot/pxelinux.cfg/default default menu.c32 prompt 0 timeout 50 MENU TITLE i-Teco PXE Menu LABEL centos7_x64 MENU LABEL CentOS 7_X64 autoinstall KERNEL /networkboot/vmlinuz APPEND initrd=/networkboot/initrd.img inst.repo=http://192.168.100.1/pub ks=http://192.168.100.1/pub/centos-7.8.cfg

LABEL centos7_x64-manual MENU LABEL CentOS 7_X64 KERNEL /networkboot/vmlinuz APPEND initrd=/networkboot/initrd.img inst.repo=http://192.168.100.1/pub ```

Включаем все службы:

``` systemctl enable –now dhcpd systemctl enable –now xinetd setsebool -P allow_ftpd_full_access 1 firewall-cmd –add-service=dhcp –permanent firewall-cmd –add-port=69/tcp –permanent firewall-cmd –add-port=69/udp –permanent firewall-cmd –add-port=4011/udp –permanent firewall-cmd –reload chown apache:apache -R /var/www restorecon -Rv /var/www/ ```

При выполнении установки на UEFI или диск с другим именем