개발자 설정: Minikube의 다중 연결

이 문서에서는 Minikube의 다중 연결을 사용하여 WhatsApp Business API 클라이언트의 개발자 컴퓨터 설치를 설정하는 방법을 설명합니다. 이러한 설정을 시작하기 전에 요구 사항 리스트를 참조하세요.

고가용성 클러스터를 설정하려면 다음의 단계를 따르세요.

  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개 설정
  2. 상태 점검 수행
  3. 세 번째 Coreapp을 시작하여 고가용성 유지
  4. 두 번째 상태 점검 수행

인스턴스를 완전히 설정하고 나면 업그레이드가 가능합니다. 클라이언트를 삭제하려면 이 단계를 따르세요.

시작하기 전에

다음과 같은 항목이 필요합니다.

  • minikube를 사용하여 로컬에서 설정하는 Kubernetes 클러스터
  • 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 시크릿 코드 만들기

다음의 명령을 사용하여 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

5단계: 로컬 미디어 볼륨 만들기

미디어 메시지를 보내거나 받으려면 WhatsApp Business API 클라이언트에 Webapp, Master, Coreapp 배포 사이에 공유되는 영구 볼륨이 필요합니다. 다음을 실행하여 미디어 메시지에 대한 PersistentVolumePersistentVolumeClaim을 만듭니다.

kubectl apply -f volume.yaml

이 명령은 Kubernetes 클러스터 내의 /usr/local/wamedia에 마운팅된 로컬 미디어 볼륨을 설정합니다. 용량은 1GB이고 개발 및 테스트 목적을 위해 PersistentVolumeClaim을 통해 물리적 용량 1GB를 요청합니다.

다음을 사용하여 미디어 볼륨 상태와 미디어 볼륨 요청을 확인할 수 있습니다.

kubectl get pv media-volume

kubectl get pvc media-volume-claim

6단계: $VERSION 환경 변수 설정

$VERSION 환경 변수를 webapp.yaml, master.yamlcoreapp.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

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

기본 구성에서는 Master 포드 2개, Coreapp 포드 2개, Webapp 포드 2개가 생성됩니다. 각 포드는 128MB 메모리와 0.15 CPU를 요청합니다. 다른 리소스 설정을 원하는 경우 각 YAML 파일에서 spec.template.spec.containers.resources를 변경합니다.

8단계: Webapp 컨테이너 포트 찾기

명령줄을 사용하고 싶지 않은 경우 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로 사용해야 합니다.

9단계: 인증 토큰 받기

WhatsApp Business API 클라이언트에 로그인하여 API 호출을 보내기 위한 Bearer 인증 토큰을 받습니다.

10단계: 상태 점검 수행

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 컨테이너에 대해 unregisteredgateway_statusgateway_status로 표시되는데, 이는 WhatsApp Business API 클라이언트가 아직 등록되지 않았기 때문입니다.

11단계: WhatsApp Business API 클라이언트 등록

account 노드에 API 호출을 보내서 WhatsApp Business API 클라이언트를 등록할 수 있습니다.

12단계: 2차 상태 점검 수행

등록을 완료한 후에 health 노드에 API 호출을 보내서 WhatsApp Business API 클라이언트에 대해 다시 한번 상태 점검을 수행하고 Coreapp 컨테이너 중 하나의 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'
}

참고: 고가용성 모드에서는 하나의 Coreapp(이 예시에서는 whatsapp-coreapp-deployment-78c4d987b8-4cpz4)만 WhatsApp 서버에 연결되고 기본 Master를 포함한 그 외의 나머지 노드는 gateway_statusdisconnected로 설정됩니다. whatsapp-coreapp-deployment-78c4d987b8-4cpz4가 사용 중단되면 whatsapp-coreapp-deployment-78c4d987b8-l5qjj가 이를 대체하고, Whatsapp 서버로 연결하여 고가용성을 유지합니다.

이제 WhatsApp Business API 클라이언트를 고가용성 모드로 설정할 수 있습니다. 이 모드에서는 Coreapp 한 개만 WhatsApp 서버에 연결되어 특정 시점에 메시지를 전송할 수 있습니다. 메시지 처리량을 높이기 위해 여러 개의 Coreapp에서 동시에 메시지를 전송하도록 하려는 경우, 아래의 고가용성 다중 연결 클러스터 설정 섹션의 단계를 따르세요.

고가용성 다중 연결 클러스터 설정

1단계: 샤드 2개 설정

샤드 엔드포인트를 사용하여 샤드 2개를 설정합니다. 상태가 201 Created인 HTTP 응답이 보일 것입니다.

2단계: 상태 점검 수행

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-l5qjjwhatsapp-coreapp-deployment-78c4d987b8-4cpz4)가 WhatsApp 서버로 연결되고, 기본 Master(이 예시에서는 whatsapp-master-deployment-8598d7bf6b-9r6lc)도 WhatsApp 서버에 연결됩니다.

3단계: 세 번째 Coreapp을 시작하여 고가용성 유지

지금까지 이 예시에서 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

4단계: 2차 상태 점검 수행

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로 유지합니다.

WhatsApp Business API 클라이언트 업그레이드

업그레이드 과정에서 가동 중단 시간이 있습니다.

신속하게 다시 가동을 시작하고 실행할 수 있도록 업그레이드 전에 현재 애플리케이션 설정을 백업하는 것이 좋습니다. 백업 및 복원 문서를 참조하세요.

언제나 사용량이 가장 적은 시간에 업그레이드하는 것이 좋습니다.

1단계: $VERSION 환경 변수를 새로운 버전으로 변경

webapp.yaml, master.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단계: 시크릿 코드 삭제

다음을 사용하여 시크릿 코드를 삭제합니다.

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의 코드를 사용하고 소스는 여기에서 다운로드할 수 있습니다.