• 카테고리

    질문 & 답변
  • 세부 분야

    데브옵스 · 인프라

  • 해결 여부

    미해결

CrashLoopBackOff 이슈가 지속적으로 발생함. 원인 분석 결과 공유드립니다.

23.12.08 00:31 작성 조회수 208

3

개요

컨테이너는 정상적으로 배포가 되는 것으로 확인되지만, 마스터 노드에서 curl 명령어를 실행해보면 최초 1회는 정상적으로 응답하고, 바로 에러가 발생하는 것으로 확인되었습니다. 로그 내용은 다음과 같습니다.

node:_http_server:345
    throw new ERR_HTTP_HEADERS_SENT('write');
    ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot write headers after they are sent to the client
    at ServerResponse.writeHead (node:_http_server:345:11)
    at Server.content (/main.js:4:7)
    at Server.emit (node:events:519:28)
    at parserOnIncoming (node:_http_server:1143:12)
    at HTTPParser.parserOnHeadersComplete (node:_http_common:119:17) {
  code: 'ERR_HTTP_HEADERS_SENT'
}

컨테이너 내부 쉘에 접근하여 port8080.js 파일을 확인해본 결과 아래 소스 코드를 얻을 수 있었습니다.

var http = require('http');
var content = function(req, resp) {
 resp.end("containerPort : 8080" + "\n");
 resp.writeHead(200);
}
var w = http.createServer(content);
w.listen(8080);

원인

  • 해당 소스코드를 로컬환경 node16 에서 실행해본 결과, 정상적으로 동작하는 것을 확인하였습니다.

     

  • 실습 준비물 이미지 환경 node21 에서 실행해본 결과, 같은 에러가 발생하는 것을 확인하였습니다.

  • Node 버젼이 업그레이드 되면서 http 모듈에 추가적인 예외처리가 반영되었다고 판단했습니다.

  • 공식 문서에 의하면 resp.end() 함수는 해당 컨텍스트의 종료를 의미한다고 합니다. 에러 로그를 살펴보면 컨텍스트의 종료 이후 헤더에 쓰기 작업을 수행하면서 발생하는 에러일 것으로 추측할 수 있었습니다.

     

 

결론

위 코드를 다음과 같이 변경한 후 Node21 환경에서도 정상적으로 동작하는 것을 확인했습니다.

var http = require('http');
var content = function(req, resp) {
 resp.writeHead(200);
 resp.end("containerPort : 8080" + "\n");
}
var w = http.createServer(content);
w.listen(8080);

답변 2

·

답변을 작성해보세요.

1

먼저 강의 진행에 불편함을 드려 죄송하다는 말씀 드립니다.

그리고 질문 올린 내용에 감탄사가 절로 나오네요. 상당히 수준 높은 수강생 이시군요.

저도 올린 에러 메세지를 보고 검색을 해봤는데, jerry901님이 결론 내린 내용 말고 return 넣는 답변만 많았는데, 직접 테스트하고 가장 간단한 변경으로 결과를 도출 해낸 게 인상 깊네요.

이럼 제 입장에서 컨테이너를 수정 안 할 수가 없겠어요.

이미 잘 하시거나, 잘 되실 분 같고, 좋은 내용 공유해 주셔서 감사합니다. 😃

0

jerry901님의 프로필

jerry901

질문자

2023.12.08

과찬이십니다! 좋은 강의 감사드리고 수업 끝까지 잘 따라가보겠습니다!