헬스체크와 디펜던시 체크로 신뢰성 확보하기
들어가며
컨테이너 기반의 애플리케이션을 배포가 증가함에 따라 애플리케이션의 신뢰성가 안정성이 중요하게 여겨야 합니다. 만약 오류가 났을 때 대처하지 못하고 계속 애플리케이션이 실행 중이라면 사용자는 서비스 이용에 대한 불편함을 초래해 떠나는 경우가 발생합니다. 그래서 헬스체크와 디펜더시 체크를 통해 신뢰성과 안전성을 확보해야 한다.
헬스체크란?
헬스체크란? 애플리케이션의 상태를 주기적으로 확인하여 상태를 알려주는 역할을 합니다. 예로 만약에 감기 걸린 사람이 있다고 해봅시다. 감기가 처음에 걸렸을 때 "괜찮아?"라고 물어보면 괜찮다고 할 것입니다. 하지만 감기가 심해젔을때 물어보면 "아니.. 안 괜찮아.."라고 답변하는 것과 비슷합니다. 실행되는 애플리케이션의 상태를 주기적으로 판단하여 상태를 확인하고 이를 통해 애플리케이션의 상태를 확인해 조치를 취할 수 있게 하는 것입니다.
헬스체크의 인스트럭션
#사용 방법
HEALTHCHECK [OPTIONS] CMD command
#사용 예제
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
Dockerfile에 HEALTHCHECK 인스트럭션을 추가하여 작성합니다.
- 사용예제 : "http:localhost" 에대해서 30초마다 헬스체크를 실행하고 3초안에 응답이 없으면 실패로 간주한다.
최근 사용한 컨테이너의 상태를 확인하려면 아래와 같은 명령어를 입력하면 컨테이너 상세정보를 출력해 준다.
docker container inspect $(docker container ls --last 1 --format '{{.ID}}')
JSON형태로 출력되며 State에 Health를 보면 현재 상태정보가 출력된다.
주의 사항
헬스체크는 주의해서 사용해야 합니다. 주기적으로 자주 실행되므로, 시스템에 부하를 많이 주는 내용이면 안됩니다. 그래서 자원을 너무 소모하지 않으면서 실질적으로 동작 중인지 검증할 수 있는 핵심적인 부분을 테스트해야 합니다.
디펜던시 체크란?
디펜던시 체크는 애플리케이션이 시작되기 전에 필요한 리소스나 서비스가 모두 사용 가능한지 확인하는 것을 의미합니다. 예를 들어 중요한 시험을 본다고 생각해 봅시다. 그러면 시험을 보기 위해서 필요한 것은 "수험표", "펜"등등이 있습니다. 그중에 하나라도 빠지게 되면 시험을 보기 힘들어 미리 보러 가기 전에 챙겨야 할 준비물을 잘 챙겼는지 체크하는 것이라고 할 수 있습니다.
체크를 함으로써 예기치 않은 문제를 방지하고 안정성을 향상할 수 있습니다.
디펜던시의 인스트럭션
디펜던시체크를 하는 방법을 두 가지를 설명해 보겠습니다. (MySQL 예시)
- Dockerfile에 작성하는 방법
- 스크립트 파일로 체크하는 방법입니다.
1.Dockerfile에 작성
HEALTHCHECK --interval=30s \
--timeout=3s \
CMD nc -zv mysql-server 3306 || exit 1
위에서 헬스체크 인스트럭션과 동일한 방법으로 작동.
2. 스크립트 파일로 체크(. jar기준)
dockerfile작성
# MySQL에 대한 디펜던시 체크 스크립트 복사
COPY healthcheck.sh /app/healthcheck.sh
# 디펜던시 체크 스크립트 실행 CMD
CMD ["./healthcheck.sh", "java", "-jar", "/application.jar"]
healthcheck.sh 스크립트 작성
# MySQL 서버에 대한 디펜던시 체크
while ! nc -zv mysql-server 3306; do
echo "Mysql서버가 실행되기전까지 기다려주세요.."
sleep 1
done
# 디펜던시 체크 성공 시에 애플리케이션 실행
exec "$@"
이렇게 작성하면 dockerfile의 코드를 간소화할 수 있다.
도커 컴포즈에 체크 작성하는 방법
healthcheck:
test: ["CMD", "powershell", "-Command", "C:\\app-check.ps1"]
interval: 30s
timeout: 3s
retries: 3
start_period: 5s
- test : 헬스체크를 수행하는 명령어 인지이다.
- interval : 헬스 체크 시 수행간격
- timeout : 헬스체크가 실패로 간주하는 시간
- retries : 상태이상으로 간주하는 제한시간
- start_period : 컨테이너 실행 후 첫 헬스 체크를 실시하는 시간 간격
복원력 있는 애플리케이션을 만들 수 있던 이유
헬스체크(Health Check)와 디펜던시 체크(Dependency Check)는 애플리케이션의 신뢰성과 안정성을 확보하며, 이를 통해 복원력 있는(Resilient) 애플리케이션을 만들 수 있습니다.
- 장애 탐지 및 자가 치유:
- 헬스체크는 주기적으로 애플리케이션의 상태를 확인하므로 장애가 발생할 때 빠르게 감지할 수 있다.
- 디펜던시 체크는 애플리케이션이 의존하는 외부 리소스나 서비스의 가용성을 확인한다..
- 고가용성 및 부하 분산:
- 헬스체크를 통해 정상적인 상태인 애플리케이션 인스턴스들만 부하 분산되도록 조절할 수 있다.
- 디펜던시 체크를 통해 외부 서비스의 상태를 모니터링하고, 이를 기반으로 고가용성을 유지할 수 있다.
- 유연한 자동 복구:
- 장애가 발생하면 헬스체크와 디펜던시 체크를 기반으로 한 자동 복구 메커니즘이 활성화될 수 있다.
- 자동 복구 기능은 문제가 발생한 인스턴스를 탐지하고, 해당 인스턴스를 자동으로 다시 시작하거나 대체 인스턴스로 교체하여 서비스를 지속적으로 유지한다.
- 정확한 알림과 로깅:
- 헬스체크 결과를 기반으로 알림 시스템을 설정하여 운영팀이나 개발자에게 빠르게 문제 상황을 알릴 수 있다.
- 운영과 유지보수의 용이성
참고
'Devops > 도커' 카테고리의 다른 글
[Docker] 도커로 만든 MySQL을 MySQL Workbench로 연동하는 방법 및 볼륨 사용하기 (1) | 2024.01.31 |
---|---|
[Docker] nginx 설정파일 커스텀 해보기 (1) | 2024.01.31 |
[Docker] Docker파일 작성방법 및 실행해보기 (1) | 2024.01.31 |
[도커] 도커 컨테이너란? (0) | 2024.01.18 |
[Docker] SpringBoot만든 jar파일 배포하기(Mysql 연동) (6) | 2024.01.17 |