본문으로 건너뛰기

원격 명령 실행

때로는 로그만으로 문제를 파악하기 어려울 때가 있습니다. 이럴 때 운영 모달의 명령 실행 탭에서 kubectl/docker/podman 명령을 실행해 심층적인 디버깅을 수행할 수 있습니다.

명령 실행 탭은 모든 런타임에서 제공되지만, 런타임에 따라 명령 입력 방식이 다릅니다.

  • Kubernetes: Pod 드롭다운이 없으며 kubectl 명령 전체를 입력합니다.
  • Docker · Podman: 컨테이너를 선택하지 않으면 호스트에서, 선택하면 컨테이너 내부에서 명령이 실행됩니다.

운영 탭 - 명령 실행

설치형 Basic 화면 — 운영 탭이 개요·파드 목록·워크로드·로그 조회·도메인 설정 다섯뿐이고 명령 실행 탭이 없습니다
설치형 Basic 화면

명령 실행은 대화형 셸이 아닙니다. KIOPS의 명령 실행은 단발성 또는 실시간 스트리밍 명령 실행 모델입니다. kubectl exec -it, docker exec -it, port-forward, attach 등 대화형/포트 포워딩 옵션은 차단되어 있으므로, 인터랙티브 셸 세션 형태로는 사용할 수 없습니다.

기능 개요​

KIOPS는 두 가지 모드로 명령 실행을 지원합니다.

  • 단발성 모드: 한 번에 한 명령을 실행하고 결과를 반환합니다. logs/events 명령은 60초, 그 외 명령은 30초 타임아웃이 적용되며, -f, -w, exec -it, port-forward 등 장기 실행/포트 포워딩 옵션이 차단됩니다.
  • 실시간(streaming) 모드: 명령의 stdout을 실시간으로 스트리밍합니다. 세션 최대 10분, 출력 최대 5MB이며, exec -it, port-forward, attach가 차단됩니다.

사용자당 동시 실시간 세션은 최대 3개로 제한됩니다.


명령 실행 탭 접근​

  1. [서비스 관리] → 서비스 선택
  2. Operate 단계 클릭
  3. 명령 실행 탭 선택

명령 입력 방식​

Kubernetes 모드​

  • Pod 드롭다운은 제공되지 않습니다.
  • kubectl 명령 전체를 입력합니다.
  • 실시간(streaming) 모드에서는 서비스에 연결된 namespace가 자동으로 -n <namespace> 형태로 부착됩니다. 명령에 다른 -n 값이나 --namespace를 직접 지정하면 차단됩니다.
  • namespace 외부 접근을 차단하기 위해 -A, --all-namespaces 옵션도 사용할 수 없습니다.
  • 따라서 모든 명령은 서비스에 연결된 namespace 내에서만 실행됩니다.

예시:

kubectl get pods -n my-namespace
kubectl describe pod my-pod -n my-namespace
kubectl logs my-pod -n my-namespace --tail=200

Docker / Podman 모드​

  • 컨테이너 선택은 선택 사항입니다.
  • 미선택: 호스트에서 명령이 실행됩니다(SSH 기반).
  • 선택: 해당 컨테이너에 대해 exec이 수행됩니다.

예시:

# 호스트에서 실행 (컨테이너 미선택)
docker ps
docker images

# 컨테이너 내부에서 실행 (컨테이너 선택)
ls /app
cat /etc/hosts

모드별 제한 사항​

단발성 모드​

  • 명령 타임아웃: logs/events는 60초, 그 외 명령은 30초
  • 차단 옵션: -f, -w, exec -it, port-forward
  • 길게 실행되는 명령(tail -f 등)은 단발성 모드에서 동작하지 않습니다. 실시간 모드를 사용하세요.

실시간 (streaming) 모드​

  • 세션 최대: 10분
  • 출력 최대: 5MB
  • 사용자당 동시 세션: 3개
  • 차단 옵션: exec -it, port-forward, attach

결과 확인​

  • 명령 실행 결과가 출력 영역에 표시됩니다.
  • 실시간 모드에서는 출력이 스트리밍 형태로 누적됩니다.
  • 에러 발생 시 에러 메시지가 함께 표시됩니다.

자주 사용하는 명령어​

실무에서 자주 사용하는 명령어들을 정리했습니다. 필요한 명령어를 복사해서 사용하세요.

처음 사용한다면 Linux 명령어에 익숙하지 않은 경우 먼저 읽기 전용 명령어(cat, ls, ps 등)부터 시작하세요. 시스템을 변경하지 않으므로 안전합니다.

Kubernetes (kubectl)​

# Pod 목록
kubectl get pods -n <namespace>

# Pod 상세 정보
kubectl describe pod <pod-name> -n <namespace>

# 최근 로그 200줄
kubectl logs <pod-name> -n <namespace> --tail=200

# Deployment 상태
kubectl get deploy -n <namespace>

# 이벤트 확인
kubectl get events -n <namespace> --sort-by='.lastTimestamp'

Docker / Podman (호스트)​

# 컨테이너 목록
docker ps

# 이미지 목록
docker images

# 시스템 디스크 사용량
docker system df

# 로그 확인 (단발성: --tail 권장)
docker logs --tail=200 <container>

컨테이너 내부 (Docker/Podman 모드에서 컨테이너 선택 시)​

# OS 정보 확인
cat /etc/os-release

# 호스트명 확인
hostname

# 프로세스 목록
ps aux

# 메모리 사용량
free -m

# 디스크 사용량
df -h

# 환경 변수 확인
env | grep -i database

디버깅 시나리오​

시나리오 1: 메모리 부족 진단​

Container가 OOM(Out of Memory)으로 계속 재시작되는 상황입니다.

증상: Container가 갑자기 종료되고 "OOMKilled" 상태가 됩니다.

진단 명령 (Docker/Podman 모드, 컨테이너 선택):

free -m
ps aux --sort=-%mem | head -5

결과 분석: 어떤 프로세스가 메모리를 많이 사용하는지 확인합니다.

대응 방법:

  • 메모리 limit을 증가시킵니다.
  • 또는 메모리 누수가 있다면 코드를 수정합니다.

시나리오 2: 네트워크 연결 문제​

  1. 증상: DB 연결 실패
  2. 명령 실행 (컨테이너 선택):
    nc -zv database-host 5432
    nslookup database-host
  3. 결과 분석: DNS 해석 또는 포트 연결 확인
  4. 대응: 네트워크 정책, 서비스 엔드포인트 확인

시나리오 3: 설정 파일 확인 (K8s)​

  1. 증상: 애플리케이션 동작 이상
  2. 명령 실행:
    kubectl exec <pod> -n <ns> -- cat /app/config/application.yml
    kubectl exec <pod> -n <ns> -- env
  3. 결과 분석: 설정 값 확인
  4. 대응: ConfigMap/환경 변수 수정

시나리오 4: 실시간 로그 모니터링​

tail -f 같은 장기 실행 명령은 단발성 모드에서 차단되므로 실시간 모드를 사용합니다.

  1. 명령 실행 탭에서 실시간 모드로 전환합니다.
  2. 명령 입력:
    kubectl logs -f <pod> -n <namespace>
  3. 출력이 실시간으로 스트리밍됩니다(최대 10분 / 5MB).

주의사항​

Production 환경 주의

Production 환경에서 명령 실행 시 주의하세요:

  • 데이터 변경 명령 (rm, mv, truncate) 신중히 사용
  • 리소스 영향 명령 (fork bomb, 무한 루프) 금지
  • 민감 정보가 출력될 수 있으므로 화면 공유 주의

차단되는 명령/옵션​

  • 대화형: kubectl exec -it, docker exec -it
  • 포트 포워딩: kubectl port-forward
  • attach: kubectl attach, docker attach
  • namespace 전역: kubectl -A, kubectl --all-namespaces
  • 단발성 모드 한정 차단: -f, -w

피해야 할 명령​

  • rm -rf / - 시스템 전체 삭제
  • :(){ :|:& };: - Fork bomb (리소스 고갈)
  • kill -9 1 - PID 1 종료
  • chmod -R 777 / - 보안 취약
  • dd if=/dev/zero of=/dev/sda - 디스크 파괴

안전한 사용법​

  1. 읽기 전용 명령 먼저: cat, ls, ps, kubectl get, docker ps 등으로 상황 파악
  2. 테스트 환경에서 먼저: 위험한 명령은 개발 환경에서 테스트
  3. 백업 확인: 중요 파일 수정 전 백업 상태 확인
  4. 동료 검토: 중요한 작업은 다른 팀원과 함께

권한​

권한 안내: 명령 실행 기능에 접근할 수 없다면 기관 관리자에게 권한을 요청하세요. 권한이 없는 경우 명령 실행 탭이 비활성화됩니다.


감사 로그​

모든 명령 실행은 감사 로그에 기록됩니다:

  • 실행 시간: 명령 실행 시각
  • 실행자: 명령을 실행한 사용자
  • 대상: 인프라/네임스페이스/컨테이너
  • 명령어: 실행된 명령
  • 결과: 성공/실패

문제 해결​

  • "command not found": 해당 명령이 컨테이너에 없습니다. 다른 명령을 사용하거나 패키지를 설치하세요.
  • "Permission denied": 권한이 부족합니다. 필요한 사용자/권한을 확인하세요.
  • 차단된 옵션 오류: -it, port-forward, -A 등 차단 옵션을 포함했는지 확인하세요.
  • 응답 없음 / 타임아웃: 단발성 모드 한도(logs/events는 60초, 그 외 30초)를 초과했을 수 있습니다. 실시간 모드를 사용하거나 명령을 단순화하세요.
  • 실시간 세션 시작 실패: 사용자당 동시 세션 3개 한도를 초과했을 수 있습니다. 기존 세션을 종료하세요.

컨테이너에 셸이 없는 경우​

KIOPS의 명령 실행은 컨테이너 진입형이 아니라 명령어 실행 모델입니다. Docker/Podman 모드에서 컨테이너를 선택해 exec을 사용하는 경우에 한해, 컨테이너 내부 셸/바이너리가 필요합니다. 최소화된 이미지(distroless 등)에서는 셸이 없어 명령이 실패할 수 있으니, 이미지에 포함된 바이너리를 직접 호출하세요.


관련 가이드​