Kubernetes Ephemeral 컨테이너 완전 정복 🚀

Kubernetes에서 실시간 디버깅을 위한 강력한 도구, Ephemeral 컨테이너에 대해 알아봅니다.
실전 사용법부터 리소스 경합, 종료 후 동작까지 완전 정리!


📚 목차

  1. Ephemeral 컨테이너란?
  2. Ephemeral 컨테이너 생성 방법
  3. 디버깅용 추천 이미지
  4. 다른 컨테이너의 파일 시스템 접근
  5. Pod 내 컨테이너 목록 확인
  6. Ephemeral 컨테이너의 리소스 사용 방식
  7. Kubernetes QoS 클래스 정리
  8. 종료된 Ephemeral 컨테이너는 어떻게 되나?

1️⃣ Ephemeral 컨테이너란?

  • 기존 Pod에 일시적으로 주입되는 디버깅 전용 컨테이너
  • spec.ephemeralContainers[]에만 등록됨
  • 자동 재시작 없음, resources, livenessProbe 설정 불가
  • Kubernetes v1.25 이상에서 정식 지원

2️⃣ Ephemeral 컨테이너 생성 방법

Deployment, ReplicaSet 등 컨트롤러 오브젝트에 선언 불가 (오직 kubectl 또는 API를 통해 수동 주입 가능)

1. kubectl degug

kubectl debug -it <pod-name> \
  --image=nicolaka/netshoot \
  --target=<container-name>

💡 tip: --target을 지정해야 해당 컨테이너의 네임스페이스(PID/mount)를 공유합니다.

 

2. Kubernetes API를 통해 Ephemeral Container 주입 (kubectl 없이)

CI/CD 또는 운영 자동화 파이프라인에서 kubectl debug와 같은 명령 없이 Kubernetes API를 통해 ephemeral container를 주입하는 코드도 가능 (예: PATCH /api/v1/namespaces/{ns}/pods/{pod}/ephemeralcontainers)

# bash

# 1. 로컬에서 kubectl proxy 실행
kubectl proxy &

# 2. Ephemeral Container 정의를 PATCH로 주입
curl -X PATCH \
  --header "Content-Type: application/strategic-merge-patch+json" \
  --data '{
    "ephemeralContainers": [{
      "name": "debugger",
      "image": "busybox",
      "command": ["sh"],
      "stdin": true,
      "tty": true
    }]
  }' \
  http://localhost:8001/api/v1/namespaces/default/pods/<your-pod-name>/ephemeralcontainers
위 요청은 kubectl proxy 또는 인증 헤더를 설정한 경우에만 작동합니다.

 

3. CI/CD 파이프라인에서 사용 가능한 kubectl patch 스크립트 예시

CI 도구 (예: GitLab CI, Jenkins, Argo CD 등)에서 kubectl을 사용할 수 있다면 아래처럼 ephemeral container를 스크립트로 주입할 수 있습니다.

# ephemeral-debugger.yaml
ephemeralContainers:
- name: debugger
  image: busybox
  command:
    - sh
  stdin: true
  tty: true
# bash
# CI 스크립트 예시
POD_NAME=$(kubectl get pod -l app=my-app -n default -o jsonpath='{.items[0].metadata.name}')
kubectl get pod $POD_NAME -n default -o json > pod.json

# pod.json에 ephemeralContainers를 병합하여 패치
kubectl patch pod $POD_NAME -n default --type='merge' \
  -p "$(cat ephemeral-debugger.yaml | yq eval -o=json)"

💡 tip: yq는 YAML → JSON 변환에 사용됩니다. (yq 설치 필요)


3️⃣ 디버깅용 추천 이미지

이미지 주요 도구 특징
nicolaka/netshoot curl, dig, tcpdump 등 네트워크 디버깅 특화
praqma/network-multitool curl, nc, telnet 등 CLI 도구 다양
curlimages/curl curl 전용 작지만 기능 제한
alpine + 수동 설치 apk add curl 가볍지만 번거로움

❗주의: busybox:glibc에는 curl이 포함되어 있지 않습니다.


4️⃣ 다른 컨테이너의 파일 시스템 접근

# 대상 컨테이너 파일 시스템에 접근
ls /proc/1/root/
cat /proc/1/root/etc/hostname
  • /proc/1/root/: 대상 컨테이너의 루트 파일 시스템을 마운트한 위치
  • --target 옵션 필수! 그렇지 않으면 네임스페이스가 분리되어 접근 불가

5️⃣ Pod 내 컨테이너 목록 확인

# 일반 컨테이너
kubectl get pod <pod> -o jsonpath="{.spec.containers[*].name}"

# Init 컨테이너
kubectl get pod <pod> -o jsonpath="{.spec.initContainers[*].name}"

# Ephemeral 컨테이너
kubectl get pod <pod> -o jsonpath="{.spec.ephemeralContainers[*].name}"

또는 kubectl describe pod <pod> 명령으로 한 번에 확인 가능


6️⃣ Ephemeral 컨테이너의 리소스 사용 방식

  • resources.requests, limits 설정 불가
  • 항상 BestEffort QoS로 동작
  • Pod 전체 자원을 공유하며 경합

⚠️ 경고: CPU/메모리 과다 사용 시 다른 컨테이너에 영향(OOM, 쓰로틀링)


7️⃣ Kubernetes QoS 클래스 정리

QoS Class 조건 특징
Guaranteed requests == limits (모든 컨테이너) 가장 높은 우선순위
Burstable requests 또는 limits만 설정 중간 우선순위
BestEffort 모든 설정 없음 가장 낮은 우선순위
# QoS 확인
kubectl get pod <pod> -o jsonpath='{.status.qosClass}'

📌 Ephemeral 컨테이너는 항상 BestEffort입니다.


8️⃣ 종료된 Ephemeral 컨테이너는 어떻게 되나?

  • 실행 종료되면 state.terminated 상태로 전환
  • Pod YAML에는 남아 있지만, 실제 컨테이너는 종료됨
  • 삭제 불가 → Pod 자체 삭제 또는 recreate 필요
# 종료 상태 확인
kubectl describe pod <pod>

# 또는
kubectl get pod <pod> -o jsonpath='{.status.ephemeralContainerStatuses[*].state.terminated.reason}'

9️⃣ 디버깅 외의 Ephemeral Container 활용 사례

1. 보안 및 감사 목적

• 보안팀이 프로덕션 파드 내부를 조사해야 할 때, 기존 애플리케이션 컨테이너를 방해하지 않고 ephemeral container를 주입하여 확인 가능.
• 예: 보안 스캐닝 도구, 파일 시스템 검사, 포렌식 분석 등.

2. 라이브 시스템 진단 도구 실행

• 파드에 tcpdump, strace, netstat, iftop, ps, lsof 등 시스템 수준 도구를 임시로 실행할 수 있음.
• 해당 도구가 원래 이미지에 없더라도 ephemeral container로 실행 가능.

3. 운영 자동화

• 자동화된 운영 시스템에서 특정 이벤트 발생 시 ephemeral container를 자동으로 주입하여 문제 파악 및 수집 작업을 수행.
• 예: OOMKilled 이벤트 발생 시 heap dump를 자동으로 수집하는 용도.

4. 임시 환경 설정

• 롤링 배포 전 특정 파드 상태나 설정을 확인하거나 일시적으로 변경하려는 상황에서 ephemeral container를 활용.
• 임시적으로 환경 변수나 마운트 상태 등을 확인하기 위한 환경으로 사용 가능.

---

✅ 정리 요약

항목 설명
생성 방법 kubectl debug --target=<컨테이너>
파일 접근 /proc/1/root/ 경로로 가능
리소스 제한 없음 (Always BestEffort)
종료 후 컨테이너는 종료되나 YAML에는 기록 남음
삭제 Pod 삭제 또는 롤링 업데이트 필요

🔗 참고 링크