호스트 OS
├── 컨테이너 런타임
├── 컨테이너 A
│ ├── 애플리케이션 코드
│ ├── 라이브러리/종속성
│ └── 파일 시스템
└── 컨테이너 B
├── 다른 앱
└── 별도 의존성
High Level : 사용자 친화적
- Docker
Low Level : 기계 친화적
LXC
libcontainer
Docker는 초기 libcontainer를 이용하고, libcontainer는 LXC를 활용, LXC는 Kernel 환경 구성(chroot, namespace, cgroup)
Docker는 중기 contarinerd를 이용하고, containerd는 runc(lowLevel)를 활용하여 커널 환경 구성
여러 대의 서버(노드)에 걸쳐 다수의 컨테이너를 자동으로 배포, 관리, 스케일링, 복구하는 시스템
[클러스터]
└── 마스터 노드 (Control Plane)
│├── API Server ← 사용자 요청을 받는 관문
│├── Scheduler ← 컨테이너가 어디서 실행될지 결정
│├── Controller Manager ← 클러스터 상태 유지
│└── etcd (Key-Value 저장소) ← 클러스터 상태 저장
│
└── 워커 노드 (Worker Node)
├── kubelet ← 컨테이너 상태 보고 및 명령 실행
├── kube-proxy ← 네트워크 라우팅
└── 컨테이너 런타임 (containerd 등)
└── Pod
└── 컨테이너 A, B, ...
컨테이너 기반으로 앱 배포
시스템 운영 편의 기능 제공
kube-apiserver
kubelet
- 초기 kubelet → Docker
- 중간 kubelet → CRI(Container Runtime Interface) → Docker
- 나중 kubelet - CRI-Plugin - Docker