開発者向け設定: Minikubeでマルチコネクト

このドキュメントでは、Minikube上でMulticonnectを利用するWhatsApp Business APIクライアントの開発者マシンインストールを設定する方法を説明します。どれを設定するにしても、開始する前に要件のリストを確認してください。

ハイアベイラビリティクラスタを設定する手順は、次のとおりです。

  1. 設定スクリプトのためのbizディレクトリを作成する
  2. WhatsApp Business APIクライアントの設定ファイルを取得する
  3. MySQLデータベースを作成する
  4. whatsapp-config secretを作成する
  5. ローカルメディアボリュームを作成する
  6. 環境変数$VERSIONを設定する
  7. コンテナをデプロイする
  8. webappコンテナポートを調べる
  9. 認証トークンを取得する
  10. ヘルスチェックを実行する
  11. WhatsApp Business APIクライアントを登録する
  12. ヘルスチェックをもう一度実行する

ハイアベイラビリティマルチコネクトクラスタを設定する手順は、次のとおりです。

  1. 2つのシャードを設定する
  2. ヘルスチェックを実行する
  3. ハイアベイラビリティを維持するために第3のCoreappを起動する
  4. ヘルスチェックをもう一度実行する

インスタンスの設定が完了したら、アップグレードすることもできます。クライアントをアンインストールするには、こちらの手順に従ってください。

開始する前に

以下が必要です。

  • Kubernetesがminikubeを使ってローカルに設定されていること
  • kubectlコマンドラインツール
  • 開発環境でテストアカウントがローカルに設定されていること
    • これを実行する目的は、開発の時間短縮のため、また新しいリリースをテストするためです。

また、アベイラビリティとスケーリングのガイドを読んで、ハイアベイラビリティとマルチコネクトの詳細について確認することをも強くおすすめします。

ハイアベイラビリティクラスタを設定する

ステップ1: 設定スクリプトを格納するbizディレクトリを作成する

WhatsApp Business APIクライアント用に選択した場所で次のコマンドを実行します。

mkdir ~/biz; cd ~/biz;

ステップ2: WhatsApp Business APIクライアントの設定ファイルを取得する

WhatsApp-Business-API-Setup-Scripts GitHubリポジトリinstallation/kubernetesディレクトリにあるすべての設定ファイルのクローンを、ステップ1で作成した~/bizディレクトリ内に作成します。

ステップ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 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

ステップ5: ローカルメディアボリュームを作成する

メディアメッセージを送受信するには、WhatsApp Business APIクライアントで、Webapp、Master、Coreappのデプロイメント間で永続ボリュームを共有する必要があります。以下のコマンドを実行することにより、メディアメッセージ用のPersistentVolumePersistentVolumeClaimを作成します。

kubectl apply -f volume.yaml

このコマンドにより、サイズが1GBに設定されたローカルメディアボリュームがKubernetesクラスタ内の/usr/local/wamediaにマウントされ、PersistentVolumeClaimを通じてそこから1GB物理サイズが開発用とテスト用にリクエストされます。

メディアボリュームとメディアボリュームclaimのステータスは、以下のコマンドにより確認できます。

kubectl get pv media-volume

kubectl get pvc media-volume-claim

ステップ6: 環境変数$VERSIONを設定する

webapp.yamlmaster.yamlcoreapp.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

ステップ7: コンテナをデプロイする

次のコマンドを実行することによって、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に変更を加えてください。

ステップ8: Webappコンテナポートを調べる

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)を使う必要があります。

ステップ9: 認証トークンを取得する

WhatsApp Business APIクライアントにログインして、API呼び出しを発行するためのBearer認証トークンを取得します。

ステップ10: ヘルスチェックを実行する

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として、unregisteredgateway_statusが表示されます。

ステップ11: WhatsApp Business APIクライアントを登録する

WhatsApp Business APIクライアントを登録するには、accountノードに対するAPI呼び出しを使います。

ステップ12: ヘルスチェックをもう一度実行する

登録完了後、healthノードへのAPI呼び出しを使ってもう一度WhatsApp Business APIクライアントのヘルスチェックを実行し、Coreappコンテナの1つについてgateway_statusconnectedになっていることを確認します。

結果の出力は次のようになります。

'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_statusdisconnectedになります。whatsapp-coreapp-deployment-78c4d987b8-4cpz4がダウンすると、whatsapp-coreapp-deployment-78c4d987b8-l5qjjによりそれが置き換えられ、そこからWhatsappサーバーに接続してハイアベイラビリティが維持されます。

これで、ハイアベイラビリティモードのWhatsApp Business APIクライアントが設定されました。このモードでは、常に1つのCoreappだけがWhatsAppサーバーに接続してメッセージを送信できます。メッセージのスループットを向上させるために複数のCoreappが同時にメッセージを送信するようにたいる場合は、以下のハイアベイラビリティマルチコネクトクラスタを設定するのセクションの手順に従ってください。

ハイアベイラビリティマルチコネクトクラスタを設定する

ステップ1: 2つのシャードを設定する

シャードエンドポイントを使って、2つのシャードを設定します。201 CreatedステータスのHTTP応答が表示されるはずです。

ステップ2: ヘルスチェックを実行する

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-l5qjjwhatsapp-coreapp-deployment-78c4d987b8-4cpz4)がWhatsAppサーバーに接続され、プライマリMaster(この例ではwhatsapp-master-deployment-8598d7bf6b-9r6lc)もWhatsAppサーバーに接続されます。

ステップ3: ハイアベイラビリティを維持するために第3のCoreappを起動する

この例では、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

ステップ4: ヘルスチェックをもう一度実行する

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,

WhatsAppビジネスAPIクライアントのアップグレード

アップグレード処理中はダウンタイムが発生します。

アップグレードする前に現在のアプリの設定をバックアップして、すぐに復旧して実行できるようにすることを強くおすすめします。バックアップと復元のドキュメントに従ってください。

常にアップグレードは、作業量が最も少ない時間帯に実行することをおすすめします。

ステップ1: $VERSION環境変数を新しいバージョンに変更する

webapp.yamlmaster.yamlcoreapp.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

ステップ2: コンテナをアップグレードする

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

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: secretを削除する

以下のコマンドを使うことによって、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のコードを利用しています。そのソースはこちらからダウンロードできます。