컨테이너에서의 command
는 해당 컨테이너가 시작될 때 실행할 명령을 명시하는 데 사용된다.
이는 컨테이너가 실행되면서 수행할 첫 번째 명령이 된다.
다음과 같은 Pod가 있다고 하자.
apiVersion: v1
kind: Pod
metadata:
labels:
run: simple-wo-command
name: simple-wo-command
spec:
containers:
- image: sysnet4admin/net-tools
name: net-tools
현재 Pod
의 컨테이너로는 net-tools
이미지를 사용해서 네트워크에 대한 테스트를 수행하려고 한다.
🧐 넷툴즈(Net-Tools)란?
네트워크 관련 유틸리티를 모아놓은 패키지로, 리눅스 기반 시스템에서 네트워크 관련 작업을 수행하는 데 사용된다.
네트워크 인터페이스 설정, 라우팅 테이블 확인, 네트워크 연결 테스트 등 다양한 기능이 있다.
하지만 명시된 커맨드 없이 net-tools
이미지를 배포할 시 파드는 종료되고, 실행되고의 과정이 무한정 반복되어 발생하게 된다.
이를 1시간 동안 마다 작업이 수행 되도록 명령어를 사용해 다시 배포해 보자.
apiVersion: v1
kind: Pod
metadata:
labels:
run: simple-command
name: simple-command
spec:
containers:
- image: sysnet4admin/net-tools
name: net-tools
command: ["/bin/sh", "-c", "sleep 3600"]
command
로 ["/bin/sh", "-c", "sleep 3600"]를 작성하였다.
각 파라미터의 의미는 다음과 같다.
/bin/sh
: 컨테이너 내에서 셸을 실행-c
: 셸에게 명령어를 실행하도록 하는 옵션
이 옵션 뒤에 오는 것이 셸에서 실행될 명령어가 됨sleep 3600
: 셸에서 실행될 명령어
여기서는 sleep 명령어를 사용하여 3600초(1시간) 동안 실행을 중지하도록 지정
command
를 통해서 더이상 종료, 실행의 반복이 발생하지 않는 것을 확인할 수 있다.
생성된 net-tools
파드에 접속해서 nslookup
을 통해서 도메인에 대한 정보를 조회해보자.
🧐 nslookup이란?
nslookup
은 도메인 이름에 대한 IP 주소 및 도메인 정보를 DNS(Domain Name System) 서버로부터 조회하는 데 사용된다.
# 접속
[root@m-k8s ~] k exec simple-command -it -- /bin/bash
# nslookup 실행
[root@simple-command /] nslookup kubernetes
Server
: DNS 서버의 주소.Address
: 조회한 도메인 이름에 대한 IP 주소.yaml 파일을 작성할 때 다음과 같이 args
를 사용해서 command
뒤에 전달될 인자를 통해 명령어를 줄 수도 있다.
먼저 args를 줄 때, 도커에서의 이름과 k8s에서의 이름이 약간 다르다.
설명하자면, 컨테이너는 도커가 만들어 주는 "도커 이미지" 이므로 도커에서도 이러한 command와 args를 사용할 수 있다. Entypoint와 Cmd의 이름으로 말이다.
문제는 컨테이너에 대해서 도커와 쿠버네티스 둘 다, command 또는 Entypoint
와 args 또는 Cmd
를 던진다면 최종적으로 실행되는 커맨드가 달라진다는 것이다.
도커와 컨테이너의 커맨드가 겹쳤을 때의 최종 실행되는 형태는 다음과 같다.
한시간 마다 수행한다면 굳이 sleep
명령어로 프로세스를 중지시키는 게 아닌, CronJob을 사용하여 Job
을 주기적으로 발생시켜 실행하면 되는 것 아니냐라는 의문이 들 수 있다.
👉 전적으로 동의한다.😂
강의에서 제공한 소스코드 예제가 그랬을 뿐. 사실 커맨드 명령어를 통해서 파드의 생명주기를 건드리는 예제는 그닥 적절하지는 않다.
커맨드는 단지 파드의 라이프사이클 내에서 즉시 실행되는 명령으로, 일반적으로 일회성 작업이나 초기화 작업에 사용되기 때문이다.
비교를 하자면 다음과 같다.
Job
은 Kubernetes에서 일회성 작업 또는 완료까지 실행되어야 하는 작업을 수행한다.
Job
을 사용하면 성공적으로 완료될 때 까지 반복하고, 성공할 시 종료되도록 하는 작업을 실행할 수 있다.
- 일회성 또는 주기적으로 실행되는 작업.
- 병렬로 여러 작업을 실행하고자 할 때.
컨테이너 내부에서의 command
는 해당 컨테이너가 시작될 때 실행될 명령을 정의한다.
이는 해당 컨테이너에서 수행해야 하는 첫 번째 작업으로 해당 컨테이너가 실행되면 무조건 실행되는 명령이다.
- 컨테이너가 시작될 때 특정 초기화 작업을 실행해야 할 때.
- 이미지에 내장된 기본 실행 파일이나 스크립트 대신 사용자 정의 명령을 실행하고자 할 때.
Job
은 Kubernetes에서 일괄 작업을 관리하고 완료될 때까지 유지하는 데 사용되며, command
는 해당 컨테이너가 시작될 때 실행될 명령을 지정하는 데 사용된다.
필요에 따라 둘을 혼합하여 원하는 작업을 수행할 수 있다.