Logo de Béjean Développement

Déployer un cluster MinIO pour le stockage objet sous Proxmox

Cet article va vous expliquer comment déployer un cluster Minion de 3 machines virtuelles sous Proxmox.

Qu'est-ce que MinIO ?

MinIO est un système de stockage objet distribué et compatible avec l'API S3 d'Amazon. Il est open source et peut être déployé sur Kubernetes, VMware Tanzu, OpenShift, Rancher, les fournisseurs Cloud Amazon, Google et Microsoft, ainsi que sur du bare-metal.

C'est cette dernière possibilité que nous allons utiliser pour déployer notre cluster MinIO.

Pré-requis

Avant de procéder au déploiement de MinIO, assurez-vous de disposer de 3 machines virtuelles avec, au minimum 1 disque pour le système d'exploitation et 3 disques pour le stockage objet. Pour ma part, j'ai installé une image Cloud Ubuntu Jammy sur le disque principal avec 5 Go pour la taille du disque puis, j'ai créé 3 disques de 2 Go chacun.

MinIO écoute sur le port 9000 par défaut pour la partie stockage objet puis sur le port 9001, que l'on peut personnaliser, pour accéder à l'interface utilisateur. Il est donc nécessaire d'ouvrir ces ports dans le firewall de chaque machine virtuelle.

J'ai également déployé un load balancer sous Haproxy pour rediriger les requêtes vers les machines virtuelles du cluster MinIO.

Paramétrage des disques

Pour fonctionner correctement, MinIO a besoin que les disques soient formatés en XFS. Dès lors que vos machines virtuelles sont créées, il faut les démarrer puis paramétrer les disques durs. Pour ce faire, je vous invite à lancer la commande ci-dessous pour afficher l'ensemble des disques :

sudo fdisk -l

Pour ma part, les disques /dev/sdb, /dev/sdc et /dev/sdd doivent être partitionnés puis formatés en XFS.

Voici ce que j'ai fait pour chaque disque :

sudo gdisk /dev/sdb

Pour cette commande, j'ai lancé les commandes suivantes : n pour créer la partition, puis j'ai validé les 3 valeurs par défaut et renseigner 8330 pour spécifier le HEX Code. Une fois terminé, il faut écrire la partition en lançant la commande w et confirmer son choix.

sudo parted /dev/sdb mkpart primary xfs 0% 100%

C'est plus simple pour cette commande, il suffit de sélectionner Yes et Ignore. Puis de lancer les commande suivantes pour formater la partition et lui donner un label :

sudo mkfs.xfs /dev/sdb1
sudo xfs_admin -L DISK1 /dev/sdb1

Répéter les mêmes actions pour les 2 autres disques de chaque machine virtuelle en changeant les valeurs des disques et du label.

Un conseil, n'hésitez pas à faire une première VM puis de cloner cette dernière.

Avant de terminer, nous allons modifier le fichier /etc/fstab pour monter automatiquement les disques au démarrage de la machine virtuelle. Pour ce faire, lancer la commande suivante :

sudo nano /etc/fstab

Puis, ajouter le contenu suivant :

LABEL=DISK1     /mnt/disk1     xfs     defaults,noatime  0       2
LABEL=DISK2     /mnt/disk2     xfs     defaults,noatime  0       2
LABEL=DISK3     /mnt/disk3     xfs     defaults,noatime  0       2

Redémarrer votre machine virtuelle pour vérifier que les disques montent correctement. Si toutefois, la machine virtuelle démarre en mode maintenance, il faut bien vérifier le fichier /etc/fstab et corriger les erreurs.

Gestion DNS

Pour me faciliter le travail, je dispose d'un serveur DNS interne qui me permet de gérer les noms de domaine de mon réseau local. J'ai donc créé 1 enregistrement de type A pour chaque machine virtuelle, soit 3 enregistrements A et 1 enregistrement de type A qui pointe sur le load balancer.

Configuration du load balancer

Nous allons continuer en configurant HaProxy car il sera nécessaire lors du déploiement du cluster MinIO. Pour ce faire, il faut modifier le fichier de configuration de HaProxy en ajoutant le contenu suivant :

frontend minio_frontend
  mode http
  bind *:9000
  acl minio hdr_dom(host) -i minio.mon-reseau-local.lan
  use_backend minio_backend if minio

backend minio_backend
  mode http
  balance roundrobin
  option httpchk GET /minio/health/ready HTTP/1.1\r\nHost:\ minio.mon-reseau-local.lan
  http-check expect status 200
  server s1 minio1.mon-reseau-local.lan:9000 check inter 2s fall 3 rise 2
  server s2 minio2.mon-reseau-local.lan:9000 check inter 2s fall 3 rise 2
  server s3 minio3.mon-reseau-local.lan:9000 check inter 2s fall 3 rise 2

frontend minio_ui_frontend
  mode http
  bind *:9001
  acl minio_ui hdr_dom(host) -i minio.mon-reseau-local.lan
  use_backend minio_ui_backend if minio_ui

backend minio_ui_backend
  mode http
  balance source
  option httpchk GET / HTTP/1.1\r\nHost:\ minio.mon-reseau-local.lan
  http-check expect status 200
  server s1 minio1.mon-reseau-local.lan:9001 check inter 2s fall 3 rise 2
  server s2 minio2.mon-reseau-local.lan:9001 check inter 2s fall 3 rise 2
  server s3 minio3.mon-reseau-local.lan:9001 check inter 2s fall 3 rise 2

La configuration est composée de 2 parties, la première concerne le stockage objet et la seconde l'interface utilisateur.

Il y a une particularité dans la configuration du healthcheck. L'option force les requêtes en HTTP 1.1 et ajoute un header Host en précisant l'URL du cluster MinIO.

Une autre particularité est présente dans le backend de l'interface utilisateur où j'ai précisé l'option source pour la balance. Cela permet de rediriger les requêtes vers la même machine virtuelle.

Création des secrets

Pour déployer le cluster, j'ai créé un playbook Ansible et j'ai utilisé, de manière très simple, la commande ansible-vault pour créer le mot de passe de l'administrateur MinIO :

ansible-vault encrypt_string 'mot-de-passe' --name 'minio_admin_password'

Renseigner une clé de chiffrement puis copier le résultat dans le playbook Ansible.

Création du fichier de configuration de MinIO

Pour se déployer correctement MinIO utilise un fichier de configuration où nous allons paramétrer les valeurs suivantes :

MINIO_ROOT_USER={{minio_admin_user}}
MINIO_ROOT_PASSWORD={{minio_admin_password}}
MINIO_VOLUMES="{{minio_volumes}}"
MINIO_OPTS="--console-address :9001"
MINIO_SERVER_URL="{{minio_loadbalancer_url}}"
MINIO_BROWSER_REDIRECT_URL="{{minio_browser_redirect_url}}"

Voici le descriptif des directives présentes dans le fichier de configuration :

  • MINIO_ROOT_USER : ce paramètre permet définir le nom d'utilisateur de l'administrateur MinIO.
  • MINIO_ROOT_PASSWORD : ce paramètre permet de définir le mot de passe de l'administrateur MinIO.
  • MINIO_VOLUMES : ce paramètre permet spécifier les différents disques présents sur chaque machine virtuelle.
  • MINIO_OPTS : ce paramètre permet de définir le port d'écoute de l'interface utilisateur de MinIO.
  • MINIO_SERVER_URL : ce paramètre permet spécifier l'URL du cluster MinIO.
  • MINIO_BROWSER_REDIRECT_URL : ce paramètre permet de définir l'URL de l'interface utilisateur de MinIO.

Création du fichier d'inventaire

À cette étape, nous allons créer le fichier d'inventaire pour Ansible avec les machines virtuelles que vous avez créée, par exemple :

all:
  children:
    minio:
      hosts:
        minio1:
          ansible_host: minio1.mon-reseau-local.lan
          ansible_user: <votre-user-cloud-init>
          ansible_ssh_private_key_file: <votre-clé-ssh-privee>
          ansible_become: yes
        minio2:
          ansible_host: minio2.mon-reseau-local.lan
          ansible_user: <votre-user-cloud-init>
          ansible_ssh_private_key_file: <votre-clé-ssh-privee>
          ansible_become: yes
        minio3:
          ansible_host: minio3.mon-reseau-local.lan
          ansible_user: <votre-user-cloud-init>
          ansible_ssh_private_key_file: <votre-clé-ssh-privee>
          ansible_become: yes

N'oubliez pas d'adapter les valeurs en fonction de votre configuration.

Déploiement du cluster

Désormais, nous disposons de 3 machines virtuelles nommées minio1, minio2 et minio3, d'un secret et d'un fichier de configuration. Nous allons donc pouvoir appliquer le playbook Ansible ci-dessous pour déployer notre cluster MinIO :

- name: "Install Minio"
  hosts:
    - minio1
    - minio2
    - minio3
  vars:
    minio_admin_user: admin
    minio_admin_password: <resultat-de-la-commande-ansible-vault>
    minio_volumes: "http://minio{1...3}.mon-reseau-local.lan:9000/mnt/disk{1...3}/minio"
    minio_loadbalancer_url: "http://minio.mon-reseau-local.lan:9000"
    minio_browser_redirect_url: "http://minio.mon-reseau-local.lan:9001"
  tasks:
    - name: Check file exists
      stat:
        path: "/tmp/minio.deb"
      register: file_info

    - name: Download Minio
      get_url:
        url: https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20231106222608.0.0_amd64.deb
        dest: /tmp/minio.deb
      when: not file_info.stat.exists

    - name: Install Minio
      apt:
        deb: /tmp/minio.deb
      become: yes
      when: not file_info.stat.exists

    - name: Create group
      group:
        name: minio-user
        state: present

    - name: Create user
      user:
        name: minio-user
        group: minio-user
        state: present
        createhome: no
        system: true

    - name: Copy Minio conf
      template:
        src: templates/minio.conf.j2
        dest: /etc/default/minio

    - name: Enable Minio service
      systemd:
        name: minio
        enabled: yes

    - name: Start Minio service
      systemd:
        name: minio
        state: restarted

Pour déployer le playbook, il suffit de lancer la commande suivante :

ansible-playbook -i inventory.yml playbook.yml --ask-vault-pass

La clé de chiffrement renseignée lors de la création du secret est nécessaire pour déchiffrer le mot de passe de l'administrateur MinIO.

Le playbook Ansible va télécharger le paquet .deb de MinIO sur chaque machine virtuelle, puis procéder à l'installation du paquet. Ensuite, il va créer un utilisateur et un groupe pour MinIO, copier le fichier de configuration, activer et démarrer le service MinIO.

Lien vers le dépôt Froggit du playbook

Vérification

Pour vérifier que le cluster MinIO est bien déployé, il suffit de lancer un navigateur et de se rendre sur l'URL de l'interface utilisateur. Vous devriez voir apparaître la page de connexion de MinIO.

Source