전공영역 공부 기록

Pause container는 어떻게 실행될까?

악분 2024. 9. 8. 19:30
반응형

평소에 pause container는 어떻게 궁금했었는데, LuLu님 블로그에 pause container실행 과정을 분석해주셨습니다. kubelet, conatinerd 코드를 분석하면서 과정 하나하나 설명되어 있습니다.

- 블로그 링크: https://mateon.tistory.com/127

 

1. pause contianer가 network namespace를 생성할까?

위 블로그 내용을 읽고 공부를 해보니 제가 잘못 알고 있었던 내용이 있었습니다. pause container가 network namespace를 생성하고 유지하는줄 알았는데, CRI가 network namespace를 생성하고 pause container가 network namespace를 유지하는 것이었습니다.

 

CRI가 containerd일 경우 network namespace는 RunPodSandBox함수에서 생성합니다. 

출처: https://github.com/containerd/containerd/blob/26b48a6b7aa7ff7886307aa22a3d1a75b6f5d248/internal/cri/server/sandbox_run.go#L52

 

RunPodSandBox함수는 100줄이 넘고 호출하는 함수가 매우 많습니다. 하지만, 함수 이름이 해석하기 매우 쉽게 되있어서 코드를 분석하지 않고도 함수가 무엇을 하는지 짐작할 수 있습니다. 저는 chatGPT를 사용해서 RunPodSandBox함수가 무엇을 하는지 분석해달라고 했습니다.

chatGPT가 CRI 함수 분석 결과

 

2. pause container의 컨테이너 이미지는 어디에 설정될까?

pause 컨테이너는 pod의 network namespace 유지, 좀비 프로세스 죽이는 역할을 합니다. 그래서 infra container라는 이름을 갖습니다. pause 컨테이너는 컨테이너이기 때문에 컨테이너 이미지가 필요한데, kubelet 실행시 --pod-infra-container-image 인자로 설정됩니다. 아래는 EKS 워커노드의 kubelet 설정입니다.

ps -ef | grep kubelet

 

3. pause container 컨테이너 이미지 pull 에러가 발생하면?

pause container 컨테이너 이미지가 없다면 pod는 생성오류가 발생합니다.

 

2024년 2월쯤에 containerd 업데이트 영향으로, EKS에서 pause container 컨테이너 이미지가 노드에서 삭제되는 오류가 있었습니다. 가비지 컬렉터에 의해 pause container 컨테이너 이미지가 삭제되었고, ECR에서 이미지 pull에러가 발생했었습니다.

- github issue: https://github.com/awslabs/amazon-eks-ami/issues/1597

 

EKS에서 containerd 업데이트 영향을 점검하지 못해서 발생한 버그였고, pause container 컨테이너 이미지가 더이상 가비지 컨테이너로 삭제되지 않도록 패치했습니다. 사용자는 AMI를 업그레이드 해야 위 문제를 해결할 수 있었습니다.

반응형