:ceph ====== Инструкция по установке CEPH в изолированном окружении. ====== Часть работ производится на машине с доступом в интернет, потом полученные файлы передаются в закрытый контур и там производится установка. ===== Шаги подготовки, выполняются на машине с доступом в интернет. ===== - Качаем минимальный дистрибутив 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 - Устанавливаем скачанный дистрибутив в минимальной конфигурации. - Устанавливаем необходимые утилиты, пакеты будут качаться из интернета:yum install wget docker yum-utils createrepo git epel-release - Добавляем репозитории 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: - 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 , например: ``` 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 или диск с другим именем