Kubernetes에서 실시간 디버깅을 위한 강력한 도구, Ephemeral 컨테이너에 대해 알아봅니다.
실전 사용법부터 리소스 경합, 종료 후 동작까지 완전 정리!
📚 목차
- Ephemeral 컨테이너란?
- Ephemeral 컨테이너 생성 방법
- 디버깅용 추천 이미지
- 다른 컨테이너의 파일 시스템 접근
- Pod 내 컨테이너 목록 확인
- Ephemeral 컨테이너의 리소스 사용 방식
- Kubernetes QoS 클래스 정리
- 종료된 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 삭제 또는 롤링 업데이트 필요 |
🔗 참고 링크
'DevOps > Docker & K8S' 카테고리의 다른 글
| Skaffold를 이용한 쿠버네티스 개발부터 디버깅·배포까지 (0) | 2025.07.13 |
|---|---|
| 쿠버네티스 환경의 효율적인 개발 도구 Telepresence (0) | 2025.07.12 |
| Ingress configuration-snippet vs server-snippet (0) | 2021.04.19 |
| Kubernetes Operator (0) | 2020.12.07 |
| ReplicaSet vs Replication Controller (레플리카세트 vs 레플리케이션 컨트롤러) (0) | 2020.06.18 |