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.