본문 바로가기
Container/Kubernetes

Kubernetes Ephemeral container 란?

by sa-na 2022. 8. 15.

들어가며

컨테이너가 크래시 됐거나, distroless 이미지처럼 컨테이너 이미지에 디버깅 도구(shellyum, apt 같은 패키지 매니저)를 포함하고 있지 않아 kubectl exec로는 충분하지 않은 경우에는 임시(Ephemeral) 컨테이너를 사용하는 것이 인터랙티브한 트러블슈팅에 유용합니다. 즉, shell이 없어서 아래와 같은 오류가 날 때 유용하게 사용할 수 있겠죠.

Shell이 없는 Pod는 디버깅이 어렵습니다.

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 사용법에 대해서 알아보았습니다.

 

감사합니다.

댓글