O que é o Ceph?
O Ceph é uma solução de armazenamento distribuído e descentralizado que utiliza um conjunto de servidores interconectados para criar um sistema de armazenamento altamente disponível e tolerante a falhas. Dito isso, vamos ver a instalação passo a passo de um cluster Ceph!
Instale os pré-requisitos
A princípio, os pacotes necessários para a instalação do ceph serão somente dois. Entretanto, com o decorrer da instalação, vamos ter que instalar mais pacotes.
Configurando o cluster Ceph e seus nodes
1. Gerando e configurando uma chave ssh nos Controllers nodes
As chaves SSH são necessárias para a conexão sem senha dos nodes entre si. Para gerar uma chave SSH e um arquivo de configuração, execute esses comandos no seu terminal
Dentro do arquivo de configuração criado, vamos determinar os hosts e hostnames dos nossos nodes
Nota:
No seu terminal, faça a cópia da chave ssh do seu host aos outros nodes
Nota:
2. Instale o ceph em cada node
Para instalar o ceph em cada node de maneira mais rápida, podemos utilizar a linguagem bash no terminal
for NODE in controller1 controller2 controller3
do
ssh $NODE "apt update; apt -y install ceph ceph-common"
done
3. Configure o Monitor Daemon e o Maganer Daemon nos controllers nodes
Os monitores são responsáveis por manter e distribuir informações sobre o estado do cluster, já os managers são responsáveis por coletar, armazenar e forncecer informações sobre métricas e estatísticas do cluster.
Para configurar os monitores e managers, temos que criar um id específico e um arquivo de configuração para o cluster.
# comando para gerar um id para seu cluster
uuidgen
# crie um arquivo de configuração para o ceph
nano /etc/ceph/ceph.conf
Veja como deve ficar seu "ceph.conf"
Exemplo:
[global] fsid = {cluster uuid} mon initial members = {id1}, {id2}, {id2} mon host = {ip1}, {ip2}, {ip3} public network = {network range for your >public network} cluster network = {network range for your >cluster network} auth cluster required = cephx auth service required = cephx auth client required = cephx
4. Criando e importando as chaves para admin, monitor e bootstrap
Deve-se criar as "keyrings" para autenticação e permissão dos monitores, admin client e "bootstrap-osd". O comando "ceph-authtool" serve para manipular as "keyrings" de autenticação do ceph.
sudo ceph-authtool --create-keyring /etc/ceph/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
sudo ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd'
sudo ceph-authtool /etc/ceph/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
sudo ceph-authtool /etc/ceph/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
sudo chown ceph:ceph /etc/ceph/ceph.mon.keyring # Torna o usuário do ceph como o dono do arquivo "ceph.mon.keyring"
5. Crie um “monitor map” para os monitores se comunicarem e iniciando o monitor
É preciso ter um "mapa" para que os monitores possam se "enxergar", então iremos usar o comando "monmaptool" para criar esse "monitor map" e adicionar os monitores a esse mapa.
# Criando o mapa e adicionando os monitores
monmaptool --create --add {node1-id} {node1-ip} --fsid {cluster uuid} /etc/ceph/monmap
monmaptool --add {node2-id} {node2-ip} --fsid {cluster uuid} /etc/ceph/monmap
monmaptool --add {node3-id} {node3-ip} --fsid {cluster uuid} /etc/ceph/monmap
# Criando um diretório para armazenar os dados do monitor e incializando o monitor
sudo -u ceph mkdir /var/lib/ceph/mon/ceph-{node1-id}
sudo -u ceph ceph-mon --mkfs -i {node1-id} --monmap /etc/ceph/monmap --keyring /etc/ceph/ceph.mon.keyring
sudo systemctl start ceph-mon@{node1-id}
sudo systemctl enable ceph-mon@{node1-id}
# Ativando protocolos de comunicação e segurança para o cluster
sudo ceph mon enable-msgr2
ceph config set mon auth_allow_insecure_global_id_reclaim false
6. Criando um “manager” e habilitando o dashboard do ceph
Temos que criar credenciais de autenticação para o manager e garantir todas as permissões necessárias para ele
# Criando as credenciais e garantindo as permissões
sudo ceph auth get-or-create mgr.{node1-id} mon 'allow profile mgr' osd 'allow *' mds 'allow *'
sudo -u ceph mkdir /var/lib/ceph/mgr/ceph-{node1-id} # Copie a keyring que for 'printada' no seu terminal
sudo -u ceph nano /var/lib/ceph/mgr/ceph-{node1-id}/keyring # Cole a keyring que você copiou nesse arquivo
# Inicializando o manager
sudo systemctl start ceph-mgr@{node1-id}
sudo systemctl enable ceph-mgr@{node1-id}
# Instalando e habilitando o dashboard do ceph
apt -y install ceph-mgr-dashboard
sudo ceph mgr module enable dashboard
sudo ceph dashboard create-self-signed-cert
sudo nano passwd #coloque uma senha dentro desse arquivo
sudo ceph dashboard ac-user-create admin -i passwd administrator
7. Verificando o cluster via dashboard
No seu navegador, acesse o dashboard via ip do controller que você habilitou o dashboard
Nota: https://SEUIP:8443/ Usuário: admin Senha: "senha-que-você-adicionou-no-arquivo-passwd"
Adicionando mais nodes “controllers” ao seu cluster
1. Transferindo os arquivos necessários para os outros nodes
Para adicionar mais nodes com monitor e manager, não precisamos fazer todo esse procedimento novamente para cada node. Basta enviarmos os arquivos de configuração, keyrings e o "monmap" para algum outro node.
sudo scp /etc/ceph/ceph.conf {user}@{server}:/etc/ceph/
sudo scp /etc/ceph/ceph.client.admin.keyring {user}@{server}:/etc/ceph/
sudo scp /var/lib/ceph/bootstrap-osd/ceph.keyring {user}@{server}:/var/lib/ceph/bootstrap-osd/
sudo scp /etc/ceph/monmap {user}@{server}:/etc/ceph/
sudo scp /etc/ceph/ceph.mon.keyring {user}@{server}:/etc/ceph/ceph.mon.keyring
2. No seu “controller2”, assim como no “controller1”, habilite o monitor e aplique esses seguintes passos:
É necessário fazer alguns ajustes nos arquivos que nós acabamos de transferir para que o monitor seja reconhecido no cluster
# Mudando o dono da keyring do monitor, criando um diretório para armazenar os dados e inicializando os dados do monitor
sudo chown ceph:ceph /etc/ceph/ceph.mon.keyring
sudo -u ceph mkdir /var/lib/ceph/mon/ceph-{node2-id}
sudo -u ceph ceph-mon --mkfs -i {node2-id} --monmap /etc/ceph/monmap --keyring /etc/ceph/ceph.mon.keyring
# Inicializando os serviços do monitor
sudo systemctl start ceph-mon@{node2-id}
sudo systemctl enable ceph-mon@{node2-id}
# Habilitando o protocolo de comunicação no monitor
sudo ceph mon enable-msgr2
Criando OSDs para o cluster
1. Crie uma VM para servir como seu OSD e instale o ceph
É recomendado que você crie outra máquina virtual para "hostear" o seu OSD, já que é mais seguro e expande o seu cluster
2. Crie um disco específico para o OSD com o KVM
Para criar um OSD, é recomendado um disco com no mínimo 1 terabyte, porém, você pode criar um OSD com o tamanho que você quiser
# Crie o disco com esse comando
sudo qemu-img create -f qcow2 /var/lib/libvirt/images/novodisco.qcow2 30G
# Adicione o disco a sua VM (Você pode fazer essa adição manualmente pelo KVM)
sudo virsh attach-disk minhaVM --source /var/lib/libvirt/images/novodisco.qcow2 --target vdb --persistent
3. No seu controller, copie os arquivos de configuração e mande para o node de OSD
Para adicionar o OSD ao cluster, precisamos enviar o arquivo de configuração, keyrings, bootstrap e o monmap para a VM do OSD.
sudo scp /etc/ceph/ceph.conf {user}@{server}:/etc/ceph/
sudo scp /etc/ceph/ceph.client.admin.keyring {user}@{server}:/etc/ceph/
sudo scp /var/lib/ceph/bootstrap-osd/ceph.keyring {user}@{server}:/var/lib/ceph/bootstrap-osd/
sudo scp /etc/ceph/monmap {user}@{server}:/etc/ceph/
sudo scp /etc/ceph/ceph.mon.keyring {user}@{server}:/etc/ceph/ceph.mon.keyring
4. No node de OSD, prepare o disco e inicie o OSD
Precisamos preparar o disco para ser usado como OSD usando os seguintes comandos:
sudo ceph-volume lvm prepare --data /dev/sdb
sudo ceph-volume lvm activate {osd-number} {osd-uuid}
sudo systemctl enable ceph-osd@{osd-number}
Usando um Block Device no cluster
Um node de "block device" refere-se a um nó (ou servidor) no cluster que possui dispositivos de bloco anexados que são usados para armazenar dados. Esses dispositivos de bloco podem ser HDs ou SSDs que estão disponíveis no node e que são usados pelos demais componentes do Ceph, como OSDs, para armazenar os dados de maneira distribuída e replicada.
1. Criando um node "Ceph-Client"
Crie e configure uma VM nova para servir como um novo node “client” ao cluster. Depois, instale os pacotes necessários nessa VM.
2. Enviando os arquivos de um node pra outro
No seu controller, copie os arquivos de configuração e mande para o node “client”
sudo scp /etc/ceph/ceph.conf {user}@{server}:/etc/ceph/
sudo scp /etc/ceph/ceph.client.admin.keyring {user}@{server}:/etc/ceph/
sudo scp /var/lib/ceph/bootstrap-osd/ceph.keyring {user}@{server}:/var/lib/ceph/bootstrap-osd/
sudo scp /etc/ceph/monmap {user}@{server}:/etc/ceph/
sudo scp /etc/ceph/ceph.mon.keyring {user}@{server}:/etc/ceph/ceph.mon.keyring
3. Criando uma pool
No seu client, mude o dono da key do ceph e crie uma pool rbd (rados block device). No Ceph, uma "pool" é uma partição lógica para armazenar dados. A pool 'rbd' é usada para armazenar imagens de dispositivos de bloco.
chown ceph. /etc/ceph/ceph.*
ceph osd pool create rbd 64
ceph mgr module enable pg_autoscaler
ceph osd pool set rbd pg_autoscale_mode on
rbd pool init rbd
4. Crie um block device
O RBD fornece uma interface de dispositivo de bloco em disco. Quando você cria uma imagem RBD, ela é dividida em múltiplos objetos no pool. Isso significa que o RBD é mapeado para um ou mais objetos em um cluster de armazenamento Ceph, e os dados do dispositivo de bloco são distribuídos por todo o cluster. Isso facilita o redimensionamento, a migração e a replicação dos dados.
rbd create --size 10G --pool rbd rbd01
rbd ls -l
rbd map rbd01
rbd showmapped
mkfs.xfs /dev/rbd0
mount /dev/rbd0 /mnt
df -hT
Atenção: Para deletar o block device criado, siga esses passos: `bash
rbd unmap /dev/rbd/rbd/rbd01
rbd rm rbd01 -p rbd
ceph osd pool delete rbd rbd --yes-i-really-really-mean-it
`
Usando um File System no cluster
O Ceph File System (CephFS) é um sistema de arquivos distribuído compatível com POSIX que usa um Ceph Storage Cluster para armazenar seus dados. O CephFS é um serviço robusto e totalmente equipado com recursos como snapshots, quotas e capacidades de espelhamento multi-cluster. Os arquivos do CephFS são distribuídos em objetos armazenados pelo Ceph, proporcionando alta escala e desempenho. Os sistemas Linux podem montar sistemas de arquivos CephFS nativamente, via um cliente baseado em FUSE, ou via um gateway NFSv4.
1. No node “client”, instale o “ceph-fuse”
O "ceph-fuse" permite montar o CephFS em um node client para que ele possa acessar e interagir com o sistema de arquivos distribuído do cluster Ceph.
2. Configure o MDS (MetaData Server) em um node controller
O Metadata Server (MDS) é responsável por gerenciar os metadados do CephFS, como informações de diretórios, permissões e atributos.
mkdir -p /var/lib/ceph/mds/ceph-{node1-id}
ceph-authtool --create-keyring /var/lib/ceph/mds/ceph-node01/keyring --gen-key -n mds.{node1-id}
chown -R ceph. /var/lib/ceph/mds/ceph-{node1-id}
ceph auth add mds.{node1-id} osd "allow rwx" mds "allow" mon "allow profile mds" -i /var/lib/ceph/mds/ceph-{node1-id}/keyring
systemctl enable --now ceph-mds@{node1-id}
3. Crie 2 RADOS pools para Data e MetaData no node com MDS
Para o CephFS, você precisa criar duas pools, uma para armazenar os dados do sistema de arquivos (cephfs_data) e outra para armazenar os metadados (cephfs_metadata).
ceph osd pool create cephfs_data 16
ceph osd pool create cephfs_metadata 8
ceph fs new cephfs cephfs_metadata cephfs_data
ceph fs ls
ceph mds stat
ceph fs status cephfs
4. Monte uma partição CephFS no node Client
O comando ceph fs new cria um novo CephFS usando as duas pools criadas anteriormente para os metadados e os dados.
ceph-authtool -p /etc/ceph/ceph.client.admin.keyring > admin.key
chmod 600 admin.key
mount -t ceph node01.srv.world:6789:/ /mnt -o name=admin,secretfile=admin.key
df -hT
Configurando o Ceph Object Gateway
o Ceph Object Gateway é um serviço que fornece interfaces compatíveis com a API S3 e API Swift, permitindo que aplicativos e clientes acessem objetos armazenados no cluster Ceph como se fossem serviços de armazenamento de objetos independentes.
1. Em um node especifico para Object Gateway, instale o radosgw
O radosgw fornece uma interface de armazenamento de objetos compatível com a API S3 (Amazon Simple Storage Service) e a API Swift (OpenStack Object Storage).
2. No node “controller1”, configure o ceph.conf
Vamos definir o host do node onde o Object Gateway está sendo instalado e selecionar a porta "8080" para civetweb, que é uma opção de frontend web para o Object Gateway.
# adicione ao final
# client.rgw.(NomeDoNode)
[client.rgw.NomeDoNode]
# IP do Node
host = 10.0.0.31
# selecione a porta
rgw frontends = "civetweb port=8080"
3. Transfira os arquivos de configuração
scp /etc/ceph/ceph.conf {user}@{server}:/etc/ceph/ceph.conf
scp /etc/ceph/ceph.client.admin.keyring {user}@{server}:/etc/ceph/
4. Configure o RADOSGW
Criando uma chave de autenticação específica para o client do Object Gateway e configurando os diretórios e permissões necessários.
ssh {user}@{server-do-RADOS-GW} \
"mkdir -p /var/lib/ceph/radosgw/ceph-rgw.$NomeDoNode; \
ceph auth get-or-create client.rgw.$NomeDoNode osd 'allow rwx' mon 'allow rw' -o /var/lib/ceph/radosgw/ceph-rgw.$NomeDoNode/keyring; \
chown ceph. /etc/ceph/ceph.*; \
chown -R ceph. /var/lib/ceph/radosgw; \
systemctl enable --now ceph-radosgw@rgw.$NomeDoNode"
5. Reinicie os nodes “controller1” e o node de radosgw
É recomendado reiniciar os nodes "controller1" e o node onde o Object Gateway foi configurado para garantir que todas as alterações de configuração entrem em vigor.
6. Verifique o status do RADOSGW
Acesse a interface através de uma chamada HTTP usando o "curl".
curl IPdoNode:8080
# Saída esperada:
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
7. No node de object gateway, crie um usuário
Crie um usuário específico para o Object Gateway. Isso permitirá que você acesse o Object Gateway e armazene objetos usando a API S3.
# por exemplo, crie um usuário [tiex]
radosgw-admin user create --uid=tiex --display-name="Tiex"
# lista de usuários
radosgw-admin user list
# informação de usuário
radosgw-admin user info --uid=tiex
8. Use o script de teste em Python para verificar o acesso à interface S3
O script cria um bucket, lista os buckets existentes, remove o bucket criado e verifica o acesso bem-sucedido à interface S3.
# Instale o boto3
apt -y install python3-boto3
# crie o arquivo do script
nano s3_teste.py
# copie e cole no script
import sys
import boto3
from botocore.config import Config
# user's access-key and secret-key you added on [2] section
session = boto3.session.Session(
aws_access_key_id = '{access_key_idDoUsuario}',
aws_secret_access_key = '{secret_access_keyDoUsuario}'
)
# Object Gateway URL
s3client = session.client(
's3',
endpoint_url = 'http://10.0.0.31:8080',
config = Config()
)
# create [my-new-bucket]
bucket = s3client.create_bucket(Bucket = 'my-new-bucket')
# list Buckets
print(s3client.list_buckets())
# remove [my-new-bucket]
s3client.delete_bucket(Bucket = 'my-new-bucket')
# execute o script
python3 s3_teste.py
Instale o NFS-Ganesha
O NFS-Ganesha oferece a capacidade de compartilhar o CephFS com outros nodes na rede usando o protocolo NFS, permitindo que o CephFS seja acessado e usado como um sistema de arquivos compartilhado.
1. Instale e configure o NFS-Ganesha no node com CephFS
O NFS-Ganesha é um servidor NFS de usuário no espaço do usuário que suporta vários sistemas de arquivos back-end, incluindo o CephFS. Isso permitirá que você monte o CephFS usando o protocolo NFS.
apt -y install nfs-ganesha-ceph
mv /etc/ganesha/ganesha.conf /etc/ganesha/ganesha.conf.org
# Configurando o NFS-Ganesha para montar o CephFS usando o protocolo NFSv4.
nano /etc/ganesha/ganesha.conf
# copie e cole
NFS_CORE_PARAM {
# desativa NLM
Enable_NLM = false;
# desativa RQUOTA (não suportado no CephFS)
Enable_RQUOTA = false;
# protocolo NFS
Protocols = 4;
}
EXPORT_DEFAULTS {
# acesso padrao
Access_Type = RW;
}
EXPORT {
# ID unico
Export_Id = 101;
# monta o caminho para CephFS
Path = "/";
FSAL {
name = CEPH;
# hostname ou IP do Node
hostname="10.0.0.51";
}
# setando root Squash
Squash="No_root_squash";
# NFSv4 Pseudo caminho
Pseudo="/vfs_ceph";
# permitindo opções de segurança
SecType = "sys";
}
LOG {
# log level padrao
Default_Log_Level = WARN;
}
systemctl restart nfs-ganesha
2. Verifique a montagem do NFS no node “Client” do ceph.
Vamos verificar se foi bem-sucedida a montagem do CephFS no node Client usando o protocolo NFSv4.
Configurando ISCSI no ceph
O iSCSI (Internet Small Computer System Interface) é um protocolo que permite o uso da infraestrutura de rede TCP/IP para transporte de dados SCSI entre um servidor iSCSI (initiator) e um dispositivo de armazenamento (target). No contexto de Ceph, o iSCSI é usado para fornecer acesso a blocos de armazenamento do Ceph através de uma rede usando o protocolo iSCSI.
1. Crie uma pool para o iscsi
Pool no Ceph para armazenar as imagens do iSCSI.
2. Altere o arquivo de configuração do ceph
nano /etc/ceph/ceph.conf
# copie e cole
[global]
fsid = 9ea8b268-15fb-4f20-a6df-b40ded1eab11
mon initial members = controller1, controller2, controller3
mon host = 10.0.0.51, 10.0.0.52, 10.0.0.53
public network = 172.25.12.0/13
cluster network = 10.0.0.0/24
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
[osd]
osd heartbeat grace = 20
osd heartbeat interval = 5
osd client watch timeout = 15
# client.rgw.(Node Name)
[client.rgw.ceph-radosgw]
# IP address of the Node
host = 10.0.0.31
# set listening port
rgw frontends = "civetweb port=8080"
3. Instale os seguintes pacotes em todos os nodes que terão o ISCSI
Esses pacotes são necessários para configurar o ISCSI.
4. Configure o arquivo de configuração do ISCSI
nano /etc/ceph/iscsi-gateway.cfg
# copie e cole
[config]
cluster_name = ceph
gateway_keyring = ceph.client.admin.keyring
pool = iscsi
api_secure = false
#api_user = admin
#api_password = admin
#api_port = 5001
trusted_ip_list = 10.0.0.51,10.0.0.52,10.0.0.53,10.0.0.31,10.0.0.30,10.0.0.61,10.0.0.62,10.0.0.63,10.0.0.64,10.0.0.65,10.0.0.66,10.0.0.67,10.0.0.68,10.0.0.69
5. Reinicie os serviços do debian e habilite o serviço do gateway para iscsi
systemctl daemon-reload
systemctl enable rbd-target-gw
# lista a "blacklist"
ceph osd blacklist ls
# remove tudo da "blacklist"
ceph osd blacklist clear
systemctl enable rbd-target-api
systemctl start rbd-target-api
6. Adicionando os gateways ao cluster
sudo ceph dashboard set-iscsi-api-ssl-verification false
# lista os iscsi gateways existentes no cluster
sudo ceph dashboard iscsi-gateway-list
# crie um arquivo para cada iscsi gateway
micro gw1
micro gw2
micro gw3
# copie e cole nos arquivos criados
http://admin:admin@IPdoNode:5000
# adicione os gateways ao dashboard
sudo ceph dashboard iscsi-gateway-add -i gw1
sudo ceph dashboard iscsi-gateway-add -i gw2
sudo ceph dashboard iscsi-gateway-add -i gw3
Licença
Desenvolvido pela equipe Tiex
Autores: Eduardo Vasconcelos
Data de criação: 20/06/2023