Настройка для среды разработки: распределение нагрузки с Minikube

В этом документе рассказывается, как настроить установку клиента WhatsApp Business API с распределением нагрузки на машине разработчика с Minikube. Прежде, чем начинать эти настройки, ознакомьтесь со списком требований.

Чтобы настроить кластер высокой доступности, выполните следующие действия:

  1. Создайте каталог biz для скриптов настройки
  2. Получите файлы конфигурации для клиента WhatsApp Business API.
  3. Создайте базу данных MySQL.
  4. Создайте секрет whatsapp-config.
  5. Создайте локальный том для медиафайлов.
  6. Настройте переменную среды $VERSION.
  7. Разверните контейнеры.
  8. Найдите порт контейнера webapp.
  9. Получите маркер аутентификации.
  10. Проверьте работоспособность.
  11. Зарегистрируйте клиент WhatsApp Business API.
  12. Повторно проверьте работоспособность.

Чтобы настроить кластер с распределением нагрузки, выполните следующие действия:

  1. Настройте два сегмента.
  2. Проверьте работоспособность.
  3. Запустите третий контейнер Coreapp для обеспечения повышенной доступности.
  4. Повторно проверьте работоспособность.

После полной настройки экземпляр можно обновить. Чтобы удалить клиент, выполните эти действия.

Прежде чем начать

Вам понадобятся:

  • кластер Kubernetes, настроенный локально с использованием minikube;
  • инструмент командной строки kubectl;
  • локально настроенный тестовый аккаунт в среде разработки
    :
    • он нужен для ускорения разработки и тестирования новых версий.

Рекомендуем также ознакомиться с этим руководством, чтобы узнать подробнее о повышенной доступности и распределении нагрузки.

Настройка кластера повышенной доступности

Шаг 1. Создание каталога biz для скриптов настройки

Выполните следующий код в каталоге, где будет установлен клиент WhatsApp Business API:

mkdir ~/biz; cd ~/biz;

Шаг 2. Получение файлов конфигурации для клиента WhatsApp Business API

Клонируйте все файлы конфигурации из каталога installation/kubernetesрепозитория GitHub WhatsApp-Business-API-Setup-Scripts в каталог ~/biz, созданный на шаге 1.

Шаг 3. Создание базы данных MySQL

Создайте базу данных 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

Шаг 4. Создание секрета 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

Шаг 5. Создание локального тома для медиафайлов

Чтобы отправлять и получать сообщения с медиафайлами, клиенту 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

Шаг 6. Настройка переменной среды $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

Шаг 7. Разверните контейнеры

Разверните контейнеры 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.

Шаг 8. Поиск порта контейнера Webapp

Если вы не хотите использовать командную строку для работы с 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).

Шаг 9. Получение маркера аутентификации

Войдите в клиент WhatsApp Business API и получите маркер аутентификации Bearer для выполнения вызовов API.

Шаг 10. Проверка работоспособности

Чтобы проверить работоспособность клиента 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_statusgateway_status для главного основного контейнера имеет значение unregistered, так как клиент WhatsApp Business API ещё не зарегистрирован.

Шаг 11. Регистрация клиента WhatsApp Business API

Чтобы зарегистрировать клиент WhatsApp Business API, выполните вызов API к узлу account.

Шаг 12. Повторная проверка работоспособности

После регистрации ещё раз проверьте работоспособность клиента 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 одновременно, настройте распределение нагрузки, как описано ниже.

Настройка кластера повышенной доступности с распределением нагрузки

Шаг 1. Настройка двух сегментов

С помощью конечной точки сегментов настройте два сегмента. В ответе HTTP должен быть указан статус 201 Created.

Шаг 2. Проверка работоспособности

Чтобы проверить работоспособность клиента 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).

Шаг 3. Запуск третьего контейнера Coreapp для обеспечения повышенной доступности

На этом этапе у вас есть два контейнера 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

Шаг 4. Повторная проверка работоспособности

Ещё раз проверьте работоспособность всех узлов, выполнив вызов 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.

Обновление клиента WhatsApp Business API

Во время обновления будьте готовы к простою.

Перед обновлением настоятельно рекомендуем создать резервную копию текущих настроек приложения, чтобы их можно было быстро восстановить. Следуйте инструкциям из статьи Резервное копирование и восстановление настроек.

Все обновления рекомендуется выполнять в периоды наименьшей активности.

Шаг 1. Указание новой версии в переменной среды $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

Шаг 2. Обновление контейнеров

Обновите контейнеры 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

Удаление клиента WhatsApp Business API

Шаг 1. Удаление развертываний

Чтобы удалить развертывания, выполните следующие команды:

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

Шаг 2. Удаление тома

Чтобы удалить том, выполните следующую команду:

kubectl delete -f volume.yaml

Шаг 3. Удаление секрета

Чтобы удалить секрет, выполните следующую команду:

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. Скачать его можно здесь.