Le Cloud public nous permet d'accéder à tout moment, et à la demande, à un réservoir de ressources informatiques. Flexible et évolutif, ils s'offrent depuis maintenant quelques années au plus grand nombre.

Avec un coût qui sera adapté à vos besoins, une évolutivité et de la ressource on demand, difficile de ne pas regarder les opportunités de ces services.

De mon côté, j'utilise les services d'OVH et de son offre Public Cloud pour réaliser mes essais, et notamment ceux liés à ce blog.

Pourquoi OVH et pas un autre fournisseur de Cloud ?

J'ai tout simplement un compte de longue date chez OVH et pour le moment, le tarif, le service client, et même l'interface que je trouve simple et efficace me suffisent amplement. Ceci ne m’empêchera pas d'essayer d'autres fournisseurs à l'avenir... Je suis déjà sur GCP depuis quelques temps également.

Mais aujourd'hui, nous allons voir comment déployer des instances en quelques minutes chez OVH avec l'aide de l'API OpenStack mise à disposition !

Ready ? 👌

Avant tout, il va falloir se créer un compte sur l'API afin de pouvoir lancer quelques commandes !

Pour cela, il sera nécessaire d'avoir au préalable créer un premier projet "Public Cloud" et d'avoir bien évidement accès à votre espace client.

Créer votre compte utilisateur OpenStack :

Depuis l'interface Public Cloud, accédez à la création des comptes depuis l’onglet Users & Roles situés dans la section Project Management.

Vous pourrez saisir une description pour votre compte :

Enfin, on vous demande de choisir le rôle de votre compte. Voici un tableau récapitulatif des droits :

De mon côté, je vais utiliser le rôle : Compute Operator pour cet exemple.

🚩Notez bien le mot de passe, il ne vous sera pas fourni de nouveau. En cas de perte, il faudra le régénérer ! 🚩

Pour vérifier votre accès, connectez-vous à l'interface Horizon : https://horizon.cloud.ovh.net/

En passant, je vous conseille de récupérer immédiatement le fichier "RC" d'OpenStack :

Celui-ci va nous servir dans quelques minutes. Vous pouvez utiliser n'importe quel Datacenter, je vais utiliser Gravelines ( Le nord c'est bien non ?! ).

Insaller la CLI OpenStack :

Je ne vais pas détailler l'installation sur toutes les distributions. Je vais le faire uniquement pour Debian :

$ apt-get update && apt-get install python-openstackclient python-novaclient -y

Le client existe dans pas mal de dépôts ( Archlinux, CentOS, Ubuntu ... ) et la procédure sera semblable sur ces OS. De plus le paquet est installable via pip :

$ pip install python-openstackclient

Pour Windows ? Le plus simple est d'utiliser un conteneur ou tout simplement une image WSL2.

Sinon il est possible d'installer Python et le client via pip également !

Voila vous êtes presque prêt pour utiliser l'API ! Commençons dès maintenant notre exemple !

Fight 🥊

Dans un premier temps, nous allons voir comment déployer une "simple" instance !

Commençons déjà par nous connecter à l'aide de la CLI OpenStack à notre compte.

Le fichier "RC" que nous avons récupéré tout à l'heure contient des variables d'environnement pour nous connecter à l'API. Il va être nécessaire de charger le contenu du fichier dans votre environnement :

$ source openrc.sh
Please enter your OpenStack Password:

Vous pouvez maintenant tester quelques commandes :

Lister les modèles d'instance disponibles :
$ openstack flavor list
Lister les images disponibles :
$ openstack image list

Afin de nous connecter à notre futur instance, je vais ajouter une clé SSH à mon utilisateur OpenStack :

$ openstack keypair create --public-key ~/.ssh/id_rsa.pub "My-Key"

Pour lancer une instance, rien de plus simple :

openstack server create --image "Debian 10" --flavor "s1-2" --key-name "My-Key" my-instance

Vous pourrez lister votre instance avec :

Lister vos instances :
$ openstack server list
Pour obtenir les informations de l'instance ( notamment son IP publique )  :
openstack server show my-instance

Si vous souhaitez suivre le démarrage de votre instance :

openstack console log show my-instance

Mais tout ceci ne nous permettra pas de déployer automatiquement notre projet... !

Vers l'infini ... 🚀

Tout d'abord de quoi va se composer notre projet ? Et bien de l'environnement suivant :

  • D'une installation de K3S afin de déployer mes conteneurs,
  • Traefik comme reverse-proxy,
  • un CMS pour afficher du contenu, je vais utiliser WordPress dans cet exemple mais cela n'a vraiment que peu d'importance.

Afin de déployer tout ceci de façon automatique lors de la création de mon instance, nous allons avoir besoin d'une option bien précise : --user-data

Cet argument va nous permettre de passer un script shell qui va s’exécuter au premier démarrage de notre instance.

Il est aussi possible de lancer des scripts cloud-config lors de la création de votre instance. Je ne vais pas m'attarder sur ce point aujourd'hui.

Je vais donc créer un fichier deploy.sh qui va réaliser ces opérations :  

#!/bin/bash

sudo apt update
sudo apt install curl git -y
curl -sfL https://get.k3s.io | sh -s - --no-deploy=traefik
cd /home/debian/ && git clone https://github.com/lfache/awesome-traefik-kubernetes

cd  awesome-traefik-kubernetes/traefik-kustomize-sample/production/
sudo kubectl apply -k ./

cd /home/debian/awesome-traefik-kubernetes/wordpress/
sed -i 's/YOUR_DATABASE/wordpress/g' kustomization.yaml
sed -i 's/YOUR_USER/myuser/g' kustomization.yaml
sed -i 's/YOUR_PASSWORD/mypass/g' kustomization.yaml
sed -i 's/wordpress.mydomain.com/wordpress.dubarbu.fr/g' wordpress-ingressroute.yaml
sed -i 's/X.X.X.X/MONIP/g' wordpress-ipwhitelist.yaml 
sudo kubectl apply -k ./

🚩 Nous allons passer sur la qualité très douteuse de ce script d'exemple : Aucune vérification, retour des commandes, etc. Mais cela allège et facilite la compréhension de mon exemple.  

Je prépare actuellement un script bien plus "propre" si vous souhaitez réaliser ce type de déploiement. Je vais mettre une partie du script sur Github avec le lien en bas de cet article. 🚩

Quelques explications tout de même :

sudo apt update
sudo apt install curl git -y

J'installe quelques dépendances nécessaires pour la suite.

curl -sfL https://get.k3s.io | sh -s - --no-deploy=traefik

On installe K3S mais sans déployer Traefik car nous allons le déployer manuellement juste après !

cd /home/debian/ && git clone https://github.com/lfache/awesome-traefik-kubernetes

Je vais récupérer les fichiers YAML sur mon dépôt.

cd  awesome-traefik-kubernetes/traefik-kustomize-sample/production/
sudo kubectl apply -k ./

🚩 Ici il faudrait modifier le champ email de votre fichier de configuration de Traefik 🚩

Enfin je vais déployer WordPress en modifiant quelques variables:

cd /home/debian/awesome-traefik-kubernetes/wordpress/
sed -i 's/YOUR_DATABASE/wordpress/g' kustomization.yaml
sed -i 's/YOUR_USER/myuser/g' kustomization.yaml
sed -i 's/YOUR_PASSWORD/mypass/g' kustomization.yaml
sed -i 's/wordpress.mydomain.com/wordpress.dubarbu.fr/g' wordpress-ingressroute.yaml
sed -i 's/X.X.X.X/MONIP/g' wordpress-ipwhitelist.yaml 
sudo kubectl apply -k ./

Je vais finalement rendre ce script exécutable :

$ chmod +x deploy.sh

Et enfin je vais créer une instance avec mon script :

$ openstack server create --image "Debian 10" --flavor "s1-8" --key-name "MyKey" --net "Ext-Net" --user-data deploy.sh my-instance

--net : Je possède plusieurs vRack sur mon compte, je dois donc préciser l'interface réseau publique. Je pourrais d'ailleurs ajouter mon vRack pour diverses raisons.

--user-data : Avec cette option, je peux passer mon script shell.

--flavor : Le type d'instance à créer. Ici une instance sandbox avec 8Go de mémoire.

--key-name : Ma clé SSH.

Après quelques secondes, je vais pouvoir récupérer l'adresse publique de mon instance :

openstack server show my-instance

Je vais donc créer une entrée DNS pour wordpress.dubarbu.fr avec cette IP. Enfin je vais vérifier que mon instance démarre correctement :

openstack server show my-instance

Une fois terminé, je peux accéder à mon instance WordPress sur mon url d'exemple  : https://wordpress.dubarbu.fr

Avec mon paramétrage de Traefik, le HTTPS est déjà là et avec quelques headers de sécurité... !

MAGIC

Un petit soucis avec les Options TLS de Traefik et Kustomize m'empêche d'obtenir pour le moment le A+ sur SSLLABS automatiquement. Il est nécessaire de relancer l'application des options TLS. Ce point sera corriger avec une version bien plus pertinente du fichier shell de déploiement 😂


Nous avons donc pu voir ensemble comment :

  • Créer votre compte à l'API OpenStack d'OVH avec un rôle,
  • Préparer votre environnement pour utiliser la CLI OpenStack,
  • Initialiser une première instance,
  • Déployer automatiquement K3S, Traefik et WordPress en quelques secondes !

Ces outils peuvent vous permettre d'envisager un nombre important de scénario, comme par exemple :

  • Déployer des instances en cas de montée en charge,
  • Faciliter vos serveurs de pré-production pour les développeurs,
  • Distribuer des instances à vos clients en quelques secondes ...

Et bien évidement il sera possible de coupler ces commandes dans une pipeline CI/CD, ou d'utiliser des outils de déploiement automatisés.

Comme j'ai pu l'expliquer au coeur de cet article, mon script n'est absolument pas production ready. Il est très clairement nécessaire de travailler sur ce point.

Mais mon but est ici de vous faire partager une méthodologie, et non un script de déploiement tout fait.  Simplifier les choses pour mieux les comprendre demande parfois de réaliser quelques "coupures". Dans tous les cas je travaille sur un script de déploiement automatique plus sérieux mais que je n'ai pas eu le temps de finaliser.

Si vous le souhaitez, voici une preview de ce script :

lfache/various
various file. Contribute to lfache/various development by creating an account on GitHub.
En tout cas  n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter ! C'est toujours un plaisir d'avoir des retours ! 😘