Configuration de développement : Multiconnect sur Minikube

Ce document explique comment configurer l’installation d’une machine de développement du client de l’API WhatsApp Business avec Multiconnect sur Minikube. Avant de commencer ces configurations, vérifiez notre liste de conditions requises.

Pour configurer un cluster à haute disponibilité, suivez les étapes ci-dessous :

  1. Créer un répertoire biz pour les scripts de configuration
  2. Obtenir les fichiers de configuration du client de l’API WhatsApp Business
  3. Créer une base de données MySQL
  4. Créer une clé secrète whatsapp-config
  5. Créer un volume de contenu multimédia local
  6. Définir la variable d’environnement $VERSION
  7. Déployer les conteneurs
  8. Trouver le port du conteneur Webapp
  9. Obtenir un token d’authentification
  10. Effectuer un contrôle de l’état
  11. Inscrire le client de l’API WhatsApp Business
  12. Effectuer un second contrôle de l’état

Pour configurer un cluster Multiconnect à haute disponibilité, suivez les étapes ci-dessous :

  1. Configurer deux répartitions
  2. Effectuer un contrôle de l’état
  3. Démarrer un troisième Coreapp pour maintenir la haute disponibilité
  4. Effectuer un second contrôle de l’état

Une fois que votre instance est entièrement configurée, vous pouvez choisir de la mettre à jour. Pour désinstaller le client, suivez ces étapes.

Avant de commencer

Vous aurez besoin des éléments suivants :

  • Un cluster Kubernetes configuré localement avec minikube
  • L’outil de ligne de commande kubectl
  • Un compte de test configuré localement dans un environnement de développement
    • Il assure un développement rapide et permettra de tester les nouvelles versions.

Il est également fortement recommandé de lire le guide sur la disponibilité et la mise à l’échelle pour en savoir plus sur la haute disponibilité et Multiconnect.

Configurer un cluster à haute disponibilité

Étape 1 : Créer un répertoire biz pour les scripts de configuration

Exécutez le code suivant à l’emplacement de votre choix pour le client de l’API WhatsApp Business :

mkdir ~/biz; cd ~/biz;

Étape 2 : Obtenir les fichiers de configuration du client de l’API WhatsApp Business

Clonez tous les fichiers de configuration situés dans le répertoire installation/kubernetes du dépôt GitHub WhatsApp-Business-API-Setup-Scripts GitHub dans le répertoire ~/biz que vous avez créé à l’étape 1.

Étape 3 : Créer une base de données MySQL

Utilisez la commande suivante pour créer une base de données MySQL avec un volume persistant :

kubectl apply -f mysql.yaml

Le résultat obtenu doit ressembler à l’exemple suivant :

persistentvolume/mysql-volume created
persistentvolumeclaim/mysql-volume-claim created
service/mysql-service created
deployment.extensions/mysql-deployment created

Utilisez la commande suivante pour vérifier que MySQL fonctionne :

kubectl get pods

Le résultat obtenu doit ressembler à l’exemple suivant :

NAME                               READY   STATUS    RESTARTS   AGE
mysql-deployment-5d4f898-xtkpj     1/1     Running   0          53m

Étape 4 : Créer une clé secrète whatsapp-config

Créez une clé secrète whatsapp-config à partir du fichier db.env en exécutant la commande suivante :

kubectl create secret generic whatsapp-config --from-env-file=db.env

Le résultat obtenu doit ressembler à l’exemple suivant :

secret/whatsapp-config created

Utilisez la commande suivante pour vérifier que la clé a été créée :

kubectl get secrets

Le résultat obtenu doit ressembler à l’exemple suivant :

NAME                TYPE        DATA        AGE
whatsapp-config     Opaque      5           52s

Utilisez la commande suivante pour vérifier les informations sur la clé secrète :

kubectl describe secrets/whatsapp-config

Le résultat obtenu doit ressembler à l’exemple suivant :

Name:         whatsapp-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
wa-db-password:  8 bytes
wa-db-port:      4 bytes
wa-db-username:  4 bytes
wa-db-engine:    5 bytes
wa-db-hostname:  13 bytes

Étape 5 : Créer un volume de contenu multimédia local

Pour envoyer ou recevoir des messages au contenu multimédia, le client de l’API WhatsApp Business a besoin d’un volume persistant partagé entre les déploiements Webapp, Maître et Coreapp. Créez un PersistentVolume et une PersistentVolumeClaim pour les messages multimédias à l’aide de la commande suivante :

kubectl apply -f volume.yaml

Cette commande configurera un volume de contenu multimédia local d’une taille de 1 Go monté sur /usr/local/wamedia dans le cluster Kubernetes et lui demandera une taille physique de 1 Go via une PersistentVolumeClaim à des fins de développement et de test.

Utilisez la commande suivante pour vérifier l’état du volume de contenu multimédia et la réclamation associée :

kubectl get pv media-volume

kubectl get pvc media-volume-claim

Étape 6 : Définir la variable d’environnement $VERSION

Remplacez la variable d’environnement $VERSION par la dernière version du client de l’API WhatsApp Business (par exemple la version 2.23.4) dans la section containers des fichiers webapp.yaml, master.yaml et coreapp.yaml.

webapp.yaml

containers:
- name: whatsapp-web
  image: docker.whatsapp.biz/web:v2.23.4

master.yaml

containers:
- name: whatsapp-master
  image: docker.whatsapp.biz/coreapp:v2.23.4

coreapp.yaml

containers:
- name: whatsapp-coreapp
  image: docker.whatsapp.biz/coreapp:v2.23.4

Étape 7 : Déployer les conteneurs

Déployer les conteneurs Webapp, Maître et Coreapp en exécutant les commandes suivantes :

Webapp

kubectl apply -f webapp.yaml

Le résultat obtenu doit ressembler à l’exemple suivant :

horizontalpodautoscaler.autoscaling/whatsapp-web-autoscaler created
service/whatsapp-web-service created
deployment.apps/whatsapp-web-deployment created

Maître

kubectl apply -f master.yaml

Le résultat obtenu doit ressembler à l’exemple suivant :

horizontalpodautoscaler.autoscaling/whatsapp-master-autoscaler created
service/whatsapp-master-service created
deployment.apps/whatsapp-master-deployment created

Coreapp

kubectl apply -f coreapp.yaml

Le résultat obtenu doit ressembler à l’exemple suivant :

horizontalpodautoscaler.autoscaling/whatsapp-coreapp-autoscaler created
service/whatsapp-coreapp-service created
deployment.apps/whatsapp-coreapp-deployment created

Utilisez la commande suivante pour vérifier si le pod Maître/Coreapp/Webapp fonctionne :

kubectl get pods

Le résultat obtenu doit ressembler à l’exemple suivant :

NAME                                           READY   STATUS    RESTARTS   AGE
mysql-deployment-5d4f898-xtkpj                 1/1     Running   0          53m
whatsapp-coreapp-deployment-78c4d987b8-4cpz4   1/1     Running   0          2s
whatsapp-coreapp-deployment-78c4d987b8-l5qjj   1/1     Running   0          2s
whatsapp-master-deployment-8598d7bf6b-56fvn    1/1     Running   7          15m
whatsapp-master-deployment-8598d7bf6b-9r6lc    1/1     Running   7          16m
whatsapp-web-deployment-cd4c5785c-9vn6l        1/1     Running   0          16m
whatsapp-web-deployment-cd4c5785c-mn7kf        1/1     Running   0          16m

Les configurations par défaut créeront deux pods Maître, deux pods Coreapp et deux pods Webapp. 128 Mo de mémoire et 0,15 UC sont nécessaires pour chaque pod. Modifiez spec.template.spec.containers.resources dans les fichiers YAML respectifs si vous souhaitez utiliser d’autres paramètres de ressources.

Étape 8 : Trouver le port du conteneur Webapp

Vous pouvez télécharger et configurer notre collection Postman pour interagir avec l’API WhatsApp Business si vous ne souhaitez pas utiliser la ligne de commande.

Lorsque vous exécutez un cluster Kubernetes avec Minikube, vous devez vérifier l’adresse IP du cluster Kubernetes à l’aide de la commande suivante :

minikube ip

Utilisez la commande suivante pour trouver le port sur lequel le conteneur Webapp s’exécute :

kubectl get services/whatsapp-web-service

Le résultat obtenu doit ressembler à l’exemple suivant :

NAME                   TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
whatsapp-web-service   NodePort   10.101.114.46   <none>        443:32477/TCP   25m

Dans cet exemple, le port 443 inclus dans le conteneur Webapp est mappé au port 32477 du cluster Kubernetes.

Vous devez utiliser https://your-minikube-cluster-ip:your-webapp-service-targetport (par exemple https://10.101.114.46:32477) comme URL racine de l’API lorsque vous utilisez la collection Postman.

Étape 9 : Obtenir un token d’authentification

Connectez-vous au client de l’API WhatsApp Business pour obtenir un token d’authentification Bearer afin d’effectuer des appels d’API.

Étape 10 : Effectuer un contrôle de l’état

Vous pouvez contrôler l’état du client de l’API WhatsApp Business en envoyant un appel d’API au nœud health afin de vérifier que tous les pods s’exécutent correctement.

Le résultat obtenu doit ressembler à l’exemple suivant :

'health': {
    '172.17.0.11:whatsapp-coreapp-deployment-78c4d987b8-l5qjj': {
        'errors': [
            {
                'code': 1011,
                'title': 'Service not ready',
                'details': 'Wacore is not instantiated. Please check wacore log for details.'
            }
        ]
    },
    '172.17.0.6:whatsapp-master-deployment-8598d7bf6b-56fvn': {
        'errors': [
            {
                'code': 1011,
                'title': 'Service not ready',
                'details': 'Wacore is not instantiated. Please check wacore log for details.'
            }
        ]
    },
    '172.17.0.7:whatsapp-coreapp-deployment-78c4d987b8-4cpz4': {
        'errors': [
            {
                'code': 1011,
                'title': 'Service not ready',
                'details': 'Wacore is not instantiated. Please check wacore log for details.'
            }
        ]
    },
    '172.17.0.8:whatsapp-master-deployment-8598d7bf6b-9r6lc': {
        'gateway_status': 'unregistered',
        'role': 'primary_master'
    }
},
'meta': {
    'version': 'v2.23.4',
    'api_status': 'stable'
}

La réponse affiche un gateway_statusunregistered comme gateway_status pour le conteneur Maître principal, car le client de l’API WhatsApp Business n’est pas encore inscrit.

Étape 11 : Inscrire le client de l’API WhatsApp Business

Vous pouvez inscrire votre client de l’API WhatsApp Business en envoyant un appel d’API au nœud account.

Étape 12 : Effectuer un second contrôle de l’état

Effectuez un autre contrôle de l’état du client de l’API WhatsApp Business en utilisant un appel d’API sur le nœud health après avoir finalisé l’inscription et assurez-vous que l’un des conteneurs Coreapp a un gateway_statusconnected.

Le résultat obtenu doit ressembler à l’exemple suivant :

'health': {
    '172.17.0.11:whatsapp-coreapp-deployment-78c4d987b8-l5qjj': {
        'gateway_status': 'disconnected',
        'role': 'coreapp'
    },
    '172.17.0.6:whatsapp-master-deployment-8598d7bf6b-56fvn': {
        'gateway_status': 'disconnected',
        'role': 'secondary_master'
    },
    '172.17.0.7:whatsapp-coreapp-deployment-78c4d987b8-4cpz4': {
        'gateway_status': 'connected',
        'role': 'coreapp'
    },
    '172.17.0.8:whatsapp-master-deployment-8598d7bf6b-9r6lc': {
        'gateway_status': 'disconnected',
        'role': 'primary_master'
    }
},
'meta': {
    'version': 'v2.23.4',
    'api_status': 'stable'
}

Remarque : en mode haute disponibilité, un seul Coreapp (whatsapp-coreapp-deployment-78c4d987b8-4cpz4 dans cet exemple) sera connecté au serveur WhatsApp. Tous les autres pods, y compris le Maître principal, auront un gateway_statusdisconnected. Si whatsapp-coreapp-deployment-78c4d987b8-4cpz4 tombe en panne, whatsapp-coreapp-deployment-78c4d987b8-l5qjj le remplacera et se connectera au serveur WhatsApp pour maintenir la haute disponibilité.

Vous avez désormais configuré le client de l’API WhatsApp Business en mode haute disponibilité. Dans ce mode, seul un Coreapp peut se connecter au serveur WhatsApp pour envoyer des messages à tout moment. Si vous souhaitez que plusieurs Coreapp envoient des messages simultanément pour augmenter le débit des messages, suivez les étapes de la section Configurer un cluster Multiconnect à haute disponibilité ci-dessous.

Configurer un cluster Multiconnect à haute disponibilité

Étape 1 : Configurer deux partitions

Utilisez le point de terminaison « shards » pour configurer deux partitions. La réponse HTTP devrait renvoyer l’état 201 Created.

Étape 2 : Effectuer un contrôle de l’état

Vous pouvez contrôler l’état du client de l’API WhatsApp Business en envoyant un appel d’API au nœud health afin de vérifier que tous les pods s’exécutent correctement.

Le résultat obtenu doit ressembler à l’exemple suivant :

'health': {
    '172.17.0.11:whatsapp-coreapp-deployment-78c4d987b8-l5qjj': {
        'gateway_status': 'connected',
        'role': 'coreapp'
    },
    '172.17.0.6:whatsapp-master-deployment-8598d7bf6b-56fvn': {
        'gateway_status': 'disconnected',
        'role': 'secondary_master'
    },
    '172.17.0.7:whatsapp-coreapp-deployment-78c4d987b8-4cpz4': {
        'gateway_status': 'connected',
        'role': 'coreapp'
    },
    '172.17.0.8:whatsapp-master-deployment-8598d7bf6b-9r6lc': {
        'gateway_status': 'connected',
        'role': 'primary_master'
    }
},
'meta': {
    'version': 'v2.23.4',
    'api_status': 'stable'
}

Remarque : en mode MultiConnect avec deux répartitions, deux Coreapp (whatsapp-coreapp-deployment-78c4d987b8-l5qjj et whatsapp-coreapp-deployment-78c4d987b8-4cpz4 dans cet exemple) seront connectés au serveur WhatsApp, et le Maître principal (whatsapp-master-deployment-8598d7bf6b-9r6lc dans cet exemple) se connectera au serveur WhatsApp.

Étape 3 : Démarrer un troisième Coreapp pour maintenir la haute disponibilité

Dans cet exemple, nous avons pour l’instant deux conteneurs Coreapp et la charge des messages est répartie entre eux. Cependant, si l’un des conteneurs Coreapp tombe en panne, la moitié des messages ne sera pas envoyée. Afin de maintenir la haute disponibilité dans cette nouvelle configuration Multiconnect, vous pouvez démarrer un troisième Coreapp pour tolérer l’échec d’un Coreapp semblable au diagramme figurant dans l’introduction à Multiconnect.

Pour démarrer le troisième conteneur Coreapp, remplacez le nombre de replicas par 3 dans le fichier coreapp.yaml :

spec:
  replicas: 3

Ensuite, redéployez le Coreapp en exécutant la commande suivante :

kubectl apply -f coreapp.yaml

Le résultat obtenu doit ressembler à l’exemple suivant :

horizontalpodautoscaler.autoscaling/whatsapp-coreapp-autoscaler unchanged
service/whatsapp-coreapp-service unchanged
deployment.apps/whatsapp-coreapp-deployment configured

Étape 4 : Effectuer un second contrôle de l’état

Effectuez un autre contrôle de l’état pour vérifier que tous les nœuds fonctionnent correctement en envoyant un appel d’API au nœud health .

Le résultat obtenu doit ressembler à l’exemple suivant :

'health': {
    '172.17.0.10:whatsapp-coreapp-deployment-78c4d987b8-hwqp6': {
        'gateway_status': 'disconnected',
        'role': 'coreapp'
    },
    '172.17.0.11:whatsapp-coreapp-deployment-78c4d987b8-l5qjj': {
        'gateway_status': 'connected',
        'role': 'coreapp'
    },
    '172.17.0.6:whatsapp-master-deployment-8598d7bf6b-56fvn': {
        'gateway_status': 'disconnected',
        'role': 'secondary_master'
    },
    '172.17.0.7:whatsapp-coreapp-deployment-78c4d987b8-4cpz4': {
        'gateway_status': 'connected',
        'role': 'coreapp'
    },
    '172.17.0.8:whatsapp-master-deployment-8598d7bf6b-9r6lc': {
        'gateway_status': 'connected',
        'role': 'primary_master'
    }
},
'meta': {
    'version': 'v2.23.4',
    'api_status': 'stable'
}

Le nouveau conteneur whatsapp-coreapp-deployment-78c4d987b8-hwqp6 agit maintenant comme conteneur de secours, mais il n’est actuellement pas connecté au serveur WhatsApp. Si whatsapp-coreapp-deployment-78c4d987b8-l5qjj ou whatsapp-coreapp-deployment-78c4d987b8-4cpz4stops working, cesse de fonctionner, whatsapp-coreapp-deployment-78c4d987b8-hwqp6` se connectera au serveur WhatsApp pour maintenir un nombre total de deux répartitions.

Mise à jour du client de l’API WhatsApp Business

Il y aura un temps d’arrêt pendant la mise à jour.

Il est fortement recommandé de sauvegarder vos paramètres d’application avant de lancer une mise à jour afin de vous assurer de pouvoir reprendre votre activité rapidement. Veuillez consulter la documentation sur la sauvegarde et la restauration.

Il est toujours recommandé d’effectuer les mises à jour pendant les heures creuses.

Étape 1 : Définir la variable d’environnement $VERSION sur la nouvelle version

Mettez à jour la variable d’environnement $VERSION en indiquant la version que vous souhaitez utiliser (par exemple la version 2.23.5) dans la section containers des fichiers webapp.yaml, master.yaml et coreapp.yaml.

webapp.yaml

containers:
- name: whatsapp-web
  image: docker.whatsapp.biz/web:v2.23.5

master.yaml

containers:
- name: whatsapp-master
  image: docker.whatsapp.biz/coreapp:v2.23.5

coreapp.yaml

containers:
- name: whatsapp-coreapp
  image: docker.whatsapp.biz/coreapp:v2.23.5

Étape 2 : Mettre à niveau les conteneurs

Mettez à niveau les conteneurs Webapp, Maître et Coreapp, et surveillez l’état du déploiement.

Webapp

kubectl apply -f webapp.yaml

Le résultat obtenu doit ressembler à l’exemple suivant :

kubectl rollout status deployments/whatsapp-web-deployment

Maître

kubectl apply -f master.yaml

Le résultat obtenu doit ressembler à l’exemple suivant :

kubectl rollout status deployments/whatsapp-master-deployment

Coreapp

kubectl apply -f coreapp.yaml

Le résultat obtenu doit ressembler à l’exemple suivant :

kubectl rollout status deployments/whatsapp-coreapp-deployment

Désinstallation du client de l’API WhatsApp Business

Étape 1 : Supprimer les déploiements

Utilisez la commande suivante pour supprimer les déploiements :

kubectl delete -f webapp.yaml
kubectl delete -f master.yaml
kubectl delete -f coreapp.yaml
kubectl delete -f mysql.yaml

Étape 2 : Supprimer le volume

Utilisez la commande suivante pour supprimer le volume :

kubectl delete -f volume.yaml

Étape 3 : Supprimer la clé secrète

Utilisez la commande suivante pour supprimer la clé secrète :

kubectl delete secrets/whatsapp-config

Résolution des problèmes

Utilisez la commande suivante pour vérifier si tous les pods fonctionnent :

kubectl get pods

Le résultat obtenu doit ressembler à l’exemple suivant :

NAME                                           READY   STATUS    RESTARTS   AGE
mysql-deployment-5d4f898-xtkpj                 1/1     Running   0          1h
whatsapp-coreapp-deployment-78c4d987b8-4cpz4   1/1     Running   2          1h
whatsapp-coreapp-deployment-78c4d987b8-hwqp6   1/1     Running   0          24m
whatsapp-coreapp-deployment-78c4d987b8-l5qjj   1/1     Running   2          1h
whatsapp-master-deployment-8598d7bf6b-56fvn    1/1     Running   9          1h
whatsapp-master-deployment-8598d7bf6b-9r6lc    1/1     Running   8          1h
whatsapp-web-deployment-cd4c5785c-f99n4        1/1     Running   0          50m
whatsapp-web-deployment-cd4c5785c-s5phx        1/1     Running   0          50m

Si un pod n’est pas prêt (c’est-à-dire si 0/1 s’affiche dans la colonne READY), vous pouvez obtenir les journaux le concernant en exécutant la commande kubectl logs suivie du nom du pod.

Exemple :

kubectl logs whatsapp-coreapp-deployment-78c4d987b8-4cpz4 > whatsapp-coreapp-deployment-78c4d987b8-4cpz4.txt

Vous trouverez alors les journaux dans le fichier whatsapp-coreapp-deployment-78c4d987b8-4cpz4.txt enregistré dans le répertoire actuel.

Pour collecter des journaux d’un service déployé spécifique, comme la Webapp, exécutez la commande kubectl logs suivie du nom du service.

Exemple :

kubectl logs deployments/whatsapp-web-deployment > whatsapp-web-deployment.txt

Vous trouverez les journaux dans le fichier whatsapp-web-deployment.txt enregistré dans le répertoire actuel.


Ce logiciel utilise le code de FFmpeg sous licence du LGPLv2.1 et sa source peut être téléchargée ici.