OpenStack — Wikipédia

Présentation

OCI (OpenStack Cluster Installer) est un logiciel permettant de provisionner automatiquement des clusters OpenStack. Ce package installe une machine d'approvisionnement, qui utilise les composants ci-dessous:

Lors du premier des machines du cluster, un système Debian live est proposé en PXE par OCI, pour agir comme une image de découverte. Ce système remonte directement les caractéristiques matérielles à OCI. Les machines peuvent alors être installés avec Debian à partir de ce système, configurés avec un agent Puppet  qui se connectera au master Puppet de OCI. Une fois Debian installé, le serveur redémarre et les services OpenStack sont provisionnés, en fonction du rôle du serveur dans le cluster.

OCI est entièrement intégré à Debian, y compris tous les modules Puppet. Après avoir installé le package OCI et ses dépendances, aucun autre soft n'est necessaire pour l'installation du cluster, ce qui signifie que si un miroir Debian local est disponible, l'installation du cluster OpenStack peut être effectuée complètement hors ligne.

 

Les services OpenStack installés

Actuellement, OCI peut installer:

Des efforts sont actuellement en cours pour intégrer:

De plus, OCI prend désormais en charge l'exécution de CephOSD sur les nœuds de calcul (ce que l'on appelle «hyper-converged») en tant qu'option pour chaque nœud de calcul. (compute nodes) 

Tout cela avec de la haute disponibilité, en utilisant haproxy et corosync sur les nœuds de contrôleur pour tous les services.

Tous les services utilisent uniquement TLS, même au sein du cluster.

En règle générale, OCI vérifie quel type de nœuds fait partie du cluster et prend des décisions en fonction de celui-ci. Par exemple, s'il existe des nœuds OSD Ceph, OCI utilisera Ceph comme backend pour la sauvegarde Glance, Nova et Cinder. S'il y a des nœuds Cinder Volume, OCI les utilisera avec le backend LVM. S'il existe des nœuds Swiftstore, Swift sera utilisé pour les sauvegardes et les images Glance. S'il existe des nœuds Ceph OSD, mais pas de nœuds Ceph MON dédiés, les contrôleurs agiront comme des moniteurs Ceph. S'il existe des nœuds de calcul, Cinder, Nova et Neutron seront installés sur les nœuds de contrôleur. Etc…

Le nombre minimum de nœuds de contrôleur est de 3, bien qu'il soit possible, avec un peu de bidouille d'installer les 3 contrôleurs sur des machines virtuelles sur un seul serveur (bien sûr, perdre la fonctionnalité de haute disponibilité en cas de panne du matériel).

 

Qui est derrière ce projet ?

OCI a été entièrement écrit par Thomas Goirand (zigo). Le travail est entièrement sponsorisé par Infomaniak Networks, qui l'utilise en production dans des clusters raisonnablement grands. Il y a eu quelques contributions sporadiques au sein d'Infomaniak, ainsi que quelques correctifs de contributeurs externes, mais aucune fonctionnalité majeure (pour le moment). Espérons que ce projet, au fil du temps, rassemblera plus de contributeurs.

 

Présentation vidéo

Si vous souhaitez avoir une présentation rapide de ce que l'OCI peut faire, pour voir si cela répond à vos besoins, vous pouvez regarder la présentation faite pour le sommet OpenStack en novembre 2020. Ce n'est pas long (19 minutes) : Youtube 

 

Installation

Exigences minimales

OCI lui-même fonctionnera bien avec environ 20 Go de disque dur et quelques Go de RAM. Cependant, pour installer OpenStack, vous aurez besoin d'au moins 3 contrôleurs avec un minimum de 16 Go de RAM, 32 Go sont recommandés et le mieux est de 64 Go de RAM. Si vous voulez Ceph, un minimum de 3 Ceph OSD est nécessaire, cependant, nous ne parlons que lorsque votre cluster atteint 100 disques. La recommandation Ceph est qu'un serveur donné ne supprime pas plus de 10% de la capacité totale. Donc, 10 serveurs OSD au début, c'est bien. En ce qui concerne Swift, le nombre minimum de serveurs serait de 3, mais si l'un d'entre eux échoue, vous obtiendrez des délais d'attente. Il est donc probablement préférable de commencer avec au moins 6 nœuds de stockage Swift, et peut-être avec 2 proxies. Pour les autres ressources, c'est à vous de choisir : quelques compute nodes (nœuds de calcul), et probablement 2 nœuds de réseau et quelques nœuds de volume.

Si vous avez l'intention d'exécuter le package openstack-cluster-installer-poc pour faire du développement ou du test OCI dans un environnement virtualisé, nous vous recommandons un serveur unique avec 1 To de disque dur et 256 Go de RAM. Cette configuration est suffisante pour provisionner 19 VM sur lesquelles OpenStack sera installé. Il est possible de fonctionner avec moins, mais alors peu de nœuds seront disponibles, et vous devrez ajuster le nombre de serveurs dans /etc/oci-poc/oci-poc.conf.

 

Installation du paquet

Le dépôt du paquet

Le paquet est soit disponible depuis Debian Sid / Buster, soit depuis les référentiels de backport stables d'OpenStack.

Utilisation d'Extrepo

La nouvelle (meilleure) façon d'utiliser les backports Debian Stable d'OpenStack est d'utiliser extrepo. Extrepo est disponible dans les buster-backports officiels. Voici comment installer OpenStack, par exemple (vous avez besoin du dépôt buster-backports dans votre sources.list) :

apt-get install extrepo
extrepo enable openstack_wallaby
apt-get update

Consultez la documentation d'extrepo pour en savoir plus.

 

Configuration manuelle des dépôts Debian

Si vous souhaitez utiliser Buster avec OpenStack Train, les dépôts ci-dessous doivent être ajoutés au fichier sources.list :

deb http://buster-train.debian.net/debian buster-train-backports main
deb-src http://buster-train.debian.net/debian buster-train-backports main

deb http://buster-train.debian.net/debian buster-train-backports-nochange main
deb-src http://buster-train.debian.net/debian buster-train-backports-nochange main

Vous pouvez remplacer buster ci-dessus par n'importe quelle distribution stable Debian (au moment de l'écriture, seuls Stretch et Buster sont pris en charge), et pareil pour le nom de la version OpenStack du jour.

La clé du dépôt est disponible de cette façon :

apt-get update
apt-get install --allow-unauthenticated -y openstack-backports-archive-keyring
apt-get update

Il existe également un miroir contenant TOUTES les versions d'OpenStack en un seul endroit : http://osbpo.debian.net/debian/

 

Installer le paquet

Installez simplement openstack-cluster-installer avec :

apt-get install openstack-cluster-installer

 

Installer un serveur de base de données

Pour MariaDB :

apt-get install mariadb-server dbconfig-common

Il est possible de créer la base de données et les informations d'identification à la main, ou de laisser OCI le gérer automatiquement avec dbconfig-common. Si APT s'exécute en mode non interactif, ou si pendant l'installation, l'utilisateur ne demande pas la gestion automatique de la base de données par dbconfig-common, voici comment créer la base de données : 

apt-get install openstack-pkg-tools
. /usr/share/openstack-pkg-tools/pkgos_func
PASSWORD=$(openssl rand -hex 16)
pkgos_inifile set /etc/openstack-cluster-installer/openstack-cluster-installer.conf database connection mysql+pymysql://oci:${PASSWORD}@localhost:3306/oci"
mysql --execute 'CREATE DATABASE oci;'
mysql --execute "GRANT ALL PRIVILEGES ON oci.* TO 'oci'@'localhost' IDENTIFIED BY '${PASSWORD}';"

Il faut alors s'assurer que la directive "connection" dans /etc/openstack-cluster-installer/openstack-cluster-installer.conf ne contient pas d'espaces avant et après le signe égal.

 

Configurer OCI

Assurez-vous que la base de données est synchronisée (si c'est le cas, vous verrez que'il y a des erreurs dans le tableau) :

apt-get install -y php-cli
cd /usr/share/openstack-cluster-installer ; php db_sync.php

Puis éditez /etc/openstack-cluster-installer/openstack-cluster-installer.conf et configurer les options comme vous le souhaitez (par exemple: changer les valeurs du réseau, etc.).

 

Générer l'autorité de certification racine d'OCI

Pour supporter TLS, OCI utilise sa propre autorité de certification racine. Le certificat d'autorité de certification racine est distribué sur tous les nœuds du cluster. Pour créer l'autorité de certification racine initiale, il existe un script pour tout faire :

oci-root-ca-gen

À ce stade, vous devriez pouvoir naviguer dans l'interface Web d'OCI : http://your-ip-address/oci/

Cependant, vous avez besoin d'un login / pass pour entrer. Il y a un utilitaire shell pour gérer vos noms d'utilisateur. Pour ajouter un nouvel utilisateur, procédez comme suit :

oci-userdb -a mylogin mypassword

Les mots de passe sont hachés en utilisant la fonction PHP password_hash () en utilisant l'algo BCRYPT.

De plus, OCI est capable d'utiliser un Radius externe pour son authentification. Cependant, vous devez toujours ajouter manuellement des connexions dans la base de données. Ce qui est ci-dessous insère un nouvel utilisateur qui a une entrée dans le serveur Radius :

oci-userdb -r newuser@example.com

 

 Vous devez également configurer votre adresse de serveur Radius et votre secret partagé dans openstack-cluster-installer.conf.

Même s'il existe un système d'authentification, il est fortement conseillé de ne pas exposer OCI à Internet. La meilleure configuration est si votre serveur d'approvisionnement n'est pas du tout accessible de l'extérieur.

 

Installation des services annexes

ISC-DHCPD

Configurez isc-dhcp pour qu'il corresponde à votre configuration réseau. Notez que "next-server" doit être l'adresse de votre nœud master Puppet (c'est-à-dire : le serveur DHCP que nous sommes en train de configurer).

Modifiez /etc/default/isc-dhcpd :

sed -i 's/INTERFACESv4=.*/INTERFACESv4="eth0"/' /etc/default/isc-dhcp-server

Puis éditez /etc/dhcp/dhcpd.conf :

allow booting;
allow bootp;
default-lease-time 600;--
max-lease-time 7200;
ddns-update-style none;
authoritative;
ignore-client-uids On;

subnet 192.168.100.0 netmask 255.255.255.0 {
        range 192.168.100.20 192.168.100.80;
        option domain-name example.com;
        option domain-name-servers 9.9.9.9;
        option routers 192.168.100.1;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.100.255;
        next-server 192.168.100.2;
        if exists user-class and option user-class = "iPXE" {
                filename "http://192.168.100.2/oci/ipxe.php";
        } else {
                filename "lpxelinux.0";
        }
}

Notez soigneusement que 192.168.100.2 doit être l'adresse de votre serveur OCI, car il sera utilisé pour servir PXE, TFTP et Web pour les nœuds esclaves. Il est bien sûr très bien d'utiliser une autre adresse si votre serveur OCI le fait, alors n'hésitez pas à adapter ce qui précède à votre guise.

Notez qu'à partir de la version 28 d'OCI et au-dessus, le chargement de l'initrd et du noyau se fait via HTTP, donc l'utilisation de lpxelinux.0 est obligatoire (pxelinux.0 ne devrait plus être utilisé, car il ne supporte que TFTP).

De plus, pour qu'OCI autorise les requêtes à partir de la plage DHCP, vous devez ajouter vos sous-réseaux DHCP à TRUSTED_NETWORKS dans openstack-cluster-installer.conf. Sinon, le reporting matériel ne fonctionnera jamais.

 

tftpd

Configurez tftp-hpa pour servir les fichiers depuis OCI:

sed -i 's#TFTP_DIRECTORY=.*#TFTP_DIRECTORY="/var/lib/openstack-cluster-installer/tftp"#' /etc/default/tftpd-hpa

Puis redémarrez tftpd-hpa.

 

Préparation de l'installation des serveurs

Configuration des clés SSH

Lors de la configuration, OCI créera une paire de clés ssh publique / privée ici:

/etc/openstack-cluster-installer/id_rsa

Une fois cela fait, il copiera le contenu id_rsa.pub correspondant dans:

/etc/openstack-cluster-installer/authorized_keys

et ajoutera également toutes les clés publiques qu'il trouve sous /root/.ssh/authorized_keys. Plus tard, ce fichier sera copié dans l'image live OCI Debian, et dans tous les nouveaux systèmes qu'OCI installera. OCI utilisera plus tard la clé privée qu'il a générée pour se connecter aux serveurs, tandis que vos clés seront également présentes afin que vous puissiez vous connecter à chaque serveur individuel en utilisant votre clé privée. Par conséquent, il est fortement conseillé de personnaliser /etc/openstack-cluster-installer/allowed_keys avant de construire l'image OCI Debian Live.

 

Construire l'image en direct d'OCI

mkdir -p /root/live-image
cd /root/live-image
openstack-cluster-installer-build-live-image --pxe-server-ip 192.168.100.2 --debian-mirror-addr http://deb.debian.org/debian --debian-security-mirror-addr http://security.debian.org/
cp -auxf /var/lib/openstack-cluster-installer/tftp/* /usr/share/openstack-cluster-installer
cd ..
rm -rf /root/live-image

Il est possible d'utiliser des serveurs proxy de paquets comme approx, ou des miroirs locaux, ce qui donne la possibilité de déconnecter complètement votre cluster et OCI lui-même d'Internet.

 

Configurer l'ENC de Puppet

Une fois le service master Puppet installé, ses directives de classificateur de nœud externe (ENC) doivent être définies, de sorte que OCI agisse comme ENC (ce qui signifie que OCI définira les rôles et les classes de puppet à appeler lors de l'installation d'un nouveau serveur avec puppet) :

. /usr/share/openstack-pkg-tools/pkgos_func
pkgos_add_directive /etc/puppet/puppet.conf master "external_nodes = /usr/bin/oci-puppet-external-node-classifier" "# Path to enc"
pkgos_inifile set /etc/puppet/puppet.conf master external_nodes /usr/bin/oci-puppet-external-node-classifier
pkgos_add_directive /etc/puppet/puppet.conf master "node_terminus = exec" "# Tell what type of ENC"
pkgos_inifile set /etc/puppet/puppet.conf master node_terminus exec

Puis redémarrez le service Puppet-Master.

 

Facultatif: approx

Pour accélérer le téléchargement du paquet, il est fortement recommandé d'installer approx  localement sur votre serveur de provisionnement OCI et d'utiliser son adresse lors de la configuration des serveurs (l'adresse est définie dans /etc/openstack-cluster-installer/openstack-cluster-installer.conf).

 

Utiliser OCI

Démarrage des serveurs

Démarrez plusieurs ordinateurs, en les bootant avec PXE. Si tout se passe bien, ils attraperont le DHCP de l'OCI et redémarreront l'image en direct Debian de l'OCI. Une fois le serveur en marche, un agent s'exécutera pour faire un rapport à l'interface Web d'OCI. Rafraîchissez simplement l'interface Web d'OCI et vous verrez des machines. Vous pouvez également utiliser l'outil CLI:

apt-get install openstack-cluster-installer-cli
ocicli machine-list
	serial   ipaddr          memory  status     lastseen             cluster  hostname
	2S2JGM2  192.168.100.37  4096    live       2018-09-20 09:22:31  null
	2S2JGM3  192.168.100.39  4096    live       2018-09-20 09:22:50  null

Notez qu'ocicli peut soit utiliser un login / mot de passe qui peut être défini dans la base de données interne de l'OCI, soit l'adresse IP du serveur sur lequel ocicli s'exécute peut être inscrite dans la liste blanche dans /etc/openstack-cluster-installer/openstack-cluster-installer.conf.

 

Création de régions, d'emplacements, de réseaux, de rôles et de clusters Swift

Avant de commencer

Dans cette documentation, tout se fait via la ligne de commande en utilisant ocicli. Cependant, absolument tout peut également être fait à l'aide de l'interface Web. Il est simplement plus facile d'expliquer l'utilisation de l'interface de ligne de commande, car cela évite d'avoir à afficher des screenshots de l'interface Web.

Ici, le seul réseau que vous ajouterez à OCI serait les réseaux internes d'OpenStack. Jamais, vous n'ajouterez les réseaux publics ou ceux des VM OpenStack. Par exemple, un réseau pour la gestion des nœuds, un pour vm-net, un pour le réseau ceph-cluster ... Tous les réseaux que vous utiliserez sur OpenStack, doivent être provisionnés avec OpenStack lui-même à l'aide de l'API OpenStack .

 

Création de régions et d'emplacements Swift

Avant d'installer les systèmes sur vos serveurs, des clusters doivent être définis. Cela commence par la configuration des régions Swift. Dans un cluster Swift, il existe des zones et des régions. Lors du téléchargement d'un fichier sur Swift, il est répliqué sur N zones (généralement 3). Si 2 régions sont définies, Swift essaie de répliquer des objets sur les deux régions.

Sous OCI, vous devez d'abord définir les régions Swift. Pour ce faire, cliquez sur "Swift region" sur l'interface web, ou en utilisant ocicli, saisissez :

ocicli swift-region-create datacenter-1
ocicli swift-region-create datacenter-2

Créez ensuite des emplacements associés à ces régions:

ocicli dc1-zone1 datacenter-1
ocicli dc1-zone2 datacenter-1
ocicli dc2-zone1 datacenter-2

Plus tard, lors de l'ajout d'un nœud de données Swift à un cluster (les nœuds de données sont les serveurs qui effectueront réellement le stockage Swift), un emplacement doit être sélectionné.

Une fois les emplacements définis, il est temps de définir les réseaux. Les réseaux sont également rattachés à des emplacements. Les zones et régions Swift seront liées à ces emplacements et régions.

 

Créer des réseaux

ocicli network-create dc1-net1 192.168.101.0 24 dc1-zone1 no

La commande ci-dessus créera un sous-réseau 192.168.101.0/24, situé dans dc1-zone1. Créons 2 réseaux supplémentaires:

ocicli network-create dc1-net2 192.168.102.0 24 dc1-zone2 no
ocicli network-create dc2-net1 192.168.103.0 24 dc2-zone1 no

Ensuite, pour que le cluster soit accessible, créons un réseau public sur lequel les clients se connecteront:

ocicli network-create pubnet1 203.0.113.0 28 public yes

Notez que si vous utilisez un /32, il sera configuré sur l'interface lo de votre contrôleur. La configuration attendue consiste à utiliser BGP pour acheminer cette adresse IP publique sur le contrôleur. Pour ce faire, il est possible de personnaliser l'ENC et d'ajouter le peering BGP à votre routeur. Voir à la fin de cette documentation pour cela.

 

Créer un nouveau cluster

Créons un nouveau cluster:

ocicli cluster-create swift01 example.com

Maintenant que nous avons un nouveau cluster, les réseaux que nous avons créés peuvent y être ajoutés:

ocicli network-add dc1-net1 swift01 all eth0
ocicli network-add dc1-net2 swift01 all eth0
ocicli network-add dc2-net1 swift01 all eth0
ocicli network-add pubnet1 swift01 all eth0

Lors de l'ajout du réseau public, automatiquement, une adresse IP sera réservée au VIP (Virtual Private IP). Cette adresse IP sera plus tard partagée par les nœuds du contrôleur, pour effectuer la haute disponibilité (HA), contrôlée par pacemaker / corosync. Le principe est le suivant: si l'un des nœuds du contrôleur héberge le VIP (et il est affecté à son eth0), et devient indisponible (disons, le serveur plante ou le câble réseau est débranché), alors le VIP est réaffecté au eth0 d'un autre nœud de contrôleur du cluster.

Si vous sélectionnez 2 interfaces réseau (par exemple, eth0 et eth1), la liaison sera utilisée. Notez que votre équipement réseau (commutateurs, etc.) doit être configuré en conséquence (LACP, etc.), et que la configuration de ces équipements sort du cadre de cette documentation. Consultez votre fournisseur d'équipement réseau pour plus d'informations.

 

Véritable certificat pour l'API

Par défaut, OCI générera un certificat auto-signé pour tout. Bien que cela fonctionne bien à quelques exceptions près (cela ne fonctionne visiblement pas pour Heat, Magnum et si l'on veut activer le chiffrement sur disque Swift), il est préférable, en production, d'utiliser un vrai certificat API, afin que les clients puissent faites confiance à votre serveur. Pour ce faire, il faut d'abord choisir un nom d'hôte pour l'API. Ceci est défini de cette façon:

ocicli cluster-set z --vip-hostname cloud-api.example.com

Une fois cela fait, dans le serveur OCI, générez un certificat pour ce nom d'hôte:

oci-gen-slave-node-cert cloud-api.example.com

Le cd vers /var/lib/oci/ssl/slave-nodes/cloud-api.example.com. Ensuite, vous pouvez trouver le cloud-api.example.com.csr (.csr signifie certificat de signature de certificat) qui peut être utilisé pour opter pour un vrai certificat. Faites signer le certificat, puis remplacez les fichiers .crt et .pem par le vrai contenu signé. Si vous réutilisez un certificat générique, vous souhaitez probablement également remplacer le fichier .key. Notez que le fichier .pem doit contenir le certificat et la clé privée, concaténés, et peut-être aussi tous les certificats intermédiaires.

Une fois cela fait, informez simplement OCI que nous utilisons un vrai certificat signé:

ocicli cluster-set z --self-signed-api-cert no

Désormais, Puppet sera démarré sans utiliser la racine ca de l'OCI comme environnement, et ca_file ne sera pas utilisé dans tous les fichiers de configuration d'OpenStack (une chaîne vide sera définie à la place).

Si vous avez mis votre cluster en production avant de signer le certificat, il est possible d'utiliser, sur le serveur de Puppet, l'utilitaire oci-update-cluster-certs :

oci-update-cluster-certs z

Cela remplacera le certificat cloud-api.example.com partout dans le cluster et redémarrera les services pour l'utiliser. Cet utilitaire shell est également utile chaque fois que votre certificat SSL expire et doit être mis à jour.

 

Inscription de serveurs dans un cluster

Maintenant que nous avons des réseaux affectés au cluster, il est temps d'ajouter des serveurs d'attribution au cluster. Disons que nous avons la sortie ci-dessous:

ocicli machine-list
	serial  ipaddr          memory  status  lastseen             cluster  hostname
	C1      192.168.100.20  8192    live    2018-09-19 20:31:57  null
	C2      192.168.100.21  8192    live    2018-09-19 20:31:04  null
	C3      192.168.100.22  8192    live    2018-09-19 20:31:14  null
	C4      192.168.100.23  5120    live    2018-09-19 20:31:08  null
	C5      192.168.100.24  5120    live    2018-09-19 20:31:06  null
	C6      192.168.100.25  5120    live    2018-09-19 20:31:14  null
	C7      192.168.100.26  4096    live    2018-09-19 20:31:18  null
	C8      192.168.100.27  4096    live    2018-09-19 20:31:26  null
	C9      192.168.100.28  4096    live    2018-09-19 20:30:50  null
	CA      192.168.100.29  4096    live    2018-09-19 20:31:00  null
	CB      192.168.100.30  4096    live    2018-09-19 20:31:07  null
	CC      192.168.100.31  4096    live    2018-09-19 20:31:20  null
	CD      192.168.100.32  4096    live    2018-09-19 20:31:28  null
	CE      192.168.100.33  4096    live    2018-09-19 20:31:33  null
	CF      192.168.100.34  4096    live    2018-09-19 20:31:40  null
	D0      192.168.100.35  4096    live    2018-09-19 20:31:47  null
	D1      192.168.100.37  4096    live    2018-09-21 20:31:23  null
	D2      192.168.100.39  4096    live    2018-09-21 20:31:31  null

Ensuite, nous pouvons inscrire des machines dans le cluster de cette manière:

ocicli machine-add C1 swift01 controller dc1-zone1
ocicli machine-add C2 swift01 controller dc1-zone2
ocicli machine-add C3 swift01 controller dc2-zone1
ocicli machine-add C4 swift01 swiftproxy dc1-zone1
ocicli machine-add C5 swift01 swiftproxy dc1-zone2
ocicli machine-add C6 swift01 swiftproxy dc2-zone1
ocicli machine-add C7 swift01 swiftstore dc1-zone1
ocicli machine-add C8 swift01 swiftstore dc1-zone2
ocicli machine-add C9 swift01 swiftstore dc2-zone1
ocicli machine-add CA swift01 swiftstore dc1-zone1
ocicli machine-add CB swift01 swiftstore dc1-zone2
ocicli machine-add CC swift01 swiftstore dc2-zone1

En conséquence, il y aura 1 contrôleur, 1 proxy Swift et 2 nœuds de données Swift sur chaque zone de nos clusters. Les adresses IP seront automatiquement attribuées aux serveurs lorsque vous les ajoutez aux clusters. Ils ne sont pas affichés dans ocicli, mais vous pouvez les vérifier via l'interface Web. Le résultat devrait être comme ceci:

ocicli machine-list
	serial  ipaddr          memory  status  lastseen             cluster  hostname
	C1      192.168.100.20  8192    live    2018-09-19 20:31:57  7        swift01-controller-1.example.com
	C2      192.168.100.21  8192    live    2018-09-19 20:31:04  7        swift01-controller-2.example.com
	C3      192.168.100.22  8192    live    2018-09-19 20:31:14  7        swift01-controller-3.example.com
	C4      192.168.100.23  5120    live    2018-09-19 20:31:08  7        swift01-swiftproxy-1.example.com
	C5      192.168.100.24  5120    live    2018-09-19 20:31:06  7        swift01-swiftproxy-2.example.com
	C6      192.168.100.25  5120    live    2018-09-19 20:31:14  7        swift01-swiftproxy-3.example.com
	C7      192.168.100.26  4096    live    2018-09-19 20:31:18  7        swift01-swiftstore-1.example.com
	C8      192.168.100.27  4096    live    2018-09-19 20:31:26  7        swift01-swiftstore-2.example.com
	C9      192.168.100.28  4096    live    2018-09-19 20:30:50  7        swift01-swiftstore-3.example.com
	CA      192.168.100.29  4096    live    2018-09-19 20:31:00  7        swift01-swiftstore-4.example.com
	CB      192.168.100.30  4096    live    2018-09-19 20:31:07  7        swift01-swiftstore-5.example.com
	CC      192.168.100.31  4096    live    2018-09-19 20:31:20  7        swift01-swiftstore-6.example.com
	CD      192.168.100.32  4096    live    2018-09-19 20:31:28  null
	CE      192.168.100.33  4096    live    2018-09-19 20:31:33  null
	CF      192.168.100.34  4096    live    2018-09-19 20:31:40  null
	D0      192.168.100.35  4096    live    2018-09-19 20:31:47  null
	D1      192.168.100.37  4096    live    2018-09-21 20:31:23  null
	D2      192.168.100.39  4096    live    2018-09-21 20:31:31  null

Comme vous pouvez le voir, les noms d'hôte sont également calculés automatiquement.

 

Calcul du ring Swift

Avant de commencer à installer les serveurs, le ring Swift doit être construit. Exécutez simplement cette commande:

ocicli swift-calculate-ring swift01

Notez que cela peut prendre très longtemps, en fonction de la taille de votre cluster.C'est normal, soyez juste patient.

 

Installation des serveurs

Il n'y a pas (encore) de gros bouton «installer le cluster» sur l'interface Web ou sur la CLI. Au lieu de cela, les serveurs doivent être installés un par un:

ocicli machine-install-os C1
ocicli machine-install-os C2
ocicli machine-install-os C3

Il est conseillé d'installer d'abord les nœuds de contrôleur, de vérifier manuellement qu'ils sont correctement installés (par exemple, vérifier que "openstack user list" fonctionne), puis les nœuds de stockage Swift, puis les nœuds proxy Swift. Cependant, les nœuds du même type peuvent être installés en même temps. De plus, en raison de l'utilisation d'un VIP et d'un corosync / pacemaker, les nœuds de contrôleur doivent être installés à peu près en même temps.

Il est également possible de voir les dernières lignes du journal d'installation d'un serveur à l'aide de l'interface de ligne de commande:

ocicli machine-install-log C1

Cela affichera les journaux de l'installation du système à partir de /var/log/oci, puis une fois que le serveur aura redémarré, il affichera les journaux de Puppet depuis /var/log/puppet-first-run.

 

Vérification de votre installation

Connectez-vous sur un nœud de contrôleur. Pour ce faire, listez son IP:

CONTROLLER_IP=$(ocicli machine-list | grep C1 | awk '{print $2}')
ssh root@${CONTROLLER_IP}

Une fois connecté au contrôleur, vous verrez les informations de connexion sous /root/oci-openrc.sh. Trouvez-le et essayez:

. /root/oci-openrc.sh
openstack user list

Vous pouvez également essayer Swift:

. /root/oci-openrc.sh
openstack container create foo
echo "test" >bar
openstack object create foo bar
rm bar
openstack object delete foo bar

 

Activation du chiffrement d'objets Swift

Localement sur le store Swift, Swift stocke l'objet sous une forme claire. Cela signifie que toute personne ayant un accès physique au centre de données peut extraire un disque dur et que les objets sont accessibles à partir du dossier /srv/node. Pour atténuer ce risque, Swift peut chiffrer les objets qu'il stocke. Les métadonnées (comptes, containters, etc.) seront toujours stockées sous une forme claire, mais au moins, les données stockées chiffrées.

La façon dont cela est implémenté dans OCI consiste à utiliser Barbican. C'est la raison pour laquelle Barbican est provisionné par défaut sur les nœuds du contrôleur. Par défaut, le chiffrement n'est pas activé. Pour l'activer, vous devez d'abord stocker la clé de chiffrement d'objet dans le store Barbican. Cela peut être fait de cette façon:

ENC_KEY=$(openssl rand -hex 32)
openstack secret store --name swift-encryption-key \
  --payload-content-type=text/plain --algorithm aes \
  --bit-length 256 --mode ctr --secret-type symmetric \
  --payload ${ENC_KEY}
  
	+---------------+--------------------------------------------------------------------------------------------+
	| Field         | Value                                                                                      |
	+---------------+--------------------------------------------------------------------------------------------+
	| Secret href   | https://swift01-api.example.com/keymanager/v1/secrets/6ba8dd62-d752-4144-b803-b32012d707d0 |
	| Name          | swift-encryption-key                                                                       |
	| Created       | None                                                                                       |
	| Status        | None                                                                                       |
	| Content types | {'default': 'text/plain'}                                                                  |
	| Algorithm     | aes                                                                                        |
	| Bit length    | 256                                                                                        |
	| Secret type   | symmetric                                                                                  |
	| Mode          | ctr                                                                                        |
	| Expiration    | None                                                                                       |
	+---------------+--------------------------------------------------------------------------------------------+

Une fois cela fait, l'ID de clé (ici: 6ba8dd62-d752-4144-b803-b32012d707d0) doit être entré dans l'interface Web de l'OCI, dans la définition du cluster, sous "ID de clé de chiffrement Swift (vide: pas de chiffrement) :". Une fois que cela est fait, une autre exécution de Puppet est nécessaire sur les nœuds proxy Swift:

OS_CACERT=/etc/ssl/certs/oci-pki-oci-ca-chain.pem puppet agent --test --debug

Cela devrait activer le chiffrement. Notez que la clé de cryptage doit être stockée dans Barbican sous les services utilisateur swift et project, afin que Swift y ait accès.

 

Correction de node1 inutile dans corosync

Parfois, "node1" apparaît lors de l'exécution de "crm status". Pour nettoyer cela, faites simplement:

crm_node -R node1 --force

 

Correction de ceph -s

Cela corrige tous les avertissements Ceph après une configuration:

ceph osd pool application enable glance rbd
ceph osd pool application enable nova rbd
ceph osd pool application enable cinder rbd
ceph osd pool application enable gnocchi rbd
ceph osd pool application enable cinderback rbd
ceph mon enable-msgr2

 

Variable de configuration initiale du cluster

Pour éviter de faire trop de choses lorsque le cluster est en production (comme, par exemple, démarrer MySQL pour faire la configuration initiale du cluster Galera), OCI a une variable appelée "initial-cluster-setup". Elle est activée par défaut lors des premières exécutions, et une fois que tous les contrôleurs ont signalé une exécution réussie à Puppet, cette variable est automatiquement définie sur no. Voici une liste (probablement non exhaustive) de choses qu'OCI ne fait que si initial-cluster-setup est défini sur yes :

A tout moment, il est possible de basculer la valeur sur yes ou no :

ocicli cluster-set z --initial-cluster-setup no

Cependant, il est fortement conseillé de définir la valeur sur no une fois que le cluster est en production.

Si les 3 contrôleurs de vos clusters exécutent avec succès puppet à la première startup, ils appelleront "oci-report-puppet-success". Une fois le troisième contrôleur fait, initial-cluster-setup sera automatiquement défini sur la valeur «no» dans la base de données OCI.

 

Ajout d'autres types de nœuds

OCI peut gérer, par défaut, les types de nœuds ci-dessous:

Il est seulement obligatoire d'installer 3 contrôleurs, puis tout le reste est facultatif. Il n'y a rien à configurer, OCI comprendra ce que l'utilisateur veut en fonction du type de nœuds mis à disposition.

Si les nœuds cephosd sont déployés, alors tout utilisera Ceph :

Même avec Ceph, la configuration de nœuds de volume ajoutera la capacité de backend LVM. Avec ou sans nœuds de volume, si certains nœuds OSD sont déployés, cinder-volume et cinder-backup avec le backend Ceph seront installés sur les nœuds de calcul.

La migration en direct des machines virtuelles entre les nœuds de calcul n'est possible que si vous utilisez Ceph (c'est-à-dire si certains nœuds Ceph OSD sont déployés), ou si vous utilisez l'option --block-migration.

Les nœuds Ceph MON sont facultatifs. S'ils ne sont pas déployés, le Ceph MON et MGR seront installés sur les nœuds du contrôleur.

Les nœuds de réseau sont facultatifs. S'ils ne sont pas déployés, les contrôleurs agiront en tant que nœuds de routage SNAT et IPv6, et les serveurs DHCP seront installés sur les nœuds de calcul.

 

Utilisation avancée

Configuration d'adresse IPMI automatisée

Étant donné que la gestion manuelle de cela peut prendre trop de temps, OCI offre la possibilité de configurer automatiquement les adresses IPMI de tous les serveurs découverts. Et comme il est possible que dans la configuration de votre réseau, il y ait plusieurs réseaux IPMI en fonction de l'emplacement physique du serveur, OCI offre la possibilité de choisir automatiquement un réseau IPMI en fonction du réseau DHCP qu'un serveur démarre sur l'image Live Debian.

La première chose à faire est de définir un réseau IPMI, de le définir avec le rôle "ipmi", puis de le faire correspondre à l'adresse IP du réseau DHCP:

ocicli network-create ipmi 192.168.200.0 24 zone-1 no
ocicli network-set ipmi --role ipmi --ipmi-match-addr 192.168.100.0 --ipmi-match-cidr 24

Une fois cela fait, l'option automatic_ipmi_numbering = yes doit être définie dans /etc/openstack-cluster-installer/openstack-cluster-installer.conf.

Lorsque cette option est définie, chaque fois qu'un serveur signale sa configuration matérielle, OCI vérifie s'il possède une IP IPMI correcte. Sinon, OCI effectuera un ssh dans le serveur et exécutera les commandes "ipmitool" nécessaires pour définir une configuration réseau valide. Ce faisant, l'adresse IP sera réservée dans la table "ips" de l'OCI, en veillant à ce que jamais, une adresse IP ne soit utilisée deux fois.

Avec l'exemple ci-dessus, si un serveur PXE démarre sur le réseau 192.168.100.0/24, une adresse IP IPMI lui sera automatiquement attribuée sur le réseau 192.168.200.0/24. Notez que le mot de passe IPMI est choisi au hasard. Comme nous utilisons openssl rand -base64, il peut être judicieux de vous assurer que votre serveur OCI a une bonne source d'entropie.

Si auparavant, certains serveurs avaient leur adresse IPMI déjà définie sur quelque chose qui correspond au réseau IPMI, mais que OCI ne l'a pas enregistrée, il est possible d'obtenir cette adresse IP enregistrée dans la base de données d'OCI. Il suffit de taper cette commande pour le faire :

ocicli ipmi-assign-check

Cette commande demandera à OCI de parcourir chaque machine enregistrée dans la base de données et de vérifier l'adresse IPMI détectée. Si cette adresse existe dans la base de données, rien n'est fait. Sinon, un nouvel enregistrement sera ajouté à la base de données pour cette machine, pour éviter un conflit d'adresse ultérieur.

 

Mise à niveau automatique du BIOS et du micrologiciel IPMI

La mise à niveau du BIOS et du micrologiciel IPMI des serveurs peut prendre beaucoup de temps si vous gérez un grand nombre de serveurs. OCI offre donc la possibilité d'effectuer ces mises à niveau automatiquement. Ceci est contrôlé à l'aide d'un fichier de configuration qui peut être trouvé ici: /etc/openstack-cluster-installer/oci-firmware-upgrade-config.json. Voici un exemple de fichier de configuration valide:

{
	"CL2800 Gen10": {
		"BIOS": {
			"version": "2.1.0",
			"script": "/root/hp-bios-upgrade-2.1.0"
			},
		"IPMI": {
			"version": "2.22",
			"script": "/root/hp-ipmi-upgrade-2.22"
			}
	},
}

Avec ce qui précède, si OCI trouve un serveur HP Cloud Line CL2800 dont le micrologiciel BIOS est inférieur à 2.1.0, il tentera de le mettre à niveau en lançant le script /root/hp-bios-upgrade-2.1.0. Pour ajouter ledit script, l'image en direct doit être personnalisée. Pour ce faire, ajoutez simplement quelques fichiers dans le dossier / etc / openstack-cluster-installer / live-image-additions. Tous les fichiers qui s'y trouvent seront ajoutés à l'image en direct. Ensuite, l'image en direct doit être régénérée:

# openstack-cluster-installer-build-live-image

Une fois que cela est fait, redémarrez les serveurs qui doivent être mis à niveau. À mesure qu'ils démarrent sur l'image en direct, la mise à niveau sera effectuée. Pour référence, voici un exemple de script hp-bios-upgrade-2.1.0, qui sera sauvegardé ici: /etc/openstack-cluster-installer/live-image-additions/root/hp-bios-upgrade-2.1.0 .

#!/bin/sh

set -e
set -x

cd /root
tar -xvzf CL2600_CL2800_Gen10_BIOS_v2.1.0_11052019_Linux.tgz
cd CL2600_CL2800_Gen10_BIOS_v2.1.0_11052019_Linux/FlashTool/
./flash_bios.sh
reboot
sleep 20000

Le "sleep 20000" permet de s'assurer que l'agent OCI ne redémarre pas avant le redémarrage de la machine. YMMV en fonction de la mise à niveau à effectuer.