이 문서에서는 Minikube의 다중 연결을 사용하여 WhatsApp Business API 클라이언트의 개발자 컴퓨터 설치를 설정하는 방법을 설명합니다. 이러한 설정을 시작하기 전에 요구 사항 리스트를 참조하세요.
고가용성 클러스터를 설정하려면 다음의 단계를 따르세요.
biz
디렉터리 만들기whatsapp-config
시크릿 코드 만들기$VERSION
환경 변수 설정고가용성 다중 연결 클러스터를 설정하려면 다음의 단계를 따르세요.
다음과 같은 항목이 필요합니다.
minikube
를 사용하여 로컬에서 설정하는 Kubernetes 클러스터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
시크릿 코드 만들기다음의 명령을 사용하여 db.env
파일에서 whatsapp-config
시크릿 코드를 만듭니다.
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, Master, Coreapp 배포 사이에 공유되는 영구 볼륨이 필요합니다. 다음을 실행하여 미디어 메시지에 대한 PersistentVolume
과 PersistentVolumeClaim
을 만듭니다.
kubectl apply -f volume.yaml
이 명령은 Kubernetes 클러스터 내의 /usr/local/wamedia
에 마운팅된 로컬 미디어 볼륨을 설정합니다. 용량은 1GB이고 개발 및 테스트 목적을 위해 PersistentVolumeClaim
을 통해 물리적 용량 1GB를 요청합니다.
다음을 사용하여 미디어 볼륨 상태와 미디어 볼륨 요청을 확인할 수 있습니다.
kubectl get pv media-volume kubectl get pvc media-volume-claim
$VERSION
환경 변수 설정$VERSION
환경 변수를 webapp.yaml
, master.yaml
및 coreapp.yaml
파일의 containers
섹션에서 최신 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
기본 구성에서는 Master 포드 2개, Coreapp 포드 2개, Webapp 포드 2개가 생성됩니다. 각 포드는 128MB 메모리와 0.15 CPU를 요청합니다. 다른 리소스 설정을 원하는 경우 각 YAML 파일에서 spec.template.spec.containers.resources
를 변경합니다.
명령줄을 사용하고 싶지 않은 경우 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 컬렉션을 사용할 때 https://your-minikube-cluster-ip:your-webapp-service-targetport
(예: https://10.101.114.46:32477)를 API 루트 URL로 사용해야 합니다.
WhatsApp Business API 클라이언트에 로그인하여 API 호출을 보내기 위한 Bearer 인증 토큰을 받습니다.
health
노드에 API 호출을 보내서 WhatsApp Business 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' }
응답에서는 기본 Master 컨테이너에 대해 unregistered
의 gateway_status
가 gateway_status
로 표시되는데, 이는 WhatsApp Business API 클라이언트가 아직 등록되지 않았기 때문입니다.
account
노드에 API 호출을 보내서 WhatsApp Business API 클라이언트를 등록할 수 있습니다.
등록을 완료한 후에 health
노드에 API 호출을 보내서 WhatsApp Business API 클라이언트에 대해 다시 한번 상태 점검을 수행하고 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' }
참고: 고가용성 모드에서는 하나의 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 클라이언트를 고가용성 모드로 설정할 수 있습니다. 이 모드에서는 Coreapp 한 개만 WhatsApp 서버에 연결되어 특정 시점에 메시지를 전송할 수 있습니다. 메시지 처리량을 높이기 위해 여러 개의 Coreapp에서 동시에 메시지를 전송하도록 하려는 경우, 아래의 고가용성 다중 연결 클러스터 설정 섹션의 단계를 따르세요.
샤드 엔드포인트를 사용하여 샤드 2개를 설정합니다. 상태가 201 Created
인 HTTP 응답이 보일 것입니다.
health
노드에 API 호출을 보내서 WhatsApp Business 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개인 다중 연결에서는 Coreapp 2개(이 예시에서는 whatsapp-coreapp-deployment-78c4d987b8-l5qjj
와 whatsapp-coreapp-deployment-78c4d987b8-4cpz4
)가 WhatsApp 서버로 연결되고, 기본 Master(이 예시에서는 whatsapp-master-deployment-8598d7bf6b-9r6lc
)도 WhatsApp 서버에 연결됩니다.
지금까지 이 예시에서 Coreapp 컨테이너가 2개이고, 해당 두 컨테이너로 메시지 부하가 나뉘었습니다. 그러나 Coreapp 컨테이너 중 하나가 중단되면 메시지 전송의 절반이 실패합니다. 이 새로운 다중 연결 설정에서 고가용성을 유지하려면 세 번째 Coreapp을 시작하여 1 Coreapp의 실패를 감당하도록 할 수 있습니다. 이는 다중 연결 소개의 다이어그램과 유사합니다.
세 번째 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-4cpz4stops working,
인 경우 whatsapp-coreapp-deployment-78c4d987b8-hwqp6`이 WhatsApp 서버에 연결되어 전체 샤드 개수를 2로 유지합니다.
업그레이드 과정에서 가동 중단 시간이 있습니다.
신속하게 다시 가동을 시작하고 실행할 수 있도록 업그레이드 전에 현재 애플리케이션 설정을 백업하는 것이 좋습니다. 백업 및 복원 문서를 참조하세요.
언제나 사용량이 가장 적은 시간에 업그레이드하는 것이 좋습니다.
$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
다음을 사용하여 시크릿 코드를 삭제합니다.
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의 코드를 사용하고 소스는 여기에서 다운로드할 수 있습니다.