Docker & Kubernetes

컨테이너 API

beekei 2021. 11. 26. 14:23
반응형
컨테이너 API의 종류와 개요

컨테이너 API란 컨테이너를 블랙박스처럼 다룰 수 있게 해주는 인터페이스이다.

소프트웨어에서는 서로 다른 팀이 개발한 프로그램들을 연결하기 위해 서로 지켜야 하는 규격을 인터페이스라 한다.

따라서 API는 대상이 되는 프로그램을 블랙박스로 취급하여 다른 프로그램에서 호출할 수 있게 해준다.

이는 쿠버네티스 환경에서도 사용된다.

컨테이너 API는 몇 가지 종류가 있으며, 각각의 목적과 사용법이 다르다.

 

컨테이너 API

모든 API를 필수적으로 알고 구현해야 되는 것은 아니다.

애플리케이션의 특성에 맞게 적절한 API를 선택하여 구현하면 된다. 

컨테이너 기동

컨테이너 내의 애플리케이션은 기동 시에 환경 변수나 실행 인자를 읽어서 그에 맞게 동작하게 만들 수 있다.

헬스 체크(쿠버네티스 환경)

준비 완료 프로브는 컨테이너의 애플리케이션이 초기화가 완료되어 외부로부터 요청을 받을 수 있게 되었음을 알리는 인터페이스이다.

로드밸런서가 컨테이너에 요청을 전달하기 시작해도될지 확인하기 위한 목적으로 사용된다.

 

활성 프로브는 애플리케이션의 기동 상태(정상/비정상)를 알리는 인터페이스다.

이를 통해 비정상이 감지되면 쿠버네티스가 컨테이너를 재기동하여 복구를 시도한다.

 

애플리케이션에 이들 API에 대응하는 구현을 하면 쿠버네티스의 헬스 체크 기능을 사용할 수 있다.

컨테이너 종료

컨테이너 내의 애플리케이션은 종료 요청 시그널(SIGTERM)에 대한 종료 처리를 구현하는 것이 좋다.

여기서 종료 처리란 메모리 값을 보존하거나 데이터베이스와 세션을 종료한 뒤 정상 종료하는 것을 말한다.

 

강제 종료 시그널(SIGKILL)은 제한 시간 내에 종료 처리가 완료되지 않는 경우 컨테이너를 강제 종료하기 위해 사용한다.

애플리케이션이 강제 종료를 막을 수 있는 방법은 없다.

서비스

컨테이너 위에서 돌아가는 서버 애플리케이션은 특정 포트를 통해 클라이언트로부터의 요청을 받아들인다.

서비스는 특정 포트번호로 클라이언트로부터의 요청을 받고, 처리 결과를 반환하는 역활을 수행한다.

이를 위해서는 컨테이너의 포트를 호스트의 IP 주소에 포트 포워딩을 하여 외부에서의 요청을 받아들여야 한다.

 

쿠버네티스에서는 컨테이너를 담는 파드에 포트를 열어 클라이언트로부터의 요청을 받는다.

그리고 파드로의 접근을 돕는 쿠버네티스 오브젝트인 서비스와 연동하여 클라이언트에게 기능을 공개한다.

로그

마이크로서비스 아키텍처를 사용하고 규모가 커지게 되면 보통 많은 수의 컨테이너를 돌리게 된다.

그러면 프로그램의 로그의 양도 비례해서 늘어나는데, 도커나 쿠버네티스에서는 로그를 일관되게 관리하여 컨테이너의 표준 출력(STDOUT)과 표준 오류(STDERR)를 로그로 간직한다.

따라서 컨테이너의 애플리케이션은 로그를 파일에 쓰는 것이 아니라 표준 출력이나 표준 오류에 쓰면 된다.

도커 허브에 등록된 Nginx의 경우는 엑세스 로그를 포준 출력에 출력한다.

후크(쿠버네티스 환경)

컨테이너가 기동하고 종료할 때 컨테이너 내에서 특정 처리를 실행시킬 수 있다.

쿠버네티스에서는 파드의 매니페스트에 실행 내용을 기술할 수 있다.

 

컨테이너에는 후크에 의해 실행될 스크립트, 혹은 HTTP 요청 처리를 구현해야 한다.

이때 Dockerfile의 ENTRYPOINT나  CMD로 지정한 명령어와 후크는 비동기적으로 실행되어 실행 순서가 보장되지 않는다.

퍼시스턴트 볼륨

컨테이너에서 퍼시스턴트 볼륨을 사용하는 대표적인 경우는 설정 파일을 외부에서 주입하는 경우와 발생 데이터를 보존하는 경우 두 가지가 있다.

두 경우 모두 호스트의 디렉터리를 컨테이너의 파일 시스템에 마운트 하여 사용한다.

 

전자에 경우, 애플리케이션이 읽어 들일 설정 파일을 컨테이너 외부에서 주입한다.

그러면 설정 파일을 바꾸기 위해 이미지를 다시 빌드하지 않아도 되어 컨테이너의 재사용성이 높아진다.

주입하는 방법은 설정파일을 담은 디렉터리를 컨테이너의 특정 디ㅌ렉처리에 마운트 하면 된다.

 

또한, 인증서와 같이 보안에 민감한 파일은 이미지에 담아 리포지터리에 등록해서는 안된다.

이 경우에도 퍼시스턴트 볼륨을 사용하여 외부에서 컨테이너에 주입해야 한다.

쿠버네티스에는 보안에 민감한 데이터를 다루기 위한 시크릿과 일반적인 설정 파일을 다루는 컨피그맵이 있다.

 

컨테이너는 일시적인 존재이기 때문에 보관이 필요한 데이터를 컨테이너의 파일 시스템에 저장해서는 안된다.

컨테이너가 삭제되면 데이터도 삭제되기 때문이다. 이를 위해 쿠버네티스의 퍼시스턴트 볼륨이 존재한다.

종료 상태

PID가 1인 프로세스의 Exit 코드가 컨테이너의 종료 코드로 설정된다.

쿠버네티스에서는 컨테이너가 종료 코드 0으로 종료하면 정상 종료로 취급하고, 그 외의 값인 경우에는 비정상 종료로 취급한다.

컨테이너상의 애플리케이션은 적절하게 종료 코드를 반환하도록 구현해야 한다.

그 외

그 외에 해당하는 것들은 애플리케이션에서 구현할 컨테이너 API 기능은 아니지만 관계가 깊은 것들이다.

 

접속 네트워크는 컨테이너 간 연동을 위해 존재한다. 

예를 들어, 한 컨테이너가 데이터베이스 컨테이너를 필요로 하는 경우엔 같은 네트워크에 묶으면 된다.

메모리 요구량이나 CPU 요구 시간의 경우는 컨테이너 실행 전에 필요한 크기를 예측하여 설정하면 쿠버네티스가 스케줄링을 효과적으로 수행하여 문제를 미연에 방지할 수 있다.

반응형