임시 컨테이너

개요

ephemeral container
존재하고 있는 파드에 일시적으로 실행시킬 수 있는 컨테이너이다.

파드는 클러스터 환경 내에서 일회용에 교체 가능하도록 설계되었고, 그래서 불변 객체로 만들어진다.
수정하느니 새로 만들겠다는 것이다.
달리 말해 한번 만들어진 파드에 컨테이너를 맘대로 추가할 수 없다.
그럼에도 트러블슈팅이나 하드코딩을 통해 특정 작업을 수행하고 싶은 경우가 있을 수 있다.
이럴 때 사용하라고 임시 컨테이너가 존재하는 것이다.

임시 컨테이너

이 컨테이너들은 안정적으로 리소스와 실행이 보장되지 않는다.
재시작도 자동으로 되지 않는다.

사용법

사용법과 함께 용례를 살펴보자.
distroless 이미지로 구축된 컨테이너들은 간단한 디버깅 툴이나 관련한 조작도 어렵게 되어 있다.
아주 극단적으로 경량화시키면서 보안적인 취약점을 없애기 위해서 존재하는 이미지이기 때문이다.
그래서 직접적인 방법으로 상호작용하기가 어렵다.
이때 임시 컨테이너가 도움이 될 수 있는 것이다.

apiVersion: v1
kind: Pod
metadata:
  name: ephemeral-demo
spec:
  shareProcessNamespace: false
  containers:
  - image: registry.k8s.io/pause:3.1
    name: ephemeral-demo
    resources: {}
  restartPolicy: Never

Pasted image 20240830162558.png
pause container는 기본적인 sh도 사용할 수 없다.

원하는 컨테이너에 바로 붙이기

Pasted image 20240830163039.png
kubectl debug -it ephemeral-demo --image=busybox:1.28 --target=ephemeral-demo
임시 컨테이너는 debug를 이용해 사용할 수 있다.
--target을 지정하는 방식을 문서에서는 추천하고 있는데, 이는 양식에서 shareProcessNamespace=False로 되어 있는 컨테이너에 대해 필요하다는 것 같다.
Pasted image 20240830163208.png
임시 컨테이너가 띄워졌다.
해당 컨테이너는 터미널에서 빠져나오는 순간 종료된다.

target 옵션

문서에서는 --target=옵션을 넣어주라고 한다.
이것은 파드 내의 연결할 컨테이너를 명시하는 부분인데, 컨테이너 내부 프로세스 가시성에 관련된 것이다.
pod를 만들 때 sharingProcessNamespace가 false로 되어 있다면 컨테이너에 접촉하더라도 내부의 모든 프로세스를 볼 수 없게 된다(kubectl run으로 작동시킨 파드는 이게 false로 되어있다).
이는 디버깅할 때 귀찮은 요소가 될 것이고, 이를 해결하기 위해 target옵션을 넣어준다.
근데 Container Runtime에서 target 기능을 제공해줘야만 가능한 거고, 안되면 쩔 수 없다.
Pasted image 20240830163741.png
이게 target을 안 넣었을 때.
Pasted image 20240830163603.png
이게 넣었을 때이다.

원하는 파드를 복사해서 붙이기

위에 명령어에서 --copy-to={파드이름}을 해주면 해당 파드를 그대로 복사한 후, 그곳에 임시 컨테이너를 붙일 수 있다.
혹시라도 상호작용이 되어 문제가 생길 것 같다면 이러한 방법을 활용해보자.

참고