Docker는 컨테이너 런타임을 포함한 종합적인 컨테이너 플랫폼으로, 컨테이너 생성, 관리, 배포, 저장소 관리 등의 기능을 통합적으로 제공한다.
containerd
는 Docker에서 분리된 컨테이너 런타임이다.
컨테이너 런타임이란?
Docker의 핵심 컴포넌트 중 하나이며, 컨테이너 생애주기 관리와 이미지 관리를 담당한다.
containerd
는 컨테이너를 시작하고 종료하는 데 필요한 핵심 동작을 담당하며, Docker외 다른 컨테이너 관리 도구에서도 사용할 수 있다.
즉, Kubernetes와 같은 오케스트레이션 시스템에서도 containerd
를 컨테이너 런타임으로 사용할 수 있다.
직접적으로 도커자체를 k8s의 컨테이너 런타임으로 사용하는 것과 분리된 cotainerd만을 컨테이너 런타임으로 사용하는 것에는 차이가 있다.
containerd를 사용하는 경우는, containerd가 중지된 상태에서도 각 pods를 보는 명령어를 치면 다 볼 수 있다. (다른 삭제나 생성 등의 명령어도 잘 동작한다.)
즉, API 서버가 정상적으로 동작한다.
kubectl stop containerd
kubectl get pods
하지만, 컨테이너 런타임으로 도커를 사용중이고, 도커를 중지시킨 경우 pods 명령어를 치더라도 API 서버로 명령어가 도달하지 못하기에 출력되지 않는다.
systemctl stop docker
kubectl get pods
containerd는 도커를 컨테이너 런타임으로 사용할 때 보다 훨씬 안정적으로 사용할 수 있다!
하지만 쿠버시스템(kube-system)에 해당하는 컴포넌트(kubelet, 컨테이너 런타임, 스케쥴러 등)가 문제가 생겼을 때, 이를 인식하고 복구하는 것은 불가능하다.
왜냐면 컴포넌트가 없어도 "아직까지는" 정상적으로 잘 동작하기 때문이다. (자동 복구도 안됨)
이는 결국 스케쥴러의 중지를 막은 것 뿐, 어디서 문제가 터질지 모르는 시한폭탄과 같은 상황이다.
따라서 마스터 노드를 여러개 사용하여, 마스터 노드가 좀 더 안정적으로 동작할 수 있도록 하는것이 좋다.