250601 장애보고서 - SeJonJ/ChatForYou GitHub Wiki
250601 장애보고서
1. 장애 기간
- 2025.05.26 ~ 2025.06.01
2. 장애 확인 시점
- 2025.05.31 토
3. 장애 현상
- webRTC, WebSocket 연결이 40 ~ 60 초 안에 강제로 Disconnect 됨.
- 이로 인해서 화상채팅이 1분이상 지속되지 못하고 강제로 연결이 종료되는 장애 발생.
4. 장애 원인
- 장애 원인은 nginx proxy 로 인해 발생한 것으로 확인됨.
- 기존 springboot 에서 springboot + nodejs 로 변경함과 동시에 nginx ingress 를 사용하여 서비스와 연결 할 수 있도록 서버 환경을 변경함.
- yaml 설정은 아래와 같으며, proxy-read-timeout, proxy-send-timeout 모두 60s 로 되어있음.
--- 중략 ---
nginx.ingress.kubernetes.io/affinity: cookie
nginx.ingress.kubernetes.io/app-root: /chatforyou
nginx.ingress.kubernetes.io/enable-real-ip: 'true'
nginx.ingress.kubernetes.io/proxy-body-size: 10m
nginx.ingress.kubernetes.io/proxy-read-timeout: 60s
nginx.ingress.kubernetes.io/proxy-real-ip-cidr: 0.0.0.0/0
nginx.ingress.kubernetes.io/proxy-send-timeout: 60s
--- 중략 ---
5. 장애 수정
-
기존의 nginx namespace 에 있는 nginx ingress controller 를 사용하는 방식에서 chatforyou namepsace 에서 backend 와 frontend 를 올릴때 nginx sidecar 를 사용하는 방식으로 변경
-
nginx sidecar 를 사용하는 방식으로 변경함에 따라 nginx-backend-configmap 및 nginx-frontend-configmap 추가
-
nginx-ingress.yaml
--- 중략 ---
nginx.ingress.kubernetes.io/proxy-connect-timeout: '3600'
nginx.ingress.kubernetes.io/proxy-read-timeout: '3600'
nginx.ingress.kubernetes.io/proxy-send-timeout: '3600'
--- 중략 ---
nginx-backend-configmap.yaml
default.conf: |
server {
--- 중략 ---
# HSTS 헤더 추가
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains';
location / {
proxy_pass https://localhost:8443;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $server_name;
# WebSocket 지원 (채팅 애플리케이션용)
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;
# 타임아웃 설정
proxy_connect_timeout 3600s; -> 수정
**proxy_send_timeout 3600s; -> 수정
**proxy_read_timeout 3600s; -> 수정
}
}
6. 추후 대응 전략
- 기본 테스트 강화 : webRTC 는 프로젝트의 기본 중 기본으로 이런 기본 테스트를 좀 더 강화할 필요가 있음
- k8s 와 nginx proxy 개념 공부 : 이번에 가장 문제가 된 것은 nginx proxy 기본 개념에 대한 공부 미흡과 k8s 설정에 개념 부족으로 발생.
7. 추가 논의 사항
- 처음에는 nginx proxy 를 사용하는것 자체가 문제라고 생각했었는데 결국 nginx sidecar 를 기존 deployment 와 함께 올리고, nginx proxy 를 사용해서 접속이 잘 되는 것을 확인했음.
- 그렇다면 궁금한 건 왜? nginx ingress controller 를 사용했을때는 제대로 동작안했는지에 대한 의문이 남음. -> 아무리 생각해봐도 내가 중간에 timeout 시간을 늘렸던거 같은데...물론 지금와서는 정말 늘리고 테스트를 했었는지 확실하지는 않음. -> 추후 꼭! 확인해볼 필요가 있음. 정말 nginx ingress controller 를 사용하는 or 사용하면서 내가 설정을 잘못해서인지 아니면 지금처럼 하는 방법이 맞는건지