[kubernetes] 컨테이너에 명령(Command) 사용하기 (feat. docker와 명령어가 겹친다면)

vinca·2023년 11월 17일
0

☸️ kubernetes

목록 보기
12/35
post-thumbnail

컨테이너에서의 Command 언제쓸까?

컨테이너에서의 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 서버의 주소.
    이 경우에는 10.96.0.10이라는 DNS 서버 주소가 사용되었다.
  • Address: 조회한 도메인 이름에 대한 IP 주소.
    kubernetes는 10.96.0.1이라는 IP 주소를 사용하고 있다는 것을 알 수 있다.

args를 사용

yaml 파일을 작성할 때 다음과 같이 args를 사용해서 command뒤에 전달될 인자를 통해 명령어를 줄 수도 있다.

도커와의 커멘드가 겹친다면?

먼저 args를 줄 때, 도커에서의 이름과 k8s에서의 이름이 약간 다르다.

설명하자면, 컨테이너는 도커가 만들어 주는 "도커 이미지" 이므로 도커에서도 이러한 command와 args를 사용할 수 있다. EntypointCmd의 이름으로 말이다.

그게 뭐가 문제인데? 🔥

문제는 컨테이너에 대해서 도커와 쿠버네티스 둘 다, command 또는 Entypointargs 또는 Cmd를 던진다면 최종적으로 실행되는 커맨드가 달라진다는 것이다.

도커와 컨테이너의 커맨드가 겹쳤을 때의 최종 실행되는 형태는 다음과 같다.


🔎Job과 command의 차이

한시간 마다 수행한다면 굳이 sleep 명령어로 프로세스를 중지시키는 게 아닌, CronJob을 사용하여 Job주기적으로 발생시켜 실행하면 되는 것 아니냐라는 의문이 들 수 있다.

👉 전적으로 동의한다.😂

강의에서 제공한 소스코드 예제가 그랬을 뿐. 사실 커맨드 명령어를 통해서 파드의 생명주기를 건드리는 예제는 그닥 적절하지는 않다.

커맨드는 단지 파드의 라이프사이클 내에서 즉시 실행되는 명령으로, 일반적으로 일회성 작업이나 초기화 작업에 사용되기 때문이다.

비교를 하자면 다음과 같다.

Job

Job은 Kubernetes에서 일회성 작업 또는 완료까지 실행되어야 하는 작업을 수행한다.
Job을 사용하면 성공적으로 완료될 때 까지 반복하고, 성공할 시 종료되도록 하는 작업을 실행할 수 있다.

예시

  • 일회성 또는 주기적으로 실행되는 작업.
  • 병렬로 여러 작업을 실행하고자 할 때.

Command

컨테이너 내부에서의 command는 해당 컨테이너가 시작될 때 실행될 명령을 정의한다.
이는 해당 컨테이너에서 수행해야 하는 첫 번째 작업으로 해당 컨테이너가 실행되면 무조건 실행되는 명령이다.

예시

  • 컨테이너가 시작될 때 특정 초기화 작업을 실행해야 할 때.
  • 이미지에 내장된 기본 실행 파일이나 스크립트 대신 사용자 정의 명령을 실행하고자 할 때.

정리

Job은 Kubernetes에서 일괄 작업을 관리하고 완료될 때까지 유지하는 데 사용되며, command는 해당 컨테이너가 시작될 때 실행될 명령을 지정하는 데 사용된다.
필요에 따라 둘을 혼합하여 원하는 작업을 수행할 수 있다.

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps

0개의 댓글