들어가며
컨테이너가 크래시 됐거나, distroless 이미지처럼 컨테이너 이미지에 디버깅 도구(shell
과 yum
, apt
같은 패키지 매니저)를 포함하고 있지 않아 kubectl exec로는 충분하지 않은 경우에는 임시(Ephemeral) 컨테이너를 사용하는 것이 인터랙티브한 트러블슈팅에 유용합니다. 즉, shell
이 없어서 아래와 같은 오류가 날 때 유용하게 사용할 수 있겠죠.
Kubernetes Ephemeral container 란?
임시 컨테이너 (Ephemeral container)는 Kubernetes v1.23이상에서 Beta로 지원하고 있습니다. 우선 임시 컨테이너가 무엇인지 알아보기 위해 임의의 Pod를 생성해 봅시다. 이 Pod의 Container Image는 shell이 없는 이미지입니다.
kubectl run ephemeral-demo --image=k8s.gcr.io/pause:3.1 --restart=Never
만약 처음처럼 kubectl exec
을 통해 shell을 생성하려 한다면 다음과 같은 에러를 확인할 수 있을 텐데, 그 이유는 이 이미지가 shell이 없기 때문이죠.
kubectl exec -it ephemeral-demo -- sh
이 명령어 대신 kubectl debug을 사용해서 디버깅 컨테이너를 생성할 수 있습니다. 만약 -i/--interactive 파라미터를 사용한다면, kubectl은 임시 컨테이너의 콘솔에 자동으로 연결을 해줍니다.
kubectl debug -it ephemeral-demo --image=busybox --target=ephemeral-demo
이제 디버깅을 해 보겠습니다. ps -ef
를 해보면
Ephemeral Container는 기본적으로 항상 떠있는 PID 1번의 /pause
, 그리고 현재 접속해있는 shell인 sh
, 조금전 실행한 ps -ef
말고 다른 Container의 PID는 확인할 수 없는데요.

이는 파드 내 컨테이너 간 프로세스 네임스페이스가 공유되지 않았기 때문입니다.
프로세스 네임스페이스 공유
프로세스 네임스페이스를 공유하기 위해 Pod의 manifest를 수정해보도록 하겠습니다.
kubectl delete pod ephemeral-demo
kubectl run ephemeral-demo --image=k8s.gcr.io/pause:3.1 --restart=Never --dry-run=client -o yaml > demo.yaml
demo.yaml
파일을 수정해봅시다. 아래와 같이 shareProcessNamespace: true
를 추가합니다.
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: ephemeral-demo
name: ephemeral-demo
spec:
shareProcessNamespace: true
containers:
- image: k8s.gcr.io/pause:3.1
name: ephemeral-demo
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Never
status: {}
kubectl apply -f demo.yaml
다시 디버깅을 해보겠습니다.
kubectl debug -it ephemeral-demo --image=busybox --target=ephemeral-demo
ps -ef
를 해보면 이제 다른 컨테이너의 프로세스까지 확인을 해보실 수 있습니다.
최종적으로 디버깅을 완료하고, 종료하면 다음과 같이 Pod에 Ephemeral Containers
항목이 있는데 Terminated
상태로 종료가 된 것을 확인할 수 있습니다.
이상으로 Ephemeral Container 사용법에 대해서 알아보았습니다.
감사합니다.
'Container > Kubernetes' 카테고리의 다른 글
containerd를 위한 fluent-bit config 설정 (0) | 2022.06.26 |
---|---|
Service account token Volume Projection이란? (0) | 2022.06.26 |
댓글