Kubernetes 클러스터의 WebRTC
저는 쿠버네티스 클러스터에서 실행하고 싶은 개발 중인 실시간 멀티플레이어 게임의 전용 서버 빌드를 가지고 있습니다. 이 게임은 브라우저를 대상으로 네트워크 통신을 위해 웹RTC를 사용한다. Kubernetes 노드에서 게임 서버를 실행할 때 플레이어가 직접 연결할 수 있습니다. 를 사용하여 포드를 구성하면 플레이어가 직접 연결할 수 있습니다. 플레이어가 없는 경우에도 NAT을 제대로 작동하는 경우에만 연결할 수 있습니다. 성공적인 연결을 위한 유일한 옵션은 트래픽을 릴레이하는 TURN 서버를 도입하는 것입니다.
그 이유는 게임 서버가 기본적으로 대칭적인 NAT(즉, NAT 매핑 동작이 주소 및 포트에 따라 다름) 뒤에 있는 Kubernetes 노드에서 실행되기 때문인 것으로 보입니다. 컨테이너 내의 동일한 UDP 소켓에서 서로 다른 STUN 서버에 두 개의 STUN 메시지를 전송하여 확인했습니다. 바인딩 응답은 공용 IP는 같지만 포트는 다릅니다.
이러한 NAT 동작은 트래픽을 릴레이하기 위해 TURN 서버를 사용하지 않는 경우 게임 서버에 직접 연결하는 플레이어의 성공률을 줄임으로써 WebRTC에 영향을 미칩니다. 이제 지연 시간이 추가되어 가능한 경우 TURN 서버를 통해 트래픽을 중계하는 것을 매우 피하고 싶습니다. 실시간 멀티플레이어 게임에는 그다지 바람직하지 않습니다.
나는 그냥 설정하고 끝내고 싶었지만 (사이드카를 안전하게 할 수 있는 기능을 제거하기 때문에) 그것을 지원하지 않는 것을 사용하는 것을 고려하고 있다.
WebRTC가 통신에 사용하려고 하는 모든 범위의 랜덤 UDP 포트를 포워딩하는 것이 실현 가능하지 않다고 생각하기 때문에 이 NAT 동작을 조정할 수 있는 다른 옵션(트래픽을 릴레이할 다른 서버를 도입하지 않는 것이 이상적임)이 있는지 궁금합니다?
: 를 읽어보니 아래 도표로 작성된 설정은 전용 게임 서버와 동일한 컨테이너에서 실행되는 TURN 서버를 사용하여 가능할 것 같습니다(따라서 지연 시간 도입은 최소화되어야 함).
게임 클라이언트는 TURN 클라이언트 역할을 합니다. 즉, TURN 서버에 할당을 생성하는 등의 역할을 합니다.
게임 서버는 클라이언트가 통신할 피어 역할을 합니다. 게임 서버 자체가 TURN 클라이언트일 필요는 없으며 내가 이해한 것이 맞다면 TURN 서버가 TURN 서버인지 알 필요도 없다.
단일 수신 UDP/TCP 포트를 사용하여 많은 WebRTC 연결을 제공할 수 있습니다. ICE를 사용하여 demux를 해제한 다음 원격 3-tuple을 사용하여 경로를 지정합니다.
어떤 WebRTC 구현을 사용하고 있는지는 잘 모르겠지만 Pion을 사용하면 실제 코드가 에 있는 이 주소를 활성화할 수 있습니다. 만약 우리가 이 주소를 demux 해제하기 전에 봤다면, 그렇지 않으면 ICE 값을 조회하려고 합니다.
나는 또한 사람들이 턴 경로로 내려가는 것을 본 적이 있는데, 나는 그것을 반대하는 것을 추천한다. 부하가 높은 상태에서 트래픽을 떨어뜨릴 수 있는 조각을 하나 더 추가하면 디버깅이 좌절될 수 있습니다.
실제로, 단일 UDP 및/또는 TCP 포트만 WebRTC 클라이언트에 노출할 수 있도록 백엔드에 TURN 서버를 배치할 수 있습니다. 이것은 고전적인 사용법은 아니지만 제가 생산 과정에서 몇 번 본 적이 있는 것입니다. 클라이언트만 TURN 서버를 설정해야 하며, 게임 서버는 로컬 네트워크 주소로 릴레이되므로 TURN 서버와 직접 통신합니다. 또한 클라이언트에 ICE 릴레이를 적용해야 합니다.
다른 옵션은 WebRTC 에이전트 구성에서 포트 범위를 설정하고 NAT에서 포트 범위를 전달하는 것입니다. 이 경우 STUN 서버를 설정하는 대신 내보낸 호스트 후보를 외부 주소로 수동으로 재정의하여 연결 설정을 최적화할 수 있습니다.
여전히 이 문제에 대한 해결책을 찾고 있는 사람들을 위해: 는 OP가 추구하는 사용 사례, 즉 웹RTC 미디어 트래픽을 쿠버네티스 클러스터로 수집하기 위해 설계된 새로운 WebRTC 미디어 게이트웨이이다. STUNner 자체는 턴 서버이지만 게임 서버와 동일한 쿠버네티스 클러스터에 배치되면 게임 서버 트래픽에 가시적인 지연이 추가되지 않습니다.
저는 STUNner의 작가 중 한 명입니다.
'개발하자' 카테고리의 다른 글
테라포름 개수가 있는 항목에 대한 상태 표시 (0) | 2023.05.11 |
---|---|
유형 스크립트: 트리의 상위 레벨에서 한 모듈에 별칭을 지정할 수 있지만 다른 모듈에는 별칭을 지정할 수 없습니까? (0) | 2023.05.10 |
Floating Firebase Messaging Crash Targeting S+(버전 31 이상)에는 FLAG_IMTOUBLE 중 하나가 필요합니다 (0) | 2023.05.09 |
Terraform에서 오류가 발생함 플러그인 스키마를 로드하지 못했습니다 (0) | 2023.05.08 |
Minikube를 사용하는 Windows Home 브라우저에서 Kubernetes Ingress에 액세스할 수 없습니까? (0) | 2023.05.08 |