Management Server

Installation de Serveur de Management Apache Cloudstack sous Ubuntu

Cluster CloudStack HA avec MariaDB Galera, HAProxy & Keepalived

1. Architecture et plan d'adressage en 192.168.X.X

Rôle
Manager-1
Manager-2
Manager-3
LB1
LB2
VIP DB
VIP Web

Réseau DB Galera

2.30

2.31

2.32

2.56

2.57

2.60

Réseau CloudStack

1.30

1.31

1.32

1.56

1.57

1.60

  • Les managers sont à la fois nœuds CloudStack et MariaDB.

  • LB1/LB2 sont les load balancers (HAProxy+Keepalived) sur chaque réseau.

  • VIP DB : 192.168.2.60 (pour la base MariaDB Galera)

  • VIP Web : 192.168.1.60 (pour l’accès CloudStack Web)

  • Les VIP sont gérées par Keepalived (failover automatique).


2. Préparation des serveurs

2.1. Prérequis système sur chaque manager et LB

sudo apt update && sudo apt upgrade -y
sudo apt install -y chrony curl wget gnupg2 lsb-release software-properties-common
sudo systemctl enable --now chrony

2.2. Vérification réseau et NTP

hostname -I
timedatectl status

3. Installation du cluster MariaDB Galera

3.1. Installation des paquets MariaDB

Sur chaque manager :

sudo apt install -y mariadb-server mariadb-client galera-4 rsync socat
sudo systemctl enable --now mariadb

3.2. Sécurisation initiale

sudo mysql_secure_installation

3.3. Configuration Galera (/etc/mysql/mariadb.conf.d/60-galera.cnf)

Sur chaque manager :

[mysqld]
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.2.30,192.168.2.31,192.168.2.32"
wsrep_cluster_name="galera_cluster"
wsrep_node_address="192.168.2.30"   # Adapter pour chaque manager
wsrep_node_name="manager-1"         # Adapter pour chaque manager
wsrep_sst_method=rsync

Commande pour vérifier la santé de galera SHOW STATUS LIKE 'wsrep_cluster_size';

SHOW STATUS LIKE 'wsrep_local_state_comment';

SHOW STATUS LIKE 'wsrep%';

3.4. Démarrage du cluster

  • Sur manager-1 (premier nœud) :

    sudo galera_new_cluster
  • Sur manager-2 et manager-3 :

    sudo systemctl start mariadb

4. Installation et configuration HAProxy + Keepalived

4.1. Installation sur LB1 et LB2

sudo apt install -y haproxy keepalived
sudo systemctl enable haproxy keepalived

4.2. Configuration HAProxy pour la DB (/etc/haproxy/haproxy.cfg)

frontend galera_front
    bind *:3306  
    default_backend galera_backend

backend galera_backend
    mode tcp
    option mysql-check user haproxy_check
    stick-table type ip size 1m expire 30m
    stick on src    
    balance roundrobin
    server db1 192.168.2.30:3306 check
    server db2 192.168.2.31:3306 check
    server db3 192.168.2.32:3306 check

4.3. Configuration HAProxy pour CloudStack Web (/etc/haproxy/haproxy.cfg)

frontend cloudstack_web_front
    bind *:8080
    default_backend cloudstack_web_backend
backend cloudstack_web_backend
    mode tcp
    stick-table type ip size 1m expire 30m
    stick on src
    balance roundrobin
    server manager-1 192.168.1.30:8080 check inter 5000 # check chaque 5 secondes
    server manager-2 192.168.1.31:8080 check inter 5000 # check chaque 5 secondes
    server manager-3 192.168.1.32:8080 check inter 5000 # check chaque 5 secondes
    
frontend cloudstack_mgmt_port
    bind *:8250
    default_backend cloudstack_mgmt_port_backend
backend cloudstack_mgmt_port_backend
    mode tcp
    stick-table type ip size 1m expire 30m
    stick on src
    balance roundrobin
    server manager-1 192.168.1.30:8250 check inter 5000 # check chaque 5 secondes
    server manager-2 192.168.1.31:8250 check inter 5000 # check chaque 5 secondes
    server manager-3 192.168.1.32:8250 check inter 5000 # check chaque 5 secondes

Conf lb1 et lb2 finale

Conf lb1 et lb2 finale
global
    log /dev/log local0
    log /dev/log local1 notice
    maxconn 2000
    user haproxy
    group haproxy
    daemon
defaults
    log     global
    mode    tcp
    option  tcplog
    timeout connect 10s
    timeout client  1m
    timeout server  1m
    retries 3

frontend galera_front
    bind *:3306
    default_backend galera_backend
backend galera_backend
    mode tcp
    option mysql-check user haproxy_check
    stick-table type ip size 1m expire 30m
    stick on src    
    balance roundrobin
    server db1 192.168.2.30:3306 check
    server db2 192.168.2.31:3306 check
    server db3 192.168.2.32:3306 check

frontend cloudstack_web_front
    bind *:8080
    default_backend cloudstack_web_backend
backend cloudstack_web_backend
    mode tcp
    stick-table type ip size 1m expire 30m
    stick on src
    balance roundrobin
    server manager-1 192.168.1.30:8080 check inter 5000 # check chaque 5 secondes
    server manager-2 192.168.1.31:8080 check inter 5000 # check chaque 5 secondes
    server manager-3 192.168.1.32:8080 check inter 5000 # check chaque 5 secondes
    
frontend cloudstack_mgmt_port
    bind *:8250
    default_backend cloudstack_mgmt_port_backend
backend cloudstack_mgmt_port_backend
    mode tcp
    stick-table type ip size 1m expire 30m
    stick on src
    balance roundrobin
    server manager-1 192.168.1.30:8250 check inter 5000 # check chaque 5 secondes
    server manager-2 192.168.1.31:8250 check inter 5000 # check chaque 5 secondes
    server manager-3 192.168.1.32:8250 check inter 5000 # check chaque 5 secondes

listen stats
    bind 192.168.3.57:1936
    mode http
    log global

    maxconn 10

    timeout client 100s
    timeout server 100s
    timeout connect 100s
    timeout queue 100s

    stats enable
    stats hide-version
    stats refresh 30s
    stats show-node
    stats auth admin:password
    stats uri /haproxy

4.4. Création de l’utilisateur de check MySQL

Sur MariaDB :

CREATE USER 'haproxy_check'@'%' IDENTIFIED BY '';
FLUSH PRIVILEGES;

4.5. Configuration Keepalived (VIP DB et Web)

/etc/keepalived/keepalived.conf sur LB1 :

vrrp_instance VI_DB {
    state MASTER
    interface ethX  # Adapter à l'interface réseau DB
    virtual_router_id 51
    priority 101
    authentication {
        auth_type PASS
        auth_pass secretpass
    }
    virtual_ipaddress {
        192.168.2.60
    }
    track_script {
        chk_haproxy
    }
}

vrrp_instance VI_WEB {
    state MASTER
    interface ethY  # Adapter à l'interface réseau CloudStack
    virtual_router_id 52
    priority 101
    authentication {
        auth_type PASS
        auth_pass secretpass
    }
    virtual_ipaddress {
        192.168.1.60
    }
    track_script {
        chk_haproxy
    }
}

vrrp_script chk_haproxy {
    script "pidof haproxy"
    interval 2
    weight 2
}
  • Sur LB2, mettre state BACKUP et priority 100.

Redémarrer HAProxy et Keepalived :

sudo systemctl restart haproxy keepalived

5. Création des bases et droits CloudStack

Sur MariaDB (sur n’importe quel nœud) :

# CREATE DATABASE cloud DEFAULT CHARACTER SET utf8; cette ligne crée 
# la base de données cloud qui normalement se créer via le script d'installation
# il peut etre bien de la créer si le script d'install pete
CREATE DATABASE cloud_usage DEFAULT CHARACTER SET utf8;
CREATE USER 'cloud'@'%' IDENTIFIED BY 'motdepasse';
GRANT ALL ON cloud.* TO 'cloud'@'%';
GRANT ALL ON cloud_usage.* TO 'cloud'@'%';
GRANT PROCESS ON *.* TO 'cloud'@'%';
FLUSH PRIVILEGES;

6. Installation de CloudStack Management Server

Docs Officielle Install Management Server Install

Si SELinux est activé, penser à le désactiver

setenforce permissive

6.1. Ajout du dépôt et installation

Sur chaque manager :

wget -O - https://downloads.apache.org/cloudstack/KEYS | sudo apt-key add -
echo "deb http://downloads.apache.org/cloudstack/debian/4.20/ubuntu focal 4.20" | sudo tee /etc/apt/sources.list.d/cloudstack.list
wget -O - https://download.cloudstack.org/release.asc |sudo tee /etc/apt/trusted.gpg.d/cloudstack.asc
sudo apt update
sudo apt install -y openjdk-17-jre-headless cloudstack-management

6.2. Setup de la base de données CloudStack (manager-1 uniquement)

cloudstack-setup-databases cloud:[email protected] --deploy-as=root:motdepasse
  • Cela crée /etc/cloudstack/management/db.properties et /etc/cloudstack/management/key.

6.3. Copie de la configuration sur les autres managers

Sur manager-2 et manager-3 :

  • Copie /etc/cloudstack/management/db.properties et /etc/cloudstack/management/key depuis manager-1.

  • Modifie uniquement la ligne :

    • manager-2 : cluster.node.IP=192.168.1.31

    • manager-3 : cluster.node.IP=192.168.1.32

6.4. Configuration HA dans db.properties

Vérifie/ajoute :

db.ha.enabled=true
db.cloud.host=192.168.2.60
db.cloud.replicas=192.168.2.30,192.168.2.31,192.168.2.32
db.usage.host=192.168.2.60
db.usage.replicas=192.168.2.30,192.168.2.31,192.168.2.32
  • Les autres paramètres (db.cloud.username, db.cloud.password, etc.) restent identiques.

6.5. Démarrage du service

Une fois la base de données configurée, vous pouvez finaliser la configuration du système d'exploitation du serveur de gestion. Cette commande configurera iptables, sudoers et démarrera le serveur de gestion.

cloudstack-setup-management

Sur chaque manager :

sudo systemctl enable --now cloudstack-management
sudo systemctl status cloudstack-management

7. Vérifications

  • Logs CloudStack :

    tail -f /var/log/cloudstack/management/management-server.log

8. Résolution des problèmes

  • Erreur 503 :

    • Vérifie la clé /etc/cloudstack/management/key sur tous les managers.

    • Vérifie les logs CloudStack.

    • Passer le Cluster.Node.IP dans /etc/cloudstack/management/db.properties à 127.0.0.1 devrait résoudre le problème mais avec un message dans les logs type l'ip du noeud en lui même ne remonte pas

  • Connexion DB KO :

    • Vérifie les droits SQL et la connectivité réseau.

  • Pas d’accès web :

    • Si vous laisser le firewall activé, activé le pour 8080 et 8250 (sudo ufw allow 8080/tcpet sudo ufw allow 8250/tcp). Sinon désactivé totalement le pare-feu niveau noeud ufw disable ou si firewalld

    • Vérifie la config HAProxy et Keepalived.


9. Sécurisation et bonnes pratiques

  • Firewall : Ouvre uniquement les ports nécessaires (3306 pour Galera, 8080 pour CloudStack Web).

  • Sauvegarde : Sauvegarde /etc/cloudstack/management/key et /etc/cloudstack/management/db.properties.

  • NTP : Synchronisation NTP active sur tous les nœuds.

  • Redondance : Teste la bascule des VIPs en arrêtant un LB.


10. Commandes utiles de supervision

# Vérifier la VIP DB
ip a | grep 192.168.2.60

# Vérifier la VIP Web
ip a | grep 192.168.1.60

# Vérifier HAProxy
sudo systemctl status haproxy

# Vérifier Keepalived
sudo systemctl status keepalived

# Vérifier CloudStack
sudo systemctl status cloudstack-management
tail -f /var/log/cloudstack/management/management-server.log

11. Schéma de fonctionnement

[Clients CloudStack Web]
        |
   [VIP 192.168.1.60]
        |
   [LB1/LB2: HAProxy+Keepalived]
        |
[Managers CloudStack: 1.30/1.31/1.32]
        |
   [VIP DB 192.168.2.60]
        |
   [LB1/LB2: HAProxy+Keepalived]
        |
[Cluster MariaDB Galera: 2.30/2.31/2.32]

12. Prochaines étapes

13. Références

Last updated

Was this helpful?