We are Architect

15단계로 배우는 Docker와 쿠버네티스: 컨테이너 API(10) 본문

Docker

15단계로 배우는 Docker와 쿠버네티스: 컨테이너 API(10)

the best infra 2025. 1. 1. 02:10

 

* 컨테이너 API 이란?

  • 컨테이너 API는 컨테이너를 블랙박스처럼 다룰 수 있게 해주는 인터페이스이다. 
  • 먼저 API는 애플리케이션 인터페이스라고 하며. 인터페이스는 본래 케이프이나 하드웨어 규격을 의미한다.
  • 이렇듯 API는 애플리케이션들을 연결하기 위해서 지켜줘야 할 규격이라고 생각하면 된다.

 

 

* 컨테이너 API의 종류와 개요.

  • 애플리케이션의 특성에 맞게 API를 선택하여 구현해야 한다. 
  • 컨테이너 API 목록
    • 컨테이너 기동 : 컨테이너 내의 애플리케이션은 기동 시에 환경 변수나 실행 인자를 읽어서 그에 맞게 동작하게 만들 수 있다.
    • 헬스 체크 : 컨테이너의 애플리케이션이 초기화가 완료되어 외부로부터의 요청을 받을 수 있게 되었음을 알리는 인터페이스이다. 
    •  컨테이너 종료 : 컨테이너 내의 애플리케이션은 종료 요청 시그널에 대한 종료 처리를 구현하는 것이 좋다. 
    • 기타 지원(메모리 요구량, CPU 요구량, 접속 네트워크) : 
    • 가동 로그 : 마이크로서비스 아키텍처를 사용하고 규모가 커지게 되면 보통 많은 수의 컨테이너를 돌리게 된다. 컨테이너의 표준 출력과 출력 오류를 로그로 간직한다.
    • 종료 상태 : PID가 1인 프로세스의 EXIT 코드가 컨테이너의 종료 코드로 설정된다. 컨테이너상의 애플리케이션은 적절하게 종료 코드를 반환하도록 구현해야 한다.
    • 퍼시스턴트 볼륨 : 컨테이너는 알사적인 존재이기 때문에 보관이 필요한 데이터를 파일 시스템에 저장해서는 안 된다.
    • : 훅은 컨테이너 실행 전후에 동작하는 코드나 스크립트를 말하며, 컨테이너의 상태 변경 이벤트에 대한 특정 작업을 정의할 수 있다.
    • 서비스 : 컨테이너가 제공하는 서비스를 정의하고 관리할 때는 클라이언트와의 연결과 서비스 지속성이 중요.
    • 컨테이너 기동 : 컨테이너가 시작할 때 애플리케이션이 제대로 기동 되고, 외부 의존성을 확인하는 것이 중요.

 

* 종료 요청 API 구현 예

  • 시그널은 유닉스 계열의 운영체제에서 프로세스에게 이벤트를 비동기적으로 전달하기 위해 존재한다.
  • 커널로부터 시그널을 받은 프로세스는 인터럽트 된다. 미리 시그널 처리 루틴을 등록해 두면 시그널을 받았을 때 필요한 처리를 수행할 수 있다.
  • 예제코드 (dockerfile)
    FROM alpine:latest
    
    # bash 설치
    RUN apk update && apk add bash
    
    # my_daemon 추가 및 실행 권한 부여
    ADD ./my_daemon /my_daemon
    RUN dos2unix /my_daemon && chmod +x /my_daemon
    
    # 실행
    CMD ["/bin/bash", "/my_daemon"]
  • 예제코드 (my_daemon)
    #!/bin/bash
    
    # 카운터 초기화
    COUNT=0
    
    # 환경 변수가 없으면 설정
    if [ -z "$INTERVAL" ]; then
        INTERVAL=3
    fi
    
    #  기동 시 상태 획득 <-- 추가 처리 #1
    if [ -f save.dat ]; then
        COUNT='cat.save.dat'
        rm -f save.dat
    fi
    
    # SIGTERM 수신 시 처리
    save() {
        echo $COUNT > save.dat
        exit 0
    }
    trap save TERM
    
    # 메인 루프
    while [ true ];
    do
        TM=$(date | awk '{print $4}')
        printf "%s : %s \n" $TM $COUNT
        let COUNT=COUNT+1
        sleep $INTERVAL
    done
  • 실행 결과

 

stop을 입력하였더니 카운팅을 멈췄다.