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