도커와 쿠버네티스를 학습하며, 공부한 내용을 스스로 정리하기 위해 포스트를 쓰게 되었습니다 😀
혹시, 제가 지식을 잘못 전달한 부분이 있다면 편하게 댓글 달아주세요!
너무 감사할 것 같고, 바로 수정하겠습니다!
컨테이너는 실행에 필요한 모든 파일을 포함한 전체 런타임(실행) 환경에서 애플리케이션을 패키징·격리할 수 있는 기술입니다.
컨테이너를 왜 써야 할까요? 컨테이너를 사용하면 아래와 같은 이점을 얻을 수 있습니다 😀
등등..
그렇다면, 컨테이너를 만들 수 있을까요? 컨테이너 가상화 기술을 사용하면 됩니다!
제가 알고 있는 컨테이너 가상화 기술은 Docker와 LXC(Linux Container)가 있는데요!
LXC와 도커는 컨테이너를 만들어주는 컨테이너 가상화 기술이라는 공통점을 가지고 있지만, LXC는 OS 레벨 가상화 기술이고 Docker는 애플리케이션 레벨 가상화 기술입니다.
OS 레벨 가상화 기술은 단일 리눅스 컴퓨터(LXC host)가 여러 개의 리눅스 OS를 컨테이너로 동시에 생성·실행할 수 있게 만드는 기술입니다.
→ 런타임 환경의 리눅스 OS 컨테이너에서 여러 개의 애플리케이션을 실행할 수도 있다는 뜻!
반면에, 애플리케이션 레벨 가상화 기술은 격리 환경에서 단일 애플리케이션 실행하기 위한 목적으로 컨테이너를 생성, 실행하는 가상화 기술입니다.
즉, LXC는 OS 컨테이너화를 목적으로 하는 기술이고 도커는 애플리케이션 컨테이너화를 목적으로 하는 기술이라 할 수 있습니다 😁
출처: LXC vs Docker: Which Container Platform Is Right for You ?
도커 엔진은 우리가 부르는 도커 그 자체입니다! 왜냐하면, 애플리케이션을 빌드하고 컨테이너화하는 기술이기 때문이죠!
즉, 도커 데스크탑이나 CLI 명령어를 받아서 컨테이너를 생명주기와 관련된 작업을 하는 것이 바로 도커 엔진인 것입니다!
그렇다면, 도커 엔진은 어떤 방식으로 작업을 수행하게 될까요?
도커 엔진의 내부 동작 순서는 아래와 같습니다!
출처:쿠버네티스 어나더 클래스 (지상편) - Sprint1
runc는
합니다!
컨테이너 환경에서 앱을 배포했다고 가정해봅시다!
현재 애플리케이션의 버전은 V1 상태인데, V2로 버전을 올려서 배포하고 싶습니다. 어떻게 해야 할까요⁉️
출처: 쿠버네티스 어나더 클래스 (지상편) - Sprint1
애플리케이션 컨테이너가 하나일 때는 1~4 과정을 수행하는 것이 편하게 느껴질 수 있겠지만, 여러 개의 컨테이너를 관리해야 할 때는 관리가 어려워집니다.
특히, CI/CD 파이프라인의 일부로써 자동화 없이 대규모 애플리케이션을 관리하는 것은 불가능에 가깝습니다.
이러한 배경에서 컨테이너 배포, 관리, 확장 네트워킹 자동화 기술인 컨테이너 오케스트레이션이 등장합니다!
컨테이너 오케스트레이션 기술은 여러 개가 있었지만, 현재 기업용 쿠버네티스 솔루션이 많이 나온 것을 통해 쿠버네티스가 대세인 것을 알 수 있습니다.
따라서, 쿠버네티스를 바탕으로 컨테이너 오케스트레이션을 살펴보겠습니다.
위에서 살펴본 앱 버전을 V1에서 V2로 변경하는 과정을 다시 살펴봅시다!
이전에는
와 같은 과정을 개발자가 ‘직접’ 수행해야 했지만, 이제는 아래와 같이 컨테이너 생성, 조회, 네트워크 수정, 컨테이너 삭제 과정을 쿠버네티스가 대신 하게 됩니다 😮
출처: 쿠버네티스 어나더 클래스 (지상편) - Sprint1
쿠버네티스는 v1.20 이후 컨테이너 런타임으로서 도커를 사용 중단(deprecating)한다고 발표했습니다.
컨테이너 오케스트레이션 동작 방식에서 kublet이 도커에 컨테이너 생성 요청을 한다고 소개했던 내용을 기억하고 계신가요?
쿠버네티스의 도커 지원 중단은 파드(Pod) 생성을 담당하는 kublet에서 도커 api 호출이 제거된다는 의미합니다.
사실 이 이슈는 역사가 긴 문제인데, 쿠버네티스 버전별로 도커와 관련된 역사는 아래와 같습니다.
쿠버네티스가 도커를 지원하지 않게 된 배경에는
때문입니다.
결국 쿠버네티스가 필요한 건 위 그림에서 볼 수 있듯이 컨테이너 런타임인데, “왜 도커 api를 호출해야 하며 CRI 준수를 위해 쿠버네티스에서 도커심을 만들고 있어야 하냐!!!” 라는 말이죠 😀
이런 관점에서 본다면, 도커와 쿠버네티스는 여전히 함께 사용할 수 있습니다.
왜냐하면 도커가 ‘실제로 생성하는 이미지’는 도커에 한정된 이미지가 아니라 OCI 표준을 갖춘 ‘호환 이미지’이며, 이 이미지는 쿠버네티스에서든 도커에서든 똑같이 사용할 수 있기 때문이죠!
따라서, 쿠버네티스에서는
기존 도커 엔진 노드를 도커심에서 cri-dockerd로 마이그레이션하는 방법
을 안내하며, 여전히 쿠버네티스와 도커는 함께 사용할 수 있다고 알려주고 있습니다.
요약하면, kublet에서 컨테이너 생성을 요청할 때 사용하는 CRI 플러그인이 도커심(dockershim)에서 cri-dockerd로 바뀐다는 것이지 도커와 쿠버네티스를 함께 사용하지 못하는 것이 아니란 얘기입니다!!
LXC vs Docker: Which Container Platform Is Right for You ?
IBM 토픽 컨텐츠: 컨테이너 오케스트레이션이란 무엇인가요?