Skip to main content

Tutorial: Configurando Ceph como Backend de Storage para Incus

Este tutorial detalha o processo de instalação e configuração de um cluster Ceph para ser utilizado como um backend de armazenamento compartilhado por um cluster Incus. Para mais informações em geral, acesse a documentação do Ceph aqui.

Instalação dos Pacotes Essenciais

O primeiro passo é garantir que todos os nós que farão parte do cluster Ceph (incluindo o nó de bootstrap) tenham os pacotes necessários. Em todos os nós do futuro cluster Ceph, execute:

sudo apt update && sudo apt install -y cephadm podman lvm2

Cephadm é a ferramenta de orquestração que simplifica a instalação e o gerenciamento de um cluster Ceph, utilizando contêineres, sendo o recomendado pela documentação oficial para deplay (leia mais aqui); Podman é o runtime de contêineres que o cephadm utiliza para executar os daemons (serviços) do Ceph; Lvm2 é o conjunto de ferramentas para gerenciar o LVM (Logical Volume Manager), necessário se você optar por usar partições em vez de um disco completo para o Ceph.

Preparando os Discos para os OSDs

Um OSD (Object Storage Daemon) é o processo do Ceph que armazena os dados e gerencia a replicação e recuperação. Cada disco ou partição de dados precisa ser preparado para recebe-los. Apesar de por padão o Ceph aceitar apenas discos físicos (ex: /dev/sda) é possível criar uma abstração por meio de volumes lógicos para "enganar" o Ceph.

Alternativa A: Usando LVM em uma Partição

Este método é ideal quando você quer usar apenas uma parte de um disco, permitindo maior flexibilidade. Apesar disso, o LVM cria uma camada adicional entre o sistema operacional (e o Ceph) e o disco físico. Dessa forma, o desempenho certamente será inferior em comparação com a forma padrão. Execute os seguintes comandos em cada nó do futuro cluster que usará uma partição específica.

Limpe completamente a partição para remover sistemas de arquivos ou metadados antigos. Isso previne erros durante a criação do OSD. Execute estes comandos em cada nó do futuro cluster, ajustando o nome da partição (ex: /dev/sdb2):

sudo wipefs -a <Caminho Partição>
sudo dd if=/dev/zero of=<Caminho Partição> bs=1M count=10

Inicialize a partição como um Physical Volume (PV) para que o LVM possa gerenciá-la:

sudo pvcreate <Caminho Partição>

Crie um Volume Group (VG), um agrupamento de PVs. Usar o hostname no nome. Ajuda a identificar facilmente a qual nó o VG pertence:

sudo vgcreate ceph_vg_<Nome Host> <Caminho Partição>

Crie um Logical Volume (LV) que ocupa todo o espaço livre no VG. É neste volume lógico que o OSD será efetivamente criado:

sudo lvcreate -l 100%FREE -n osd_lv ceph_vg_<Nome Host>

Alternativa B: Usando um Disco Inteiro (Abordagem Simples)

Se você tem um disco inteiro (ex: /dev/sdb) dedicado para o Ceph em cada nó, o processo é mais direto. Você só precisa garantir que ele esteja limpo.

Limpe o disco para garantir que sistemas de arquivos ou metadados antigos sejam removidos, previnindo erros durante a criação do OSD:

sudo wipefs -a <Caminho Disco>
sudo dd if=/dev/zero of=/dev/sdb bs=1M count=10

Criando e Configurando o Cluster Ceph

As operações a seguir devem ser executadas a partir de um único nó, que será o nó de bootstrap. Este nó irá gerenciar a configuração inicial e a adição de outros nós (leia mais aqui). Este comando inicializa o cluster, criando o primeiro nó Monitor e o Manager. Substitua o IP, porta, o usuário e a senha do dashboard conforme sua necessidade:

sudo cephadm bootstrap --mon-ip <IP Boostrap> \
--cluster-network <Rede>/<Máscara> \
--initial-dashboard-user <Usuário> \
--initial-dashboard-password <Senha> \
--ssl-dashboard-port <Porta>

Por que esses parâmetros?

  • --mon-ip: Define o IP do nó que hospedará o primeiro Monitor (MON), o cérebro do cluster.
  • --cluster-network: Especifica a sub-rede que o Ceph usará para tráfego interno, como replicação de dados. É crucial caso você tenha mais de uma rede conectada ao seu cluster.
  • --initial-dashboard-user e --initial-dashboard-password: Criam as credenciais de acesso para o Dashboard web do Ceph, uma ferramenta poderosa para monitorar e gerenciar o cluster.
  • --ssl-dashboard-port: Define a porta que o Dashboard será acessado. Essa é configuração é importante pois ele pode atribuir a porta 8443 (HTTPS) que já é utilziada pelo Incus, e conforme observamos, pode haver conflito entre os dois serviços. Você pode colocar na porta 9443 ou e alguma que lhe convier.

A presença de um Dashboard não é obrigatória. Caso assim queira, rode o seguinte comando no lugar do anterior:

sudo cephadm bootstrap --mon-ip <IP Boostrap> --cluster-network <Rede/Máscara> --skip-dashboard

Exitem diversos outros parâmetros que podem ser utlizados em combinação com os anteriores e que podem fazer sentido para você. Para saber mais execute o comando cephadm bootstrap -h.

Adicionando os Outros Nós ao Cluster Ceph

Após o bootstrap, adicione os demais nós para que o cephadm possa gerenciá-los. Porém, observe que ele irá criar um par de chaves SSH (em /etc/ceph) que será utilizado para acessar os demais nós e adicioná-los ao cluster. Como o acesso dever ser feito do usuário root do bootstrap para os usuários root dos demais nós, você deve configurar de tal forma que esse acesso SSH ocorra sem a necessidade de senha (Clique aqui para saber mais).

Execute a partir do nó de bootstrap para cada nó adicional. O comando cephadm shell entra em um contêiner com todas as ferramentas do Ceph:

sudo cephadm shell -- ceph orch host add <Nome Host2> <IP Host2> --labels _admin
sudo cephadm shell -- ceph orch host add <Nome Host3> <IP Host3> --labels _admin

Por que --labels _admin? A label _admin informa ao cephadm que este nó deve ter uma cópia do arquivo de configuração (ceph.conf) e do chaveiro de administração (ceph.client.admin.keyring). Isso permite que você execute comandos ceph de qualquer um desses nós.

Criando os OSDs (Daemons de Armazenamento)

Com os discos preparados e os nós adicionados, podemos instruir o Ceph a criar os OSDs.

Se você usou LVM (Alternativa A): Estes comandos instruem o Ceph a criar um OSD em cada nó, usando o LV que preparamos. Execute no nó de bootstrap.

sudo cephadm shell -- ceph orch daemon add osd <Nome Host1>:/dev/ceph_vg_<Nome Host1>/osd_lv
sudo cephadm shell -- ceph orch daemon add osd <Nome Host2>:/dev/ceph_vg_<Nome Host2>/osd_lv
sudo cephadm shell -- ceph orch daemon add osd <Nome Host3>:/dev/ceph_vg_<Nome Host3>/osd_lv

Se você usou Discos Inteiros (Alternativa B): Este é o método mais automatizado. O Ceph irá procurar e usar quaisquer discos disponíveis que não contenham dados. Este comando verifica todos os discos "disponíveis" em todos os nós gerenciados e cria OSDs neles.

ceph cephadm shell -- orch daemon add osd <Nome Host1>:<Caminho Disco>
ceph cephadm shell -- orch daemon add osd <Nome Host2>:<Caminho Disco>
ceph cephadm shell -- orch daemon add osd <Nome Host3>:<Caminho Disco>

Para mais informações sobre o OSD, leia mais aqui.

Criando um Pool de Armazenamento

Um "pool" é uma partição lógica no cluster Ceph onde você armazenará dados. O Incus usará um pool para armazenar imagens e volumes de instâncias.

Crie um pool executando:

sudo cephadm shell -- ceph osd pool create <Nome Pool>

Inicialize o pool para uso com RBD (RADOS Block Device). Isso o habilita para armazenar os volumes que o Incus irá criar:

sudo cephadm shell -- rbd pool init -p <Nome Pool>

Para saber mais sobre Pools do Ceph clique aqui.

Adicionando Storage aos Nós do Cluster Incus

Execute os seguintes comando em qualquer nó Incus:

incus storage create remote-ceph ceph --target <Nome Incus Host1>
incus storage create remote-ceph ceph --target <Nome Incus Host2>
incus storage create remote-ceph ceph --target <Nome Incus Host3>

Integrando o Ceph com o Incus

Finalmente, vamos configurar o Incus para usar o cluster Ceph recém-criado:

incus storage create <Nome Storage> ceph ceph.osd.data_pool_name=<Nome Pool>

Após este passo, seu cluster Incus está pronto para usar o Ceph. Você pode definir este novo pool como o padrão ou usá-lo ao criar novos contêineres e VMs.