10일차_디펜던시 체크

최지웅·2024년 11월 15일
0

인프라

목록 보기
13/19

8-2. 디펜던시 체크가 적용된 컨테이너 실행하기

  • 헬스체크와 클러스터를 이용해 비정상 컨테이너 대신 새 컨테이너를 실행해 상태를 복구할 수 있지만, 의존 관계를 고려하기 않는 문제가 있다. 이를 해결하기 위해 디펜던시 체크를 수행한다. 실패 시 애플리케이션이 실행되지 않는다.
  • Dockerfile 스크립트의 어플리케이션 실행 명령에 디펜던시 체크를 추가할 수 있다. 실행 이전에 의존성이 있는 API에 curl로 확인한다.
FROM diamol/dotnet-aspnet

ENV RngApi:Url=http://numbers-api/rng #환경변수?

CMD curl --fail http://numbers-api/rng && \ # HTTP 요청을 보내 사용 가능한 API인지 확인
	dotnet Numbers.Web.dll # 어플리케이션 실행 (헬스체크 생략)

WORKDIR /app
COPY --from=builder /out/ .

8-3. 애플리케이션 체크를 위한 커스텀 유틸리티 만들기

  • 실무 어플리케이션 테스트 시엔, 보안 정책상(도커 이미지에는 최소의 내용만 포함+보안)의 이유로 curl을 사용할 수 없다.
  • 애플리케이션과 커스텀 유틸리티(헬스체크, 디펜던시 체크)를 나눠 빌드 및 패키징하여 멀티 스테이지 빌드를 수행할 수 있다. 예시는 아래와 같다.
FROM diamol/dotnet-aspnet

ENTRYPOINT ["dotnet", "Numbers.Api.dll"]
HEALTHCHECK CMD ["dotnet", "Utilities.HttpCheck.dll", "-u", "http://localhost/health"] # 이처럼 별도의 유틸리티 체크만 추가

WORKDIR /app
COPY --from=http-check-builder /out/ .
COPY --from=builder /out/.
# 기존 컨테이너 삭제
docker container rm -f $(docker container ls -aq)

# v3 버전 이미지로 API 실행
docker container run -d -p 8080:80 --health-interval 5s diamol/ch08-numbers-api:v3

# 5초 대기
docker container ls

# API 4번 호출
curl http://localhost:8080/rng
curl http://localhost:8080/rng
curl http://localhost:8080/rng
curl http://localhost:8080/rng # 실패

# 버그 확인
docker container ls # 15초 이후 상태가 이상으로 변경됨
  • 쉽게 말해 별도의 디펜던시 체크 유틸리티리를 추가하면 오류 발생 시 컨테이너 상태를 변경하여 알려준다. 위를 Dockerfile 스크립트에 적용하면 아래와 같다.
FROM diamol/dotnet-aspnet

ENV RngApi:Url=http://numbers-api/rng
CMD dotnet Utilities.HttpCheck.dll -c RngApi:Url -t 900 &&\ # 헬스체크 유틸로 api 체크 한 뒤 실행
	dotnet Numbers.Web.dll

WORKDIR /app
COPY --from=http-check-builder /out/ .
COPY --from=builder /out/ .
docker container run -d -p 8081:80 diamol/ch08-numbers-web:v3

docker container ls -all
  • 커스텀 테스트 유틸리티를 따로 마련하여 컨테이너 플랫폼마다 디펜던시 체크와 헬스 체크가 가능하도록 정의하고 실행하게끔 하면, 모든 로직을 도커 컴포즈, 도커 스웜, 쿠버네티스 등 여러 환경에서 동작 가능하다.

8-4. 도커 컴포즈에 헬스 체크와 디펜던시 체크 정의하기

  • 도커 컴포즈에서 컨테이너 교체는 불가하지만, 종료된 컨테이너 재시작 혹은 헬스 체크를 추가할 수 있다.
  • 도커 컴포즈 파일에 헬스 체크 옵션 설정하기. 이미지에 헬스체크를 적용한다
numbers-api:
	image: diamol/ch08-numbers-api:v3
    ports:
    	- "8087:80"
    healthcheck:
    	interval: 5s # 헬스 체크 간격
        timeout 1s # 응답시간 실패기준
        retries: 2 # 이상으로 간주하는 연속 실패기준
        start_period: 5s # 어플리케이션 시작 후 첫 헬스체크 딜레이 (시작하지도 않았는데 오류판단하면 안되니)
    networks:
    	- app-net
  • 도커 컴포즈 파일에 헬스 체크 정의하기. 이미지에 디펜던시 테크까지 포함시켰다. 하지만 depends_on 설정을 따로 하지 않아 디펜던시 체크가 실패해 웹 컨테이너가 종료될 수도 있다. (근데 차피 위게꺼도 실행할거라 금방 동작)
numbers-web:
	image: diamol/ch08-numbers-web:v3
    restart: on-failure # 컨테이너 종료 시 재시작
    ports:
    	- "8088:80"
    healthcheck:
    	test: ["CMD", "dotnet", "Utilities.HttpCheck.dll", "-t", "150"] # 디펜던시 체크까지(150ms)
    interval: 5s
    timeout: 1s
    retries: 2
    start_period: 10s
networks:
	- app-net
  • depends_on 옵션을 사용하지 않는 이유는 도커 컴포즈에서 디펜던시 체크를 할 수 있는 범위가 단일 서버로 제한되기 때문에 별도의 체크를 사용해야한다.
    8.5 헬스 체크와 디펜던시 체크로 복원력있는 애플리케이션을 만들 수 있는 이유
  • 분산 시스템 애플리케이션은 관리가 어려운데, 단순히 시작 순서대로 작동한다면 컨테이너 1개로 인해 애플리케이션이 동작하지 않을 수 있다.
  • 디펜던시 체크와 헬스 체크 덕분에 플랫폼이 실행 순서를 보장하지 않아도 되게하여 빠르게 컨테이너를 실행시킨다. 이로서 대규모 어플리케이션을 몇분만에 완전 동작 상태로 만들 수 있으며 그 도중에 요청까지 처리할 수 있다.
  • 디펜던시 체크에 실패하거나 애플리케이션 오류가 발생한 컨테이너의 경우 새 컨테이너로 대체하여 동작시킨 후, 기존 컨테이너를 종료하여 자기 수복 능력을 갖추게 한다.
  • 디펜던시 체크는 애플리케이션 시작 시에만 수행되기에 테스트 대상을 빠짐없이, 의존관계 누락 없이 수행해야한다
  • 헬스 체크는 주기적으로 실행되므로 시스템에 부하를 주면 안된다.
profile
이제 3학년..

0개의 댓글