* 본 게시물은 쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2 강의와 강의 자료를 바탕으로 작성되었습니다.

- Linux에는 Debidan(커뮤니티 지원)과 RedHat(상업적 지원)계열이 있음
- 쿠버네티스 또한 크게 이 2가지 계열을 지원
- CentOS의 종료로 대체재인 Rocky Linux(RedHat 계열)를 이용
Container는 어떻게 만들어졌나?
Linux의 chroot(유저격리, 파일격리, 네트워크 격리), cgroup(자원격리), namespace(프로세스격리) 기능을 이용하여 LXC(LinuX Container) 탄생
LXC를 기반으로 컨테이너 기술을 사용자가 편리하게 이용할 수 있도록 만든 것이 Docker
Kubernetes를 왜 사용하는가?

기존 Docker만 이용하여 프로젝트를 배포할 때는 사용자가 Docker를 통해 수동으로 컨테이너를 생성/조회/수정하며 버전관리

하지만, Kubernetes를 이용하면, 사용자는 단순히 K8s에 명령을 내리는 것으로 K8s가 컨테이너를 자동으로 관리
K8s는 컨테이너를 더 쉽게 사용할 수 있게 해주는 이점 때문에, 현재 표준을 넘어 여러 분야에서 활용되고 있으며 Container Runtime은 K8s와의 호환성이 중요해지고 이것이 Container를 정하는 기준이 되었음
- CNCF는 클라우드 표준을 관리하는 곳으로 CNCF를 졸업한 프로젝트(Graduated Project)라는 것은 믿고 사용해도 될 정도의 프로젝트임을 인증

Container Runtime
컨테이너 런타임은 Low Level과 High Level로 나뉨
- Low Level
- LXC
- LXC를 기반으로 한 libcontainer
- High Level
- libcontainer를 사용하는 Docker

Docker Engine은 dockerd가 여러 편리한 기능들을 제공하고 containerd가 libcontainer를 이용하여 Container를 만듦
Container Orchestration
- Pod => Kubernetes에서 배포되는 객체의 단위
- 1개의 Pod에 여러 개의 Container를 정의할 수 있음
- Kubernetes에 존재하는 Component
- kube-apiserver
- K8s로 보내지는 모든 API를 받음
- Pod 생성 명령을 받으면, 이를 담당하는 kubelet에 전달
- kubelet
- Pod 내에 Container 개수를 확인하고 개수만큼 Container Runtime에게 Container 생성 요청을 보냄
- v1.0 - v1.20 => Container Runtime에 맞추어 API를 호출
- v1.5 - v1.24 => Interface와 구현부(Container Runtime Interface)를 분리
- CRI는 오픈소스라, 각 Container Runtime이 소스를 Contribution하여 구현
- CRI 구간은 gRPC라는 것을 이용하여 통신
- 만약, Container Runtime이 바뀌면, CRI 구현체도 같이 변경이 되어 K8s도 같이 패치되어야 하는 단점
- v1.24 - (기존 단점을 보완하기 위하여, 컨테이너 런타임을 바로 받을 수 있게 변경되고 v1.27부터는 기본동작이 됨)
- cri-dockerd를 Adapter로 밖으로 빼는 것으로 kubelet과 호환이 됨 -> 미란티스 컨테이너 런타임 이라고 부름
- kube-apiserver

* OCI => 컨테이너 표준 규약을 관리하는 단체
Docker는 OCI 규격을 맞추기 위해 runC를 만들고 containerd에도 이를 사용하도록 함
runC는 libcontainer와 다르게 LXC를 사용하지 않고 바로 Kernel Level의 가상화 기술을 사용함
표준만 맞춘다면, 다른 런타임에서 이용하던 컨테이너 이미지를 다른 런타임에서도 사용이 가능
'Tech > Kubernetes(K8s)' 카테고리의 다른 글
잘못된 정보가 있다면 말씀해주세요!