このドキュメントでは、Minikube上でMulticonnectを利用するWhatsApp Business APIクライアントの開発者マシンインストールを設定する方法を説明します。どれを設定するにしても、開始する前に要件のリストを確認してください。
ハイアベイラビリティクラスタを設定する手順は、次のとおりです。
biz
ディレクトリを作成するwhatsapp-config
secretを作成する$VERSION
を設定するハイアベイラビリティマルチコネクトクラスタを設定する手順は、次のとおりです。
インスタンスの設定が完了したら、アップグレードすることもできます。クライアントをアンインストールするには、こちらの手順に従ってください。
以下が必要です。
minikube
を使ってローカルに設定されていることkubectl
コマンドラインツールまた、アベイラビリティとスケーリングのガイドを読んで、ハイアベイラビリティとマルチコネクトの詳細について確認することをも強くおすすめします。
biz
ディレクトリを作成するWhatsApp Business APIクライアント用に選択した場所で次のコマンドを実行します。
mkdir ~/biz; cd ~/biz;
WhatsApp-Business-API-Setup-Scripts GitHubリポジトリのinstallation/kubernetesディレクトリにあるすべての設定ファイルのクローンを、ステップ1で作成した~/biz
ディレクトリ内に作成します。
次のコマンドを使うことによって、永続ボリュームによる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
secretを作成する以下のコマンドを使うことによって、db.env
ファイルからwhatsapp-config
secretを作成します。
kubectl create secret generic whatsapp-config --from-env-file=db.env
結果の出力は次のようになります。
secret/whatsapp-config created
作成されたsecretは、以下のコマンドによりチェックできます。
kubectl get secrets
結果の出力は次のようになります。
NAME TYPE DATA AGE whatsapp-config Opaque 5 52s
このsecretの詳細は、以下のコマンドによりチェックできます。
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、Master、Coreappのデプロイメント間で永続ボリュームを共有する必要があります。以下のコマンドを実行することにより、メディアメッセージ用のPersistentVolume
とPersistentVolumeClaim
を作成します。
kubectl apply -f volume.yaml
このコマンドにより、サイズが1GBに設定されたローカルメディアボリュームがKubernetesクラスタ内の/usr/local/wamedia
にマウントされ、PersistentVolumeClaim
を通じてそこから1GB物理サイズが開発用とテスト用にリクエストされます。
メディアボリュームとメディアボリュームclaimのステータスは、以下のコマンドにより確認できます。
kubectl get pv media-volume kubectl get pvc media-volume-claim
$VERSION
を設定するwebapp.yaml
、master.yaml
、coreapp.yaml
のファイルのcontainers
セクションで、$VERSION
環境変数を、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、Master、Coreappコンテナをデプロイします。
Webapp
kubectl apply -f webapp.yaml
結果の出力は次のようになります。
horizontalpodautoscaler.autoscaling/whatsapp-web-autoscaler created service/whatsapp-web-service created deployment.apps/whatsapp-web-deployment created
Master
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
Master/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つのMasterポッド、2つのCoreappポッド、2つのWebappポッドが作成されます。各ポッドは128MBのメモリと0.15のCPUをリクエストします。異なるリソース設定にする場合は、それぞれのYAMLファイルのspec.template.spec.containers.resources
に変更を加えてください。
MetaのPostmanコレクションをダウンロードして設定すると、コマンドラインを使わずにWhatsApp Business APIを操作できます。
Minikubeを使ってKubernetesクラスタを実行する際には、以下のコマンドを実行することによって、KubernetesクラスタIPを確認する必要があります。
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
この例では、Webappコンテナ内のポート443
が、Kubernetesクラスタ上のポート32477
にマッピングされています。
Postmanコレクションを使う場合は、APIルートURLとしてhttps://your-minikube-cluster-ip:your-webapp-service-targetport
(例: https://10.101.114.46:32477)を使う必要があります。
WhatsApp Business APIクライアントにログインして、API呼び出しを発行するためのBearer認証トークンを取得します。
WhatsApp Business APIクライアントでヘルスチェックを実行するには、health
ノードへのAPI呼び出しを使うことによって、全ノードが適切に実行されていることを確認します。
結果の出力は次のようになります。
'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' }
WhatsApp Business APIクライアントがまだ登録されていないので、応答にはプライマリMasterコンテナのgateway_status
として、unregistered
のgateway_status
が表示されます。
WhatsApp Business APIクライアントを登録するには、account
ノードに対するAPI呼び出しを使います。
登録完了後、health
ノードへのAPI呼び出しを使ってもう一度WhatsApp Business APIクライアントのヘルスチェックを実行し、Coreappコンテナの1つについて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' }
注: ハイアベイラビリティモードでは、1つのCoreapp(この例ではwhatsapp-coreapp-deployment-78c4d987b8-4cpz4
)だけがWhatsappサーバーに接続されます。プライマリMasterを含むほかのすべてのノードのgateway_status
はdisconnected
になります。whatsapp-coreapp-deployment-78c4d987b8-4cpz4
がダウンすると、whatsapp-coreapp-deployment-78c4d987b8-l5qjj
によりそれが置き換えられ、そこからWhatsappサーバーに接続してハイアベイラビリティが維持されます。
これで、ハイアベイラビリティモードのWhatsApp Business APIクライアントが設定されました。このモードでは、常に1つのCoreappだけがWhatsAppサーバーに接続してメッセージを送信できます。メッセージのスループットを向上させるために複数のCoreappが同時にメッセージを送信するようにたいる場合は、以下のハイアベイラビリティマルチコネクトクラスタを設定するのセクションの手順に従ってください。
シャードエンドポイントを使って、2つのシャードを設定します。201 Created
ステータスのHTTP応答が表示されるはずです。
WhatsApp Business APIクライアントでヘルスチェックを実行するには、health
ノードへのAPI呼び出しを使うことによって、全ノードが適切に実行されていることを確認します。
結果の出力は次のようになります。
'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つのマルチコネクトモードでは、2つのCoreapp(この例ではwhatsapp-coreapp-deployment-78c4d987b8-l5qjj
とwhatsapp-coreapp-deployment-78c4d987b8-4cpz4
)がWhatsAppサーバーに接続され、プライマリMaster(この例ではwhatsapp-master-deployment-8598d7bf6b-9r6lc
)もWhatsAppサーバーに接続されます。
この例では、Coreappコンテナが2つあり、それらの間でメッセージ負荷が分割されています。しかし、Coreappコンテナの1つがダウンすると、メッセージ送信の半分が失敗します。この新しいマルチコネクト設定でハイアベイラビリティを維持するには、3番目のCoreappを起動します。それにより、1つのCoreappがダウンしても耐えられます。これは、マルチコネクトについての図と同様です。
3番目のCoreappコンテナを起動するため、coreapp.yaml
ファイルの中でreplicas
の数を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
health
ノードへのAPI呼び出しを使って再度ヘルスチェックを実行し、すべてのポッドが適切に実行されていることを確認することにより、すべてのノードが適切に実行されていることを確認します。
結果の出力は次のようになります。
'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のいずれかが機能しなくなった場合、whatsapp-coreapp-deployment-78c4d987b8-hwqp6がWhatsAppサーバーに接続して、全体のシャード数を2に維持します。stops working,
アップグレード処理中はダウンタイムが発生します。
アップグレードする前に現在のアプリの設定をバックアップして、すぐに復旧して実行できるようにすることを強くおすすめします。バックアップと復元のドキュメントに従ってください。
常にアップグレードは、作業量が最も少ない時間帯に実行することをおすすめします。
$VERSION
環境変数を新しいバージョンに変更するwebapp.yaml
、master.yaml
、coreapp.yaml
のファイルのcontainers
セクションで、環境変数$VERSION
を、アップグレード後のバージョン(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、Master、Coreappのコンテナをアップグレードし、ロールアウトステータスをモニタリングします。
Webapp
kubectl apply -f webapp.yaml
結果の出力は次のようになります。
kubectl rollout status deployments/whatsapp-web-deployment
Master
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
以下のコマンドを使うことによって、secretを削除します。
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
というファイルに記録されるようになります。
このソフトウェアでは、LGPLv2.1でライセンス付与されているFFmpegのコードを利用しています。そのソースはこちらからダウンロードできます。