본문으로 건너뛰기

원격 명령 실행

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

런타임에 따라 명령 입력 방식이 다릅니다

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

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

운영 탭 - 명령 실행

명령 실행은 대화형 쉘이 아닙니다

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개로 제한됩니다.


Execute 탭 접근

  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/events60초, 그 외 명령은 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 등)에서는 셸이 없어 명령이 실패할 수 있으니, 이미지에 포함된 바이너리를 직접 호출하세요.


관련 가이드