Kubernetes

[Kubernetes] 컨테이너 한방정리

모클 2024. 6. 19. 10:32
해당 포스팅은 인프런강의 [쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2] 를 기반으로 작성했습니다. 

리눅스 흐름으로 이해하는 컨테이너 

 

일단 컨테이너를 제대로 이해하려면 발전과정을 알아보면 도움이 됩니다. 

리눅스에는 크게 debian 배포판이 있고, Redhat 배포판이 있습니다. debain 배포판에서 편의기능을 추가하여 만들어진게 Ubuntu 배포판이고, 가장 널리쓰이는 배포판 중 하나입니다. 

Redhat 배포판은 유료버전이며, 최초에는 fedora Linux라고 새로은 기능을 개발하는버전을 무료로 만들었고, 이 기능이 안정화되면 Redhat Enterprise Linux(RHEL)으로 릴리즈를 합니다. 이걸 기업들이 설치하면 유지보수비용을 따로 내야합니다. 그리고 이것을 복사해서 만든게 CentOS 배포판이며, 이 배포판은 무료지만 유지보수를 직접해야하는 특징이있습니다. 

현재 Red hat은 IBM에 인수가 되어 CentOS의 점유율을 Redhat으로 점유율을 당기는 전략으 쓰고있고, 현재 redhat 배포판을 만드는 순서가 개발버전(fedora)->Test 배포판(CentOS stream) -> 안정화(Redhat Enterprise) 프로세스로 변경되었습습니다.  

CentOS는 현재 EOS(End of Service) 되어 Rocky나 AlmoLinux를 선택해야하는 상황으로, 대부분 Rocky OS로 넘어가는 추세입니다. 

 

서버의 자원을 효율적으로 사용하기위해 격리기술(chroot, cgroup, namespace)이 위의 사진과 같이 발전해왔으며, 

이 기술들을 집약해서 정리한게 바로 컨테이너의 어머니라고 불리우는 LXC(Linux Container)입니다. 이 LXC를 기반으로 만들어진게 바로 그 유명한 docker입니다. 

docker 가 보안에 안좋은 단점이 있었는데, 이 단점을 보완한게 rkt라는 기술입니다. 

시간이 지나 docker 가 kubernetes와 인터페이스가 잘 안맞아서 빠진다는 얘기가 돌면서, 이제 누가 쿠버네티스와 호환서잉 좋은지가 컨테이너를 선택하는 중요한 요소가 되었습니다. 

그래서 그 이후에 나온 대표적인 컨테이너가 containerd와 cri-o입니다. 

  •  containerd : docerk에서 컨테이너를 만들어주는 기술이 분리된것. CNCF에 기부되었음.
  •  cri-o : redhat에서만들었으며 CNCF에 기부되었음.

컨테이너를 관리하는 기술인 대표적인 컨테이너 오케스트레이션 기술인 쿠버네티스 또한 CNCF에 기부되었으며, 1기졸업생인데, 기업들은 이 쿠버네티스를 가지고 기업관리형 오케스트레이션 서비스(Openshift, Rancher, VMware Tanzu)를 만들기 시작했습니다. 

쿠버네티스 흐름으로 이해하는 컨테이너

  • 최초의 컨테이너라고 불리는 LXC는 커널레벨 기술을 가지고 만든 low level 컨테이너 런타임입니다. 
  • lxc를 기반을 docker 가 libcontainer라는 low level 컨테이너를 만들었고,  이 libcontainer을 사용자친화적으로 만든  high level 컨테이너 런타임이 바로 docker 입니다.
  • 만약 pod를 생성하려면 어떻게 할까요? 
  • kube-apiserver에 pod를 생성해달라는 명령을 보내줍니다. 그러고, kube-apiserver는 kubelet한테 pod를 생성해달라는 명령을 날리죠, 그러면 이제 kubelet은 pod를 만들기전 컨테이너를 생성하는 container runtime에게 container를 만들어달라는 요청을 보내고 컨테이너런타임은 컨테이너가 2개 생성해달라는 요청을 받고 컨테이너 2개를 만들어줍니다. 
  • 정리하면 컨테이너 런타임은 컨테이너를 만들기 위해 필요한 요소이고, 컨테이너는 컨테이너런타임으로부터 만들어진 생성물입니다. 
  •  실제로 kubelet 소스를 까보면 컨테이너 런타임이 docker인지 rkt인지 호출하는 case문이 있고,  각 런타임에 맞는 맞춤형 api를 날려줍니다. 
  • 컨테이너런타임의 종류가 많아지면서 CRI(Container Runtime Interface)가 생기게 됩니다.
  • 컨테이너런타임 기능이 변경될때마다 쿠버네티스도 같이 패치를 해야했는데 이 부분을 수정하기위해 다음과같이 컨테이너 런타임이 변경되게 됩니다.   
    • dockershim을 밖으로 뺀 미란티스컨테이너런타임.
    • cri-plugin 기능이 추가된 containerd 
    • redhat이 만든 cri-o

감사합니다.