Storage: Cluster ceph

Come usare lo spazio disco in modo intelligente

Installiamo un cluster ceph su 5-6 macchine linux presso un datacenter. Importante servono almeno 3 macchine, se ne hai di meno, allora Ceph protrebbe non fare al caso tuo.

Premessa

Metodo manuale... perché togliere il divertimento automatizzando tutto?

Per fare un installazione fatta bene, bisogna avere delle macchine fisiche (aka server) preferibilmente, collegate tutte alla stessa rete (bhe almeno per il primo cluster), magari un'infrastruttura con un controller tipo juju o simili o fare le installazioni con Ansible ... ma questi metodi per quanto comodi in produzione, secondo me toltono quel non so che su installare le cose a mano, spaccare tutto e capire bene le cose che si stanno facendo. I compiti che i bambini fanno a scuola, servono a quello, provare provare provare e solo così diventare competenti in quello che si fa.

Creazione macchine

Il prossimo step è installare Ubuntu 22.04 (attenzione NON 24.04 che per ora non è supportato da Ceph) o qualsiasi altro OS che vi piace ed è compatibile con Ceph.

Come detto la cosa migliore è installare direttamente su macchina fisica, ma nel mio caso per comodità, per semplicità, per necessità, perché mi va... creo il cluster Ceph su KVM (ci sono mille ragioni per non farlo, ma altrettante per me per farlo)

Con Cloudmin installato su macchina fisica procedo a creare per ogni server una VM con 25Gb di disco Root "/" e attacco un altro disco vuoto senza nulla che ci servità per dopo.

Macchina fisica (OS Ubuntu 24.04 + Cloudmin)
    Macchina KVM (OS Ubuntu 22.04 - Dischi: 25Gb Root | 2Tb libero)
        Installazione OS: IP statico, Minimal, SSH Server

Fatto questo installo Ubuntu 22.04 come detto sulla VM e controllo tramite SSH

echo "Inserire password utente (deve essere nei sudoes)"
sudo su
echo "Aggiorno il sistema"
apt update && apt upgrade -y
echo "Installo tool di base"
apt install htop screen nano lvm2
ip a && echo "Copia IP della macchina"
echo "Nel file hosts creare una entry se non esiste con IP e nome macchina"
nano /etc/hosts
echo "Genero chiavi SSH"
ssh-keygen
echo "Settare password dell'utente root"
passwd
echo "Imposto SSH per permettere il login come root"
sed -e 's/#PermitRootLogin .*/PermitRootLogin yes/' /etc/ssh/sshd_config
echo "Riavvio SSH Server"
service ssh restart

Ripeto questa operazione sulle 5 macchine KVM create (una per ogni macchina fisica)

Ora sulla macchina "principale" (una delle macchine sarà usata per installare il cluster su se stessa e tutte le altre) copio la chiave pubblica SSH su tutte le altre in modo da poter avere accesso diretto senza username/password da inserire in fase di connessione (come utente root)

ssh-copy-id root@[IP di ogni macchina che voglio inserire nel cluster]

Installiamo Docker sulla prima macchina (si userò docker per far girare Ceph)

apt-get install ca-certificates curl
mkdir /etc/apt/keyrings
chmod 0755 /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin

Controlliamo che l'ora di sistema sia impostata e che si sincronizzi (in realtà la cosa migliore e impostare un server NTP interno in modo da avere una sincronizzazione perfetta di tutte le macchine in locali)

timedatectl status

Se riporta al fondo questa parte, è tutto okay

System clock synchronized: yes
NTP service: active

Installiamo ceph manager

Sempre e solo sulla prima macchina installiamo cephadm (usare la versione corrente oppure quella supporta dal proprio OS). Cambiare i primi tre parametri con quello che serve.

CEPH_RELEASE=19.2.1
CEPH_NOME_RELEASE=squid
IP_MACCHINA_ATTUALE=192.168.254.2

curl --silent --remote-name --location \
https://download.ceph.com/rpm-${CEPH_RELEASE}/el9/noarch/cephadm
chmod +x cephadm
./cephadm add-repo --release ${CEPH_NOME_RELEASE}
./cephadm install
cephadm bootstrap --mon-ip ${IP_MACCHINA_ATTUALE}
cephadm install ceph-common
ceph status

Perfetto abbiamo installato il primo nodo ceph e anche il primo manager dell'infrastruttura.

Volete sapere di più? C'è anche un pannello web!

https://<IP>:8443/#/login

Le credenziali sono visibili dopo aver lanciato il comando "cephadm bootstrap".

Formattiamo un po di dischi!

Bene, ora non resta che formattare tutti i dischi che vogliamo aggiungere nel cluster. Accedere ad ogni macchina (anche la ceph manager se si vuole) e inizializzare i dischi.

ATTENZIONE al disco che state formattando! sdX è il disco o i dischi che volete usare nel cluster ceph, ma attenzione a NON formattare il disco del OS! (evitate in linea di massima sda o vda insomma)

wipefs -a /dev/sdX

Aggiungiamo gli host al cluster

Ora non resta che loggarsi di nuovo sulla macchina cephadm e aggiungere gli altri host, si consiglia di avere almeno 3 host totali, altrimenti non si potra avere un quorum importante per far funzionare il tutto.

Quindi scegliere almeno altre due macchine oltre a cephadm e dare (sostituire <NOMEHOST> e <IP> con quelli corretti)

ssh-copy-id -f -i /etc/ceph/ceph.pub root@<IP1>
ceph orch host label add <NOMEHOST1> <IP1> _admin
ssh-copy-id -f -i /etc/ceph/ceph.pub root@<IP2>
ceph orch host label add <NOMEHOST2> <IP2> _admin

Es: ceph orch host label add cephhost2 192.168.254.3 _admin

Aggiunti questi 2 host potete ora aggiungerne altri non per forza nel gruppo "_admin" ma per semplicità se avete pochi host il mio consiglio è metterli tutti nel gruppo admin per semplicità.

Controlliamo finchè lo status diventa "health: HEALTH_OK" (per uscire da watch ctrl+c)

watch ceph status

Fatto? Bene, ultimo passaggio per aggiungere i disci al cluster finalmente!

Aggiunta dischi al cluster

Per aggiungere dei dischi al cluster ci sono due modi, uno manuale e uno automatico. Vediamo quest'ultimo per semplicità.

Prima di tutto controlliamo tutti i schi disponibili su ogni macchina con il comando

ceph orch device ls

Questo comando vi da un elenco di tutti i dischi per ogni macchina del cluster. Verificare che quelli su YES sono i dischi che volete aggiungere, SE è tutto corretto, ora bastad dare

ceph orch apply osd --all-available-devices

FATTO! Davvero, fatto quetto quello che serve per aggiugere i dischi al cluster.

Volete agigungere solo alcuni dischi? Okay... ecco il comando per aggiungere un disco alla volta. Dove <nomehost> è la macchina e <device-path> è il percorso (es: /dev/sdb)

ceph orch daemon add osd <nomehost>:<device-path>

Es: ceph orch daemon add osd cephhost2:/dev/sdb

Aggiungiamo un cephfs

Ora non resta che creare il nostro primo filesystem di tipo cephfs. Al posto di <fs_name>

ceph fs volume create <fs_name>

Es: ceph fs volume create unlimitedpower

Fatto! Ora montiamo il disco in locale per comodità e per vedere se tutto funziona

mkdir /mnt/cephfs
mount -t ceph admin@.<fs_name>=/ /mnt/cephfs

Es: mount -t ceph admin@.unlimitedpower=/ /mnt/cephfs

Montare il disco cephfs direttamente usando il driver nel kernel permette di aumentare a dismisura la potenza di cephfs, ma diventa troppo lungo spiegare come fare a montare in remoto cephfs, per ora fatevi bastare il mount in locale.

Basta sapere che il mount:

CephFS da Kernel => Distribuisce il carico

Server NFS, iSCSI => Un solo server alla volta connesso

Aggiungiamo un server NFS

TODO: guida lunga vediamo con un prossimo post sul blog