Pesquisa de site

Configurando GlusterFS no Ubuntu 22.04 com Heketi


GlusterFS é um software de código aberto desenvolvido pela Gluster Inc e atualmente mantido pela Redhat. Ele é usado para fornecer interfaces de armazenamento de objetos, blocos e arquivos. Ele fornece armazenamento acessível e flexível para dados não estruturados e é frequentemente usado em cargas de trabalho com alto uso de dados, que incluem streaming de mídia de armazenamento em nuvem e CDN. Ele pode ser implantado no local ou na nuvem e oferece suporte a inúmeros protocolos que incluem NFS, SMB, CIFS, HTTP e FTP

Heketi pode ser usado para gerenciar o ciclo de vida dos volumes Gluster Storage, fornecendo uma interface de gerenciamento RESTful. Isso facilita a integração do GlusterFS com serviços em nuvem como Kubernetes, OpenStack Manila e OpenShift para o provisionamento dinâmico de volumes. Heketi determina automaticamente a localização dos blocos no cluster, colocando-os e suas réplicas em diferentes domínios de falha. Ele também oferece suporte a inúmeros clusters GlusterFS, tornando possível fornecer armazenamento de arquivos em rede sem limitação de um único cluster GlusterFS. Geralmente, o Heketi torna mais fácil para o administrador do sistema gerenciar ou configurar blocos, discos ou pools de armazenamento confiáveis. Este serviço gerencia todo o hardware do administrador possibilitando a localização do armazenamento sob demanda.

Hoje aprenderemos como configurar GlusterFS no Ubuntu 22.04 com Heketi

Começando

Para este guia, teremos um ambiente configurado conforme mostrado:

  • 3 servidores Ubuntu 22.04 para GlusterFS
  • Cada servidor possui 3 discos secundários de 10 GB conectados
  • acesso sudo
  • Heketi será configurado em um dos servidores

A resolução DNS pode ser configurada em /etc/hosts em cada servidor para quem não possui um servidor DNS

$ sudo vim /etc/hosts
192.168.200.90 gluster01.computingforgeeks.com  gluster01
192.168.200.91 gluster02.computingforgeeks.com  gluster02
192.168.200.92  gluster03.computingforgeeks.com  gluster03

1. Configure a sincronização de horário NTP

Antes de começarmos, é importante que a hora em todos os 3 servidores esteja sincronizada. Isso pode ser feito usando Network Time Protocol (NTP) ou o daemon Chrony.

Para conseguir isso, certifique-se de que o Chrony esteja instalado:

sudo apt -y install chrony

Inicie e ative o serviço:

sudo systemctl enable --now chronyd

Defina o fuso horário em todos os 3 servidores:

sudo timedatectl set-timezone Africa/Nairobi --adjust-system-clock
sudo timedatectl set-ntp yes

Verifique as alterações:

$ timedatectl 
               Local time: J5 2023-06-14 14:44:50 EAT
           Universal time: J5 2023-06-14 11:44:50 UTC
                 RTC time: J5 2023-06-14 11:44:50
                Time zone: Africa/Nairobi (EAT, +0300)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

2. Instale GlusterFS no Ubuntu 22.04

GlusterFS existe nos repositórios padrão do Ubuntu 22.04. Isso torna a instalação muito fácil. Para instalar o GlusterFS no Ubuntu 22.04, execute o comando abaixo:

sudo apt install glusterfs-server

Depois de instalado, certifique-se de que o serviço foi iniciado e habilitado:

sudo systemctl enable --now glusterd

Veja o status do serviço:

$ systemctl status glusterd
● glusterd.service - GlusterFS, a clustered file-system server
     Loaded: loaded (/lib/systemd/system/glusterd.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-06-14 14:46:22 EAT; 4s ago
       Docs: man:glusterd(8)
    Process: 14472 ExecStart=/usr/sbin/glusterd -p /var/run/glusterd.pid --log-level $LOG_LEV>
   Main PID: 14473 (glusterd)
      Tasks: 9 (limit: 4617)
     Memory: 11.0M
        CPU: 1.481s
     CGroup: /system.slice/glusterd.service
             └─14473 /usr/sbin/glusterd -p /var/run/glusterd.pid --log-level INFO

Jun 14 14:46:21 gluster01.computingforgeeks.com systemd[1]: Starting GlusterFS,

Se você tiver um firewall habilitado, permita o serviço através dele:

sudo ufw allow 24007/tcp

Assim que a instalação estiver concluída em todos os três nós, testaremos outros nós no cluster. Forme um nó gluster01 digamos, execute os comandos abaixo:

# Perform on Node 01
sudo gluster peer probe gluster02
sudo gluster peer probe gluster03

Veja o status:

sudo gluster peer status

Saída de amostra:

3. Instale o Heketi no Ubuntu 22.04

Conforme afirmado anteriormente, o Heketi será instalado em apenas um nó do cluster. Para este guia, iremos instalá-lo em gluster01. Baixe a versão mais recente do Heketi na página de lançamentos do GitHub.

Você também pode extrair o binário com o comando:

wget https://github.com/heketi/heketi/releases/download/v10.4.0/heketi-v10.4.0-release-10.linux.amd64.tar.gz

Extraia o arquivo:

for i in `ls | grep heketi | grep .tar.gz`; do tar xvf $i; done

Copie os binários extraídos para o seu PATH:

sudo cp heketi/{heketi,heketi-cli} /usr/local/bin

Agora verifique a instalação:

$ heketi --version
Heketi v10.4.0-release-10 (using go: go1.15.14)

$ heketi-cli --version
heketi-cli v10.4.0-release-10

4. Configure o Heketi no Ubuntu 22.04

Existem várias configurações que precisamos fazer antes que o Heketi possa ser usado. Primeiro, crie um usuário dedicado para Heketi:

sudo groupadd --system heketi
sudo useradd -s /sbin/nologin --system -g heketi heketi

Em seguida, prossiga e crie configurações e caminhos de dados para Heketi:

sudo mkdir -p /var/lib/heketi /etc/heketi /var/log/heketi
sudo cp heketi/heketi.json /etc/heketi

Agora podemos modificar o arquivo de configuração criado conforme desejado:

sudo vim /etc/heketi/heketi.json

No arquivo, existem diversas variáveis que podem ser modificadas, incluindo:

##Set service port##
"port": "8080"

##Set admin and use secrets##
"_jwt": "Private keys for access",
  "jwt": {
    "_admin": "Admin has access to all APIs",
    "admin": {
      "key": "jvd7df8RN7QNeKV1"
    },
    "_user": "User only has access to /volumes endpoint",
    "user": {
      "key": "lMPgdZ8NtFNj6jgk"
    }
  },

##Configure glusterfs executor##
_sshexec_comment": "SSH username and private key file information",
    "sshexec": {
      "keyfile": "/etc/heketi/heketi_key",
      "user": "root",
      "port": "22",
      "fstab": "/etc/fstab",
......
},

##database path settings
"_db_comment": "Database file name",
    "db": "/var/lib/heketi/heketi.db",
....
},

Também no arquivo, comente as linhas abaixo adicionando (_) conforme mostrado:

    "_sshexec_comment": "SSH username and private key file information",
....
      "_xfs_sw": "Optional: Specify number of data disks in the underlying RAID device",
      "_xfs_su": "Optional: Specifies a stripe unit or RAID chunk size.",
      "_gluster_cli_timeout": "Optional: Timeout, in seconds, passed to the gluster cli invocations",
      "_debug_umount_failures": "Optional: boolean to capture more details in case brick unmounting fails",

    "_kubeexec_comment": "Kubernetes configuration",
      "_xfs_sw": "Optional: Specify number of data disks in the underlying RAID device.",
      "_xfs_su": "Optional: Specifies a stripe unit or RAID chunk size.",
      "_gluster_cli_timeout": "Optional: Timeout, in seconds, passed to the gluster cli invocations",
      "_debug_umount_failures": "Optional: boolean to capture more details in case brick unmounting fails",
.....

Se você usar um usuário SSH diferente de root, certifique-se de ter configurado sem senha para sudo. Depois que as alterações desejadas forem feitas, salve o arquivo e gere as chaves SSH para o usuário fornecido, por exemplo, root:

sudo -i
ssh-keygen -f /etc/heketi/heketi_key -t rsa -N ''
chown heketi:heketi /etc/heketi/heketi_key*

Primeiro, certifique-se de que o login root seja permitido em todos os 3 servidores se estiver usando root como usuário:

$ vim /etc/ssh/sshd_config
PermitRootLogin yes

Reinicie o serviço:

sudo systemctl restart sshd

Copie a chave pública criada para todos os outros nós do GlusterFS usando o comando:

for i in gluster01 gluster02 gluster03; do
 ssh-copy-id -i /etc/heketi/heketi_key.pub root@$i
done

Verifique o acesso aos nós GlusterFS de gluster01 com a chave privada:

root@gluster01:~# ssh -i /etc/heketi/heketi_key root@gluster02
Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.19.0-41-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

460 updates can be applied immediately.
255 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable

Last login: Wed Jun 14 17:10:36 2023 from 192.168.200.90
root@gluster02:~# exit

Isso mostra que as chaves SSH estão funcionando conforme desejado. Saia da sessão e prossiga com as configurações abaixo.

Crie um arquivo de serviço para Heketi:

sudo vim /etc/systemd/system/heketi.service

Adicione estas linhas ao arquivo:

[Unit]
Description=Heketi Server

[Service]
Type=simple
WorkingDirectory=/var/lib/heketi
EnvironmentFile=-/etc/heketi/heketi.env
User=heketi
ExecStart=/usr/local/bin/heketi --config=/etc/heketi/heketi.json
Restart=on-failure
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

Salve o arquivo e baixe um arquivo de ambiente:

sudo wget -O /etc/heketi/heketi.env https://raw.githubusercontent.com/heketi/heketi/master/extras/systemd/heketi.env

Atribua todas as permissões necessárias ao usuário Heketi:

sudo chown -R heketi:heketi /var/lib/heketi /var/log/heketi /etc/heketi

Carregue todos os módulos do Kernel exigidos pelo Heketi:

for i in dm_snapshot dm_mirror dm_thin_pool; do
  sudo modprobe $i
done

Recarregue o daemon e inicie o serviço:

sudo systemctl daemon-reload
sudo systemctl enable --now heketi

Verifique se o serviço está ativo:

$ systemctl status heketi
● heketi.service - Heketi Server
     Loaded: loaded (/etc/systemd/system/heketi.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-06-14 17:48:36 EAT; 4s ago
   Main PID: 4545 (heketi)
      Tasks: 7 (limit: 4617)
     Memory: 5.7M
        CPU: 16ms
     CGroup: /system.slice/heketi.service
             └─4545 /usr/local/bin/heketi --config=/etc/heketi/heketi.json

Jun 14 17:48:36 gluster01.computingforgeeks.com heketi[4545]: Heketi v10.4.0-release-10 (using go: go1.15.14)
Jun 14 17:48:36 gluster01.computingforgeeks.com heketi[4545]: [heketi] INFO 2023/06/14 17:48:36 Loaded mock executor
....
Jun 14 17:48:36 gluster01.computingforgeeks.com heketi[4545]: Listening on port 8080

5. Crie o arquivo de topologia Heketi

Para este guia, usaremos scripts Ansible para gerar e manter o arquivo de topologia Heketi, pois editar o arquivo JSON manualmente pode ser cansativo.

Para facilitar, instale o Ansible no seu sistema:

sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible

Em seguida, crie uma pasta de projeto:

mkdir -p ~/projects/ansible/roles/heketi/{tasks,templates,defaults}

Agora crie o modelo para o arquivo de Topologia:

$ vim ~/projects/ansible/roles/heketi/templates/topology.json.j2
{
  "clusters": [
    {
      "nodes": [
      {% if gluster_servers is defined and gluster_servers is iterable %}
      {% for item in gluster_servers %}
        {
          "node": {
            "hostnames": {
              "manage": [
                "{{ item.servername }}"
              ],
              "storage": [
                "{{ item.serverip }}"
              ]
            },
            "zone": {{ item.zone }}
          },
          "devices": [
            "{{ item.disks | list | join ("\",\"") }}"
          ]
        }{% if not loop.last %},{% endif %}
    {% endfor %}
    {% endif %}
      ]
    }
  ]
}

Salve este arquivo e crie um arquivo de variáveis que corresponda aos valores definidos:

vim ~/projects/ansible/roles/heketi/defaults/main.yml

Adicione as linhas abaixo, substituindo corretamente quando necessário:

---
# GlusterFS nodes
gluster_servers:
  - servername: gluster01
    serverip: 192.168.200.90
    zone: 1
    disks:
      - /dev/sdb
      - /dev/sdc
      - /dev/sdd
  - servername: gluster02
    serverip: 192.168.200.91
    zone: 1
    disks:
      - /dev/sdb
      - /dev/sdc
      - /dev/sdd
  - servername: gluster03
    serverip: 192.168.200.92
    zone: 1
    disks:
      - /dev/sdb
      - /dev/sdc
      - /dev/sdd

Crie uma tarefa Ansible:

vim ~/projects/ansible/roles/heketi/tasks/main.yml

No arquivo, forneça o conteúdo abaixo:

---
- name: Copy heketi topology file
  template:
    src: topology.json.j2
    dest: /etc/heketi/topology.json

- name: Set proper file ownership
  file:
   path:  /etc/heketi/topology.json
   owner: heketi
   group: heketi

Crie o arquivo do manual do Ansible:

vim ~/projects/ansible/heketi.yml

Adicione estas linhas ao arquivo:

---
- name: Generate Heketi topology file and copy to Heketi Server
  hosts: gluster01
  become: yes
  become_method: sudo
  roles:
    - heketi

Crie o arquivo hosts:

$ vim ~/projects/ansible/hosts
gluster01

Navegue até o diretório:

cd ~/projects/ansible

Veja tudo o que foi criado:

$ tree
.
├── heketi.yml
├── hosts
└── roles
    └── heketi
        ├── defaults
        │   └── main.yml
        ├── tasks
        │   └── main.yml
        └── templates
            └── topology.json.j2

5 directories, 5 files

Agora execute o playbook Ansible usando o comando:s

ansible-playbook -i hosts --user myuser --ask-pass --ask-become-pass heketi.yml

Como alternativa, você pode usar o usuário root ou o usuário sudo sem senha com o comando:

ansible-playbook -i hosts --user myuser heketi.yml

Saída de amostra:

Agora você terá um arquivo de topologia gerado conforme mostrado:

$ cat /etc/heketi/topology.json 
{
  "clusters": [
    {
      "nodes": [
                    {
          "node": {
            "hostnames": {
              "manage": [
                "gluster01"
              ],
              "storage": [
                "192.168.200.90"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb","/dev/sdc","/dev/sdd"
          ]
        },            {
          "node": {
            "hostnames": {
              "manage": [
                "gluster02"
              ],
              "storage": [
                "192.168.200.91"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb","/dev/sdc","/dev/sdd"
          ]
        },            {
          "node": {
            "hostnames": {
              "manage": [
                "gluster03"
              ],
              "storage": [
                "192.168.200.92"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb","/dev/sdc","/dev/sdd"
          ]
        }              ]
    }
  ]
}

6. Carregue o arquivo de topologia Heketi

Depois que o arquivo de topologia for criado com as etapas acima, podemos carregá-lo e usá-lo no Heketi. Para carregá-lo usando o CI, execute o comando com a sintaxe abaixo

heketi-cli topology load --user admin --secret <heketi_admin_secret> --json=/etc/heketi/topology.json

Substitua o heketi_admin_secret, por exemplo:

heketi-cli topology load --user admin --secret jvd7df8RN7QNeKV1 --json=/etc/heketi/topology.json

Saída de amostra:

Agora exporte as variáveis:

$ vim ~/.bashrc
export HEKETI_CLI_SERVER=http://heketiserverip:8080
export HEKETI_CLI_USER=admin
export HEKETI_CLI_KEY="Adminsecret"

Fonte do perfil:

source ~/.bashrc

Agora visualize o cluster:

$ heketi-cli cluster list
Clusters:
Id:e36f3593c6abde17ff69665043765e17 [file][block]

Mostre os nós disponíveis:

$ heketi-cli node list
Id:111dcab88510035789f3551a359e27fe	Cluster:e36f3593c6abde17ff69665043765e17
Id:3649b21cb354e55c3588868ddfa7ff92	Cluster:e36f3593c6abde17ff69665043765e17
Id:b9dbcd4773319d28e3f265d6ab6b52b6	Cluster:e36f3593c6abde17ff69665043765e17

Você também pode usar o comando abaixo para visualizar os nós:

$ sudo gluster pool list
UUID					Hostname 	State
44c4384a-313b-4726-87c7-89622250ab83	gluster02	Connected 
d1f8f291-f2cd-4a8b-8b26-91243d192ecf	gluster03	Connected 
d1f8f291-f2cd-4a8b-8b26-91243d192ece	localhost	Connected 

Veja mais detalhes do cluster

heketi-cli node info <NODE_ID>

Por exemplo:

$ heketi-cli node info 111dcab88510035789f3551a359e27fe
Node Id: 111dcab88510035789f3551a359e27fe
State: online
Cluster Id: e36f3593c6abde17ff69665043765e17
Zone: 1
Management Hostname: gluster03
Storage Hostname: 192.168.200.92
Devices:
Id:1072f75242b8f7cd32d450344c2bf9b4   Name:/dev/sdd            State:online    Size (GiB):500     Used (GiB):0       Free (GiB):500     Bricks:0       
Id:49e832b9834ec185b21960f411891292   Name:/dev/sdc            State:online    Size (GiB):500     Used (GiB):0       Free (GiB):500     Bricks:0       
Id:a8aca352fb2d742e9bda4d04e48877a9   Name:/dev/sdb            State:online    Size (GiB):500     Used (GiB):0       Free (GiB):500     Bricks:0    

Para verificar se os volumes Gluster estão funcionando conforme desejado, usaremos Heketi para criar um volume:

# heketi-cli volume create --size=1
Name: vol_e3791aa3f720f8e1e50c3d433326030f
Size: 1
Volume Id: e3791aa3f720f8e1e50c3d433326030f
Cluster Id: e36f3593c6abde17ff69665043765e17
Mount: 192.168.200.92:vol_e3791aa3f720f8e1e50c3d433326030f
Mount Options: backup-volfile-servers=192.168.200.91,192.168.200.90
Block: false
Free Size: 0
Reserved Size: 0
Block Hosting Restriction: (none)
Block Volumes: []
Durability Type: replicate
Distribute Count: 1
Replica Count: 3

Veja o volume criado:

# heketi-cli volume list
Id:e3791aa3f720f8e1e50c3d433326030f    Cluster:e36f3593c6abde17ff69665043765e17    Name:vol_e3791aa3f720f8e1e50c3d433326030f

Para visualizar a topologia, execute:

heketi-cli topology info

Agora o brinquedo pode prosseguir e usar o GlusterFS conforme desejado. Para integrá-lo ao Kubernetes, siga o auxílio fornecido aqui:

  • Configure o provisionamento de volume dinâmico do Kubernetes com Heketi e GlusterFS

Existem muitos outros casos de uso, fique à vontade para explorá-los. Espero que este guia tenha sido significativo para você.

Ver mais:

  • Configure o armazenamento GlusterFS com Heketi no CentOS
  • Provisionamento de volume dinâmico Kubernetes e OpenShift com GlusterFS e Heketi
  • Como criar e excluir volumes GlusterFS

Artigos relacionados: