[Kubernetes] Command Configure Application


서론

쿠버네티스에서 파드 정의 파일에서의 명령어와 인자(arguments)를 설정하는 부분이 있다.

이것에 대해 이해하기 위해서 먼저 Docker에서의 명령어와 컨테이너에 대한 이해가 선행되어야 한다.

따라서 이후 Kubernetes 파드 개념으로 연결해보자.

CMD

docker run ubuntu 명령어를 실행하면 Ubuntu 이미지 인스턴스가 실행되지만 즉시 종료된다. 실행 중인 컨테이너 목록에는 보이지 않으며 중지된 컨테이너 목록에는 해당 컨테이너가 종료 상태임을 볼 수 있다.

컨테이너는 가상머신과 달리 웹서버, 애플리케이션 서버, 데이터베이스, 혹은 단순한 연산 작업 등의 특정 작업이나 프로세스를 실행하기 위해 존재하며 운영체제를 호스팅하기 위해 설계된 것이 아니다.

이러한 작업이 완료되면 컨테이너는 종료됩니다.

컨테이너는 내부의 프로세스가 살아 있는 동안만 존재하며 만약 웹 서비스가 멈추거나 충돌하면, 컨테이너도 종료된다.

아래 Nginx & MYSQL 도커파일을 봐보면 CMD 를 통해 각 컨테이너가 실행될 때 실행할 프로그램을 명시해준다.

아래 ubuntu Dockerfile을 봐보면 기본 명령어로 bash를 사용한다.

그런데 bash는 웹 서버나 데이터베이스처럼 계속 실행되는 프로세스가 아니라 명령어를 입력으로 기다리는 Shell이다.

따라서 명령어가 입력되는게 없음으로 쉘을 바로 종료하게 된다.

컨테이너 시작시 Dockerfile의 CMD 명령어 이외의 다른 명령어로 지정해주고 싶다면 docker run에 추가로 명령어를 입력해준다.

즉, 커맨드라인에서 전달된 명령어가 있으면 CMD는 무시된다.

Example

# myimage
CMD ["sleep", "5"]
  •  docker run myimage 실행 시 sleep 5가 실행됨
  • docker run myimage sleep 10 실행 시 sleep 10이 실행됨

만약 명령어를 덮어 씌우는게 아닌 영구적으로 이미지를 실행할 때마다 반영하고 싶다면 Ubuntu 이미지를 기반으로 새로운 이미지를 만들고, 새로운 명령어를 지정해주면 된다.

Entrypoint

만약 컨테이너 실행시 매번 명령어를 넣어주기 불편하여 인자만 넘겨주도록 할 수 있다.

이런 경우는 Dockerfile에서 Entry point를 사용하면 된다.

즉, 컨테이너가 실행될 때 항상 고정적으로 실행될 명령어를 정의한다.

docker run 명령어에서 전달된 인자는 ENTRYPOINT 뒤에 추가(append)된다.

만약 Entrypoint를 런타임에서 바꾸고 싶은 경우 —entrypoint 옵션을 사용한다.

Example

# myimage
ENTRYPOINT ["sleep"]
  • docker run myimage 10 실행시 실행 명령은 docker run myimage sleep 10이 됨
docker run --entrypoint sleep2.0 myimage 10
  • 위 명령어 실행시 실제 명령어 docker run sleep2.0 10가 됨

CMD & Entrypoint

인자를 지정한 경우 값을 변경하되, 따로 지정하지 않았을 경우 기본값을 설정하려면 Entrypoint와 cmd를 둘다 함께 사용한다.

커맨드라인에 인자를 주지 않았다면, 시작 시 실행되는 명령은 sleep 5가 된다.

만약 커맨드라인에서 인자를 지정했다면, 그 값이 CMD를 덮어쓴다.

Example

# myimage
FROM Ubuntu

ENTRYPOINT ["sleep"]

CMD ["5"]
  • docker run ubuntu 명령어 실행시 실제 명령은 docker run ubuntu sleep 5
  • docker run ubuntu 10 명령어 실행시 실제 명령은 docker run ubuntu sleep 10

Pod

이번에는 쿠버네티스 파드에서의 컨테이너를 봐보자

이 파드가 생성되면, 지정된 이미지로 컨테이너가 생성되고, 컨테이너는 10초간 대기한 후 종료된다.

args 옵션을 사용하면, Dockerfile의 CMD 내용을 덮어쓸 수 있다.

아래 그림의 command 필드는 Dockerfile의 ENTRYPOINT를 덮어쓴다.