: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 <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 или диск с другим именем
