В этом документе рассказывается, как настроить установку клиента WhatsApp Business API с распределением нагрузки на машине разработчика с Minikube. Прежде, чем начинать эти настройки, ознакомьтесь со списком требований.
Чтобы настроить кластер высокой доступности, выполните следующие действия:
biz
для скриптов настройкиwhatsapp-config
.$VERSION
.Чтобы настроить кластер с распределением нагрузки, выполните следующие действия:
После полной настройки экземпляр можно обновить. Чтобы удалить клиент, выполните эти действия.
Вам понадобятся:
minikube
;kubectl
;Рекомендуем также ознакомиться с этим руководством, чтобы узнать подробнее о повышенной доступности и распределении нагрузки.
biz
для скриптов настройкиВыполните следующий код в каталоге, где будет установлен клиент WhatsApp Business API:
mkdir ~/biz; cd ~/biz;
Клонируйте все файлы конфигурации из каталога installation/kubernetesрепозитория GitHub WhatsApp-Business-API-Setup-Scripts в каталог ~/biz
, созданный на шаге 1.
Создайте базу данных MySQL с постоянным томом, выполнив следующую команду:
kubectl apply -f mysql.yaml
Ответ должен выглядеть так:
persistentvolume/mysql-volume created persistentvolumeclaim/mysql-volume-claim created service/mysql-service created deployment.extensions/mysql-deployment created
Чтобы убедиться, что MySQL работает, выполните следующую команду:
kubectl get pods
Ответ должен выглядеть так:
NAME READY STATUS RESTARTS AGE mysql-deployment-5d4f898-xtkpj 1/1 Running 0 53m
whatsapp-config
Создайте секрет whatsapp-config
с помощью файла db.env
, выполнив следующую команду:
kubectl create secret generic whatsapp-config --from-env-file=db.env
Ответ должен выглядеть так:
secret/whatsapp-config created
Чтобы убедиться, что секрет создан, выполните следующую команду:
kubectl get secrets
Ответ должен выглядеть так:
NAME TYPE DATA AGE whatsapp-config Opaque 5 52s
Чтобы проверить детали секрета, выполните следующую команду:
kubectl describe secrets/whatsapp-config
Ответ должен выглядеть так:
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
Чтобы отправлять и получать сообщения с медиафайлами, клиенту WhatsApp Business API необходим постоянный том, который могут использовать узлы Webapp, Coreapp и основной узел. Чтобы создать PersistentVolume
и PersistentVolumeClaim
для сообщений с медиафайлами, выполните следующую команду:
kubectl apply -f volume.yaml
Эта команда настроит локальный том для медиафайлов по адресу /usr/local/wamedia
в кластере Kubernetes размером 1 ГБ и запросит 1 ГБ физического хранилища в нем с помощью PersistentVolumeClaim
для разработки и тестирования.
Чтобы проверить статус тома для медиафайлов и запроса объема хранилища для них, выполните следующую команду:
kubectl get pv media-volume kubectl get pvc media-volume-claim
$VERSION
Подставьте в переменную среды $VERSION
в разделе containers
файлов webapp.yaml
, master.yaml
и coreapp.yaml
последнюю версию клиента WhatsApp Business API (например, 2.23.4
).
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
Разверните контейнеры Webapp, Coreapp и основной контейнер, выполнив следующие команды:
Webapp
kubectl apply -f webapp.yaml
Ответ должен выглядеть так:
horizontalpodautoscaler.autoscaling/whatsapp-web-autoscaler created service/whatsapp-web-service created deployment.apps/whatsapp-web-deployment created
Основной
kubectl apply -f master.yaml
Ответ должен выглядеть так:
horizontalpodautoscaler.autoscaling/whatsapp-master-autoscaler created service/whatsapp-master-service created deployment.apps/whatsapp-master-deployment created
Coreapp
kubectl apply -f coreapp.yaml
Ответ должен выглядеть так:
horizontalpodautoscaler.autoscaling/whatsapp-coreapp-autoscaler created service/whatsapp-coreapp-service created deployment.apps/whatsapp-coreapp-deployment created
Чтобы убедиться, что основной модуль, модуль Coreapp или Webapp работают, выполните следующую команду:
kubectl get pods
Ответ должен выглядеть так:
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
В конфигурации по умолчанию будет создано 2 основных модуля, 2 модуля Coreapp и 2 модуля Webapp. Каждый модуль запрашивает 128 МБ памяти и 0,15 % мощности процессоров. Если вам нужны другие настройки ресурсов, сделайте изменения в разделе spec.template.spec.containers.resources
соответствующих файлов YAML.
Если вы не хотите использовать командную строку для работы с WhatsApp Business API, скачайте и настройте нашу коллекцию Postman.
Если вы запускаете кластер Kubernetes с помощью Minikube, необходимо проверить IP-адрес кластера Kubernetes. Для этого выполните следующую команду:
minikube ip
Чтобы найти порт, на котором работает контейнер Webapp, выполните следующую команду:
kubectl get services/whatsapp-web-service
Ответ должен выглядеть так:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE whatsapp-web-service NodePort 10.101.114.46 <none> 443:32477/TCP 25m
В этом примере порт 443
в контейнере Webapp сопоставляется порту 32477
в кластере Kubernetes.
При использовании коллекции Postman в качестве корневого URL API необходимо использовать https://your-minikube-cluster-ip:your-webapp-service-targetport
(например, https://10.101.114.46:32477).
Войдите в клиент WhatsApp Business API и получите маркер аутентификации Bearer для выполнения вызовов API.
Чтобы проверить работоспособность клиента WhatsApp Business API, выполните вызов API к узлу health
и убедитесь, что все модули работают правильно.
Ответ должен выглядеть так:
'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' }
В ответе gateway_status
gateway_status
для главного основного контейнера имеет значение unregistered
, так как клиент WhatsApp Business API ещё не зарегистрирован.
Чтобы зарегистрировать клиент WhatsApp Business API, выполните вызов API к узлу account
.
После регистрации ещё раз проверьте работоспособность клиента WhatsApp Business API, выполнив вызов API к узлу health
, и убедитесь в том, что один из контейнеров Coreapp имеет gateway_status
со значением connected
.
Ответ должен выглядеть так:
'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' }
Примечание. В режиме повышенной готовности к серверу Whatsapp будет подключен только один модуль Coreapp (в примере это whatsapp-coreapp-deployment-78c4d987b8-4cpz4
). Все остальные модули, в том числе главный основной, будут иметь статус (gateway_status
) disconnected
. Если whatsapp-coreapp-deployment-78c4d987b8-4cpz4
выйдет из строя, whatsapp-coreapp-deployment-78c4d987b8-l5qjj
заменит его и подключится к серверу WhatsApp для сохранения повышенной доступности.
Теперь нужно настроить клиент WhatsApp Business API в режиме повышенной доступности. В этом режиме подключаться к серверу WhatsApp для отправки сообщений может только один узел Coreapp. Если вам нужно отправлять много сообщений с нескольких узлов Coreapp одновременно, настройте распределение нагрузки, как описано ниже.
С помощью конечной точки сегментов настройте два сегмента. В ответе HTTP должен быть указан статус 201 Created
.
Чтобы проверить работоспособность клиента WhatsApp Business API, выполните вызов API к узлу health
и убедитесь, что все модули работают правильно.
Ответ должен выглядеть так:
'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' }
Примечания. В режиме распределения нагрузки с использованием 2 сегментов к серверу WhatsApp будут подключены 2 контейнера Coreapp (в примере это whatsapp-coreapp-deployment-78c4d987b8-l5qjj
и whatsapp-coreapp-deployment-78c4d987b8-4cpz4
) и главный основной контейнер (в примере это whatsapp-master-deployment-8598d7bf6b-9r6lc
).
На этом этапе у вас есть два контейнера Coreapp, несущие одинаковую нагрузку по обработке сообщений. Однако если один из контейнеров выйдет из строя, половина сообщений не будет доставлена. Чтобы сохранить повышенную доступность в среде с распределением нагрузки, можно запустить третий контейнер Coreapp, который примет на себя нагрузку при отказе одного из двух первых. Подобная структура показана на схеме во введении.
Чтобы запустить третий контейнер Coreapp, установите для параметра replicas
в файле coreapp.yaml
значение 3
:
spec: replicas: 3
Затем заново разверните Coreapp, выполнив следующую команду:
kubectl apply -f coreapp.yaml
Ответ должен выглядеть так:
horizontalpodautoscaler.autoscaling/whatsapp-coreapp-autoscaler unchanged service/whatsapp-coreapp-service unchanged deployment.apps/whatsapp-coreapp-deployment configured
Ещё раз проверьте работоспособность всех узлов, выполнив вызов API к узлу health
.
Ответ должен выглядеть так:
'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' }
Сейчас новый контейнер (в примере это whatsapp-coreapp-deployment-78c4d987b8-hwqp6
) находится в состоянии готовности, но не подключен к серверу WhatsApp. Если whatsapp-coreapp-deployment-78c4d987b8-l5qjj
или whatsapp-coreapp-deployment-78c4d987b8-4cpz4 перестанет работать (stops working,
), whatsapp-coreapp-deployment-78c4d987b8-hwqp6 подключится к серверу WhatsApp, и общее количество сегментов останется равным 2.
Во время обновления будьте готовы к простою.
Перед обновлением настоятельно рекомендуем создать резервную копию текущих настроек приложения, чтобы их можно было быстро восстановить. Следуйте инструкциям из статьи Резервное копирование и восстановление настроек.
Все обновления рекомендуется выполнять в периоды наименьшей активности.
$VERSION
Установите для переменной среды $VERSION
в разделе containers
файлов webapp.yaml
, master.yaml
и coreapp.yaml
значение версии, до которой вы хотите выполнить обновление (например, 2.23.5
).
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
Обновите контейнеры Webapp, Coreapp и основной контейнер и проконтролируйте статус развертывания.
Webapp
kubectl apply -f webapp.yaml
Ответ должен выглядеть так:
kubectl rollout status deployments/whatsapp-web-deployment
Основной
kubectl apply -f master.yaml
Ответ должен выглядеть так:
kubectl rollout status deployments/whatsapp-master-deployment
Coreapp
kubectl apply -f coreapp.yaml
Ответ должен выглядеть так:
kubectl rollout status deployments/whatsapp-coreapp-deployment
Чтобы удалить развертывания, выполните следующие команды:
kubectl delete -f webapp.yaml kubectl delete -f master.yaml kubectl delete -f coreapp.yaml kubectl delete -f mysql.yaml
Чтобы удалить том, выполните следующую команду:
kubectl delete -f volume.yaml
Чтобы удалить секрет, выполните следующую команду:
kubectl delete secrets/whatsapp-config
Чтобы проверить, что все модули запущены, выполните следующую команду:
kubectl get pods
Ответ должен выглядеть так:
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
Если какой-либо модуль не готов (в столбце READY
выводится значение 0/1
), вы можете получить журналы для этого конкретного модуля. Для этого выполните команду kubectl logs
и укажите имя модуля.
Пример:
kubectl logs whatsapp-coreapp-deployment-78c4d987b8-4cpz4 > whatsapp-coreapp-deployment-78c4d987b8-4cpz4.txt
Журналы будут в файле whatsapp-coreapp-deployment-78c4d987b8-4cpz4.txt
в текущем каталоге.
Чтобы получить журналы для конкретной развернутой службы, например Webapp, выполните команду kubectl logs
и укажите имя службы.
Пример:
kubectl logs deployments/whatsapp-web-deployment > whatsapp-web-deployment.txt
Журналы будут в файле whatsapp-web-deployment.txt
в текущем каталоге.
В этом программном обеспечении используется исходный код из набора библиотек FFmpeg, предоставляемый по лицензии LGPLv2.1. Скачать его можно здесь.