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 사용하면서 내가 설정을 잘못해서인지 아니면 지금처럼 하는 방법이 맞는건지