Comment utiliser les équilibreurs de charge DigitalOcean à l’aide de Doctl

introduction

Les équilibreurs de charge DigitalOcean constituent un moyen simple de répartir le trafic HTTP, HTTPS et TCP entre plusieurs serveurs principaux. Dans ce didacticiel, nous utiliseronsdoctl - le client de ligne de commande officiel de l'API de DigitalOcean - pour créer et configurer un équilibreur de charge pour plusieurs serveurs Web principaux.

Conditions préalables

Avant de commencer ce didacticiel, vous devez vous familiariser avecdoctl et les équilibreurs de charge DigitalOcean. Les articles suivants seront utiles:

Vous devez vous assurer que la version 1.6.0 ou supérieure dedoctl est installée et authentifiée avant de continuer. Vérifiez la version de votredoctl en exécutantdoctl version. Vous devrez également ajouter une clé SSH à votre compte DigitalOcean.

[[step-1 -—- setting-up-the-backend-web-servers]] == Étape 1 - Configuration des serveurs Web principaux

Tout d'abord, nous utiliseronsdoctl pour créer les deux serveurs Web vers lesquels notre Load Balancer dirigera le trafic. Nous allons commencer par deux serveurs sur lesquels la pile LAMP (Linux, Apache, MySQL, PHP) est préinstallée et les mettre à jour pour chaque page Web unique. Cela nous aidera à vérifier que l’équilibreur de charge distribue bien les connexions entre plusieurs serveurs.

Afin de créer les deux serveurs, nous devons d’abord connaître la région dans laquelle nous voulons qu’ils se trouvent, ainsi que l’empreinte de la clé SSH que nous souhaitons utiliser. Nous utiliserons la régionnyc1 pour ce tutoriel. Vous pouvez lister toutes les régions et leurs slugs raccourcis avecdoctl:

doctl compute region list
OutputSlug    Name               Available
nyc1    New York 1         true
sfo1    San Francisco 1    true
nyc2    New York 2         true
ams2    Amsterdam 2        true
sgp1    Singapore 1        true
lon1    London 1           true
nyc3    New York 3         true
ams3    Amsterdam 3        true
fra1    Frankfurt 1        true
tor1    Toronto 1          true
sfo2    San Francisco 2    true
blr1    Bangalore 1        true

Choisissez la limace pour la région de votre choix.

[.note] #Note: Votre équilibreur de charge et ses gouttelettes cibles doivent tous se trouver dans la même région.
#

Pour trouver votre empreinte digitale de clé SSH, utilisez à nouveaudoctl:

doctl compute ssh-key list
OutputID         Name          FingerPrint
7738555    sammy@host    your_ssh_key_fingerprint

Dans la sortie, notez l’empreinte de la clé SSH que vous utiliserez. Nous en aurons besoin pour la prochaine commande.

Nous allons utiliser une image de pile LAMP en un clic sous Ubuntu 16.04, et nous placerons cette information sur un droplet de 512 Mo. Les différentes options disponibles pour les images et les tailles de gouttelettes peuvent également être répertoriées avecdoctl, à l'aide de la commandelist. Vous pouvez en savoir plus à ce sujet dans lesCreating, Deleting, and Inspecting Droplets section de l'article prérequis.

Maintenant que nous avons toutes nos informations, nous pouvons créer les deux serveurs en une seule commande:

doctl compute droplet create web-1 web-2 \
    --region nyc1 \
    --image lamp-16-04 \
    --ssh-keys your_ssh_key_fingerprint \
    --enable-private-networking \
    --size 512mb

web-1 etweb-2 seront les noms des serveurs. Nous avons également sélectionné--enable-private-networking. Cela garantira que le trafic de l'équilibreur de charge vers les droplets cibles restera sur le réseau privé non mesuré de DigitalOcean.

La commandecreate affichera des informations sur les nouvelles gouttelettes:

OutputID          Name     Public IPv4    Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48463543    web-1                                                  512       1        20      nyc1      Ubuntu LAMP on 16.04    new
48463544    web-2                                                  512       1        20      nyc1      Ubuntu LAMP on 16.04    new

Nos deux serveurs sont maintenant approvisionnés. Attendez quelques minutes que le processus se termine, puis répertoriez vos gouttelettes Web:

doctl compute droplet list web-*

La commandelist accepte le caractère générique*. Dans ce cas, nous afficherons uniquement les gouttelettes avec au moinsweb- dans leur nom:

OutputID          Name      Public IPv4        Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48603683    web-1    111.111.111.111     111.111.111.333                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active
48603684    web-2    111.111.111.222     111.111.111.444                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active

Notez que les gouttelettes ont maintenant des adresses IPv4 attribuées et sont répertoriées commeactive. Si vous naviguez jusqu’à l’une des adresses publiques des gouttelettes dans votre navigateur Web, une page d’emplacement réservé Apache par défaut sera chargée. Ajoutons une nouvelle page unique à chacun, afin que nous puissions distinguerweb-1 deweb-2.

Nous pouvons SSH sur notre serveur viadoctl:

doctl compute ssh web-1

Cela vous connectera et vous connectera en tant queroot en utilisant la clé SSH que vous avez spécifiée lors de la création. Ouvrez un nouveau fichier HTML sur le serveur. Nous utiliserons l'éditeur de texte denano:

nano /var/www/html/test.html

Collez le fragment HTML suivant:

/var/www/html/test.html

Hello from web-1!

Enregistrez le fichier et quittez l'éditeur de texte. Ce n’est pas un fichier HTML complet, mais les navigateurs pardonnent et c’est suffisant pour nos besoins.

Accédez à l'adresse suivante pour vous assurer que la nouvelle page est correctement servie. Assurez-vous de substituer l'adresse IP correcte à la partie mise en évidence:

http://web-1_public_ip_address/test.html

Sur la page, vous devriez voir le titreHello from web-1! que nous venons de créer.

Quittez la session SSH:

exit

Maintenant, lancez SSH sur le second serveur et répétez le processus en utilisant un message différent dans la page HTML:

doctl compute ssh web-2

Ouvrez le nouveau fichier HTML:

nano /var/www/html/test.html

Coller dans le contenu:

/var/www/html/test.html

Hello from web-2!

Enregistrez et quittez l'éditeur de texte, puis quittez la session SSH:

exit

Utilisez votre navigateur pour vérifier queweb-2 sert également correctement la nouvelle page Web. Si tel est le cas, nous sommes prêts à créer un équilibreur de charge pour répartir la charge entre nos deux serveurs.

[[step-2 -—- creating-a-load-balancer]] == Étape 2 - Création d'un Load Balancer

Nous allons créer notre nouvel équilibreur de charge dans la régionnyc1. Notez à nouveau que l'équilibreur de charge et ses gouttelettes cibles doivent se trouver dans la même région. Veillez donc à utiliser la région dans laquelle se trouvent vos gouttelettes:

doctl compute load-balancer create \
    --name load-balancer-1 \
    --region nyc1 \
    --forwarding-rules entry_protocol:http,entry_port:80,target_protocol:http,target_port:80

Cette commande crée un équilibreur de charge avec le nomload-balancer-1 dans la régionnyc1. Chaque Load Balancer a besoin d'au moins une règle sous l'indicateur--forwarding-rules. Ces règles décrivent comment l’équilibreur de charge acceptera le trafic et comment il le transmettra aux cibles. La règle de transfert ci-dessus indique que nous transférons le trafic HTTP sur le port 80 directement aux serveurs cibles.

Les autres options de protocole--forwarding-rules sonthttps ettcp, et vous pouvez choisir n'importe quel port valide pour l'entrée et la cible. Si vous devez spécifier plusieurs règles de transfert, entourez la liste complète des règles entre guillemets et utilisez un espace entre chaque règle. Voici un exemple permettant d’activer le transfert HTTP et HTTPS:

--forwarding-rules "entry_protocol:http,entry_port:80,target_protocol:http,target_port:80 entry_protocol:https,entry_port:443,target_protocol:https,target_port:443"

La commandecreate que nous venons d'exécuter affichera des informations sur notre nouvel équilibreur de charge:

OutputID                                      IP    Name               Status    Created At              Algorithm      Region    Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                   Forwarding Rules
ae3fa042-bfd2-5e94-b564-c352fc6874ef          load-balancer-1    new       2017-05-10T19:28:30Z    round_robin    nyc1                            false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3    entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false

Prenez note de l’ID de l’équilibreur de charge, mis en évidence ci-dessus, que nous utiliserons à l’étape suivante pour ajouter nos gouttelettes cibles. Vous trouverez également des informations sur certaines configurations par défaut que nous n’avons pas définies, telles que les règles de vérification de l’état d’intégrité et les sessions persistantes. Vous pouvez trouver plus d'informations sur ces options dans lesprerequisite load balancer article. Pour savoir comment définir ces options à l'aide dedoctl, vous pouvez toujours exécuter la commandecreate avec un indicateur--help. Pour la création de Load Balancer, cela ressemblerait à ceci:

doctl compute load-balancer create --help

Cela produira une liste de tous les drapeaux et options de ligne de commande disponibles. Vous pouvez utiliser cet indicateur--help sur n'importe quelle commandedoctl.

Maintenant que notre équilibreur de charge est créé, nous devons y ajouter les gouttelettes cibles. Nous ferons cela dans la section suivante.

[[step-3 -–- ajoutant-droplets-to-the-load-balancer]] == Étape 3 - Ajout de droplets à Load Balancer

Répertorions à nouveau les informations concernant nos deux gouttelettes afin d’obtenir leurs identifiants:

doctl compute droplet list web-*
OutputID          Name      Public IPv4        Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48603683    web-1    111.111.111.111    111.111.111.333                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active
48603684    web-2    111.111.111.222     111.111.111.444                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active

Les ID sont mis en évidence dans l'exemple de sortie ci-dessus. Be sure to use your actual IDs, not the examples.

Nous utilisons maintenant la commandeadd-droplets pour ajouter les Droplets cibles à notre Load Balancer. Spécifiez l'ID de l'équilibreur de charge créé à l'étape précédente:

doctl compute load-balancer add-droplets
    ae3fa042-bfd1-4e94-b564-c352fc6874ef \
    --droplet-ids 48463543,48463544

Nous pouvons maintenant utiliser la commandeget pour récupérer les informations mises à jour pour notre équilibreur de charge:

doctl compute load-balancer get ae3fa042-bfd1-4e94-b564-c352fc6874ef
OutputID                                      IP                Name               Status    Created At              Algorithm      Region    Tag    Droplet IDs          SSL      Sticky Sessions                                Health Check                                                                                                                   Forwarding Rules
ae3fa042-bfd1-4e94-b564-c352fc6874ef    111.111.111.555    load-balancer-1    active    2017-05-10T19:28:30Z    round_robin    nyc1             48603683,48603684    false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3    entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false

Notez que le statut est maintenantactive, nous avons une adresse IP attribuée et nos gouttelettes cibles sont répertoriées. Accédez à cette nouvelle adresse IP à charge équilibrée dans votre navigateur, en chargeant à nouveau la pagetest.html. L'URL ressemblera à:

http://load-balancer-1_ip_address/test.html

Votre navigateur chargera le message depuisweb-1 ouweb-2. Actualisez la page et vous devriez voir le message de l’autre serveur. Notre Load Balancer est en moderound robin, ce qui signifie qu'il envoie des connexions au prochain Droplet de la liste pour chaque requête. L'alternative est le modeleast connections, où l'équilibreur de charge envoie un nouveau trafic vers la cible qui a le moins de connexions actives.

Maintenant que nous savons que notre Load Balancer fonctionne, désactivons un serveur et voyons comment il gère l’interruption.

[[step-4 -–- testing-fail-over]] == Étape 4 - Test du basculement

Un des grands avantages des équilibreurs de charge est leur tolérance accrue aux problèmes de serveurs Web principaux individuels. L'équilibreur de charge exécute une vérification de l'intégrité à des intervalles prédéterminés (toutes les 10 secondes par défaut). La vérification de l'intégrité par défaut consiste à récupérer une page Web sur le serveur cible. Si cette vérification échoue plusieurs fois de suite, la cible est retirée de la rotation et aucun trafic ne lui est envoyé jusqu'à ce qu'elle récupère.

Testons la fonctionnalité de basculement en échouant le test de santé. SSH de nouveau dansweb-2:

doctl compute ssh web-2

Maintenant, fermez le serveur Web Apache:

systemctl stop apache2

Retournez dans le navigateur et actualisez la page à charge équilibrée à quelques reprises. Au début, vous pourriez avoir quelques erreurs503 Service Unavailable. Par défaut, Load Balancer attend l'échec de trois vérifications de l'intégrité avant de supprimer un serveur du pool. Cela prendra environ trente secondes. Après cela, vous ne verrez que les réponses deweb-1.

Démarrez la sauvegarde Apache surweb-2:

systemctl start apache2

Encore une fois, après un court laps de temps, l'équilibreur de charge détectera queweb-2 est actif et il sera de nouveau ajouté au pool. Vous commencerez à voir les réponses deweb-2 lors de l'actualisation de la page.

Votre équilibreur de charge est maintenant de nouveau en pleine santé.

Lisez la suite pour connaître les prochaines étapes à suivre pour rendre votre système Load Balancer prêt pour la production.

Conclusion

Dans ce didacticiel, nous avons utilisédoctl pour créer un équilibreur de charge DigitalOcean et certains serveurs Web principaux, configuré l'équilibreur de charge pour envoyer le trafic HTTP aux serveurs principaux et testé la fonctionnalité de vérification de l'état de l'équilibreur de charge. Il existe encore quelques étapes à suivre pour préparer votre Load Balancer en vue de sa production:

  • Vous souhaiterez pointer un nom de domaine vers votre équilibreur de charge afin que vos utilisateurs ne tapent pas une adresse IP indésirable. Vous pouvez apprendre comment faire cela avec notre tutorielHow To Set Up a Host Name with DigitalOcean.

  • DigitalOcean vous permet de marquer vos gouttelettes afin de les garder organisées et d’adresser des ensembles entiers de gouttelettes en groupe. Vous pouvez configurer votre équilibreur de charge pour qu'il envoie le trafic à tous les droplets d'une balise donnée, au lieu d'ajouter des gouttelettes individuellement. Cela vous permettra d'ajouter de manière plus dynamique de nouveaux serveurs principaux au pool. Vous pouvez en savoir plus sur les balises DigitalOcean dansHow To Tag DigitalOcean Droplets.

  • Si vous avez besoin d'ajouter la sécurité HTTPS à votre site Web à charge équilibrée, nous avons des tutoriels sur les deux façons différentes d'y parvenir:SSL passthrough etSSL termination.

Related