쿠버네티스(Kubernetes) 쉽게 이해하기 — SW 레이어 어디에서 어떻게 작동하나
OS 위·애플리케이션 아래에 사는 오케스트레이션 미들웨어, 30분 만에 큰 그림 잡기
"쿠버네티스(Kubernetes)" 단어만 들어도 머리가 복잡해지는 분들이 많습니다. 클라우드, 컨테이너, 오케스트레이션… 용어는 많은데 정작 "내 컴퓨터의 어느 층에서, 무엇을 대신 해주는 도구인가"는 잘 안 와닿죠. 이 글은 쿠버네티스를 SW 스택(소프트웨어 계층) 관점에서 한 번에 정리합니다. 비유 → 위치 → 동작 흐름 순서로 읽으면 30분 안에 큰 그림이 잡힙니다.
쿠버네티스는 "수십~수천 개의 컨테이너를 사람 대신 자동으로 굴려주는 운영체제 같은 소프트웨어"입니다. Google이 자사의 대규모 서비스를 운영하면서 만들었던 내부 도구(Borg)를 오픈소스화한 것이고, 줄여서 K8s라고 씁니다. (K와 s 사이에 글자가 8개라서 K8s)
핵심 역할은 단순합니다. "이 앱을 3개 띄워줘"라고 말하면, 어느 서버에 띄울지 골라주고, 죽으면 다시 살리고, 트래픽이 몰리면 자동으로 늘려주는 것. 사람이 하던 일을 선언적(declarative)으로 자동화한 게 전부입니다.
많은 분들이 헷갈리는 지점이 바로 이겁니다. 쿠버네티스는 OS도 아니고, 애플리케이션도 아닌, 그 사이에 끼어 있는 "오케스트레이션 레이어"입니다. 아래 스택을 보면 한 번에 정리됩니다.
이 그림에서 한 가지만 기억하시면 됩니다. 쿠버네티스는 "OS 위, 애플리케이션 아래"에 사는 미들웨어입니다. 컨테이너를 직접 만들지도, 직접 실행하지도 않습니다. "실행해줘"라고 명령만 내리고, 실제 실행은 아래 계층(컨테이너 런타임 → OS 커널)이 맡습니다.
그냥 서버입니다. CPU, RAM, 디스크, 네트워크 카드. 클라우드라면 AWS EC2, GCP Compute Engine 같은 가상머신이 여기 해당합니다. 쿠버네티스 입장에서는 이걸 "노드(Node)"라는 단위로 추상화해서 인식합니다.
의외로 많은 분들이 모르고 넘어가는 사실인데, 컨테이너 격리 기술 자체는 쿠버네티스나 Docker의 발명품이 아닙니다. 리눅스 커널이 가진 두 가지 기능을 활용한 것뿐이에요.
- Namespace — 프로세스, 네트워크, 파일시스템, 사용자 등을 격리. "다른 프로세스가 안 보이게" 만들어줌
- cgroups (control groups) — CPU·메모리·I/O 사용량 제한. "이 프로세스는 CPU 0.5코어, RAM 512MB만 써" 같은 제약
이 두 가지가 컨테이너의 본질입니다. 위 계층들은 전부 이걸 편하게 쓰기 위한 포장지에 가깝습니다.
커널의 namespace·cgroups를 매번 직접 호출하기는 너무 번거롭습니다. 그래서 containerd, CRI-O, Docker Engine 같은 런타임이 이걸 추상화해서 "이미지 받아와서 컨테이너 실행해줘" 한 줄로 처리할 수 있게 해줍니다.
중요한 점 — 쿠버네티스는 컨테이너를 직접 실행하지 않습니다. CRI(Container Runtime Interface)라는 표준 인터페이스를 통해 런타임에게 "띄워달라"고 요청만 합니다. 그래서 런타임은 갈아 끼울 수 있어요. (실제로 K8s 1.24부터는 Docker Engine 직접 지원이 빠지고 containerd가 표준이 됨)
여기가 쿠버네티스가 사는 층입니다. 하는 일을 한 줄씩 정리하면:
- 스케줄링 — "어느 노드에 띄울까?"를 자원 상태 보고 자동 결정
- 자가 치유(Self-healing) — 컨테이너가 죽으면 자동으로 다시 띄움
- 스케일링 — CPU 사용률 70% 넘으면 알아서 복제본 늘리기
- 롤아웃·롤백 — 새 버전 배포 중 문제 생기면 이전 버전으로 자동 복귀
- 서비스 디스커버리·로드밸런싱 — 컨테이너 IP 바뀌어도 이름으로 찾을 수 있게
- 비밀 관리·설정 주입 — 비밀번호, 환경변수를 안전하게 컨테이너에 전달
웹서버, API, AI 추론 서버, DB, 메시지 큐. 쿠버네티스 입장에서는 그냥 "컨테이너 이미지"일 뿐입니다. 안에 뭐가 들었는지는 관심 없고, "몇 개 띄울지, 자원 얼마 줄지, 외부에 노출할지"만 봅니다.
쿠버네티스 클러스터는 두 종류의 노드로 구성됩니다. Control Plane(두뇌)과 Worker Node(일꾼)입니다.
| 구분 | Control Plane | Worker Node |
|---|---|---|
| 역할 | 의사결정·관리 | 실제 컨테이너 실행 |
| 핵심 컴포넌트 | API Server, Scheduler, Controller Manager, etcd | kubelet, kube-proxy, Container Runtime |
| 비유하자면 | 회사의 본사·임원진 | 현장 매장·직원 |
| 장애 시 | 새 명령은 못 받지만 기존 컨테이너는 계속 동작 | 해당 노드의 컨테이너만 다른 노드로 재배치 |
- kube-apiserver — 모든 명령의 입구. 사용자도, 내부 컴포넌트도 전부 이 API를 거쳐 통신
- etcd — 클러스터의 모든 상태를 저장하는 분산 키-값 DB. "현재 진실의 원본"
- kube-scheduler — 새로 만들어진 Pod를 어느 노드에 배치할지 결정
- kube-controller-manager — "원하는 상태"와 "현재 상태"를 끊임없이 비교하며 차이를 메우는 일꾼
- kubelet — 노드에서 일하는 에이전트. API Server의 명령을 받아 컨테이너 런타임에게 "이거 띄워라" 전달
- kube-proxy — 노드 안 네트워크 규칙을 관리. 서비스 IP를 실제 Pod로 라우팅
- Container Runtime — 실제 컨테이너를 띄우는 containerd 등
"이미지 nginx로 Pod 하나 띄워줘"라고 명령했을 때 내부에서 무슨 일이 벌어지는지 따라가 보겠습니다.
kubectl apply 명령으로 YAML 매니페스트를 제출이 7단계 흐름에서 핵심은 "선언적(declarative) 모델"입니다. 사용자는 "최종 상태"만 말하고, 쿠버네티스가 "거기까지 가는 방법"을 알아서 처리합니다. 명령형(imperative)으로 "이거 해라, 저거 해라"를 일일이 쓰지 않아도 되는 거죠. 이게 쿠버네티스의 가장 강력한 설계 철학입니다.
컨테이너 1개(혹은 강하게 묶인 여러 개)를 감싸는 껍데기입니다. 쿠버네티스는 컨테이너를 직접 다루지 않고, 항상 Pod 단위로 다룹니다. 같은 Pod 안 컨테이너들은 IP와 볼륨을 공유합니다.
"이 Pod를 항상 3개 띄워둬"를 선언하는 오브젝트. 하나가 죽으면 자동으로 새 Pod를 만들어 3개를 유지합니다. 새 버전 배포 시 무중단 롤링 업데이트도 여기가 담당합니다.
Pod는 죽고 살아나면서 IP가 계속 바뀝니다. Service는 그 앞에 안정적인 가상 IP/DNS 이름을 붙여주는 추상화입니다. 트래픽을 여러 Pod에 분산하는 로드밸런서 역할도 합니다.
코드와 설정을 분리하는 정석적인 방법. ConfigMap은 일반 설정, Secret은 민감 정보(비밀번호, 토큰)를 담아 컨테이너에 환경변수나 파일로 주입합니다.
도메인 기반으로 "api.example.com은 A 서비스로, web.example.com은 B 서비스로" 라우팅하는 7계층 게이트웨이. 사실상 클러스터의 정문입니다.
"그냥 Docker로 띄우면 되는 거 아닌가?"라는 질문, 정말 자주 나옵니다. 답은 "규모가 작으면 Docker로 충분하고, 커지는 순간 쿠버네티스가 사실상 필수"입니다.
서버가 1대일 땐
docker run이면 끝납니다. 그런데 서버가 10대, 컨테이너가 100개로 늘어나면 — 어느 서버에 띄울지 누가 결정하나? 컨테이너 죽으면 누가 살리나? 트래픽 늘면 누가 복제하나? 새 버전 배포는? 비밀번호 관리는? 이걸 사람이 다 손으로 하면 회사 망합니다. 쿠버네티스는 정확히 이 문제들을 풀려고 만들어진 도구입니다.- 마이크로서비스 아키텍처 — 서비스가 10개 이상으로 쪼개져 있는 경우
- 트래픽 변동이 크고 자동 확장이 필요한 경우
- 여러 환경(dev/stg/prod)에 동일한 인프라를 일관되게 유지해야 할 때
- 멀티 클라우드·하이브리드 클라우드 전략을 쓰는 조직
- 1인 개발 / 토이 프로젝트 — 학습 비용이 효용을 압도
- 모놀리식 앱 1~2개 — Docker Compose나 PaaS(Heroku, Cloud Run, Fly.io)가 훨씬 합리적
- 운영 인력이 부족한 소규모 팀 — 관리형 K8s(EKS, GKE, AKS)를 쓰더라도 학습곡선은 상당함
이 글에서 딱 5가지만 가져가시면 됩니다.
- 위치 — 쿠버네티스는 OS 위, 애플리케이션 아래에 사는 오케스트레이션 레이어. 컨테이너를 직접 실행하지 않고 명령만 내림
- 실제 격리 — 컨테이너의 본질은 리눅스 커널의 namespace + cgroups. 쿠버네티스는 이걸 대규모로 관리하는 상위 도구
- 구성 — Control Plane(두뇌)과 Worker Node(일꾼). API Server·etcd·Scheduler·Controller가 핵심
- 철학 — 선언적 모델. 사용자는 "원하는 상태"만 말하고 K8s가 "현재 상태"를 거기에 맞춤
- 가치 — 자가치유, 자동확장, 무중단 배포, 서비스 디스커버리. 사람이 하던 운영 작업을 자동화한 게 본질
처음에는 용어가 많아 어렵게 느껴지지만, "OS 위·앱 아래에서 컨테이너 무리를 자동으로 굴려주는 미들웨어"라는 한 줄만 머릿속에 자리 잡으면 그다음부터는 빠르게 풀립니다. 다음 글에서는 실제로 minikube로 로컬에서 클러스터를 띄우고 첫 Pod를 배포하는 실습을 다뤄보겠습니다.
'AI' 카테고리의 다른 글
| CPU·GPU·GPGPU·TPU·NPU 한 방에 정리:AI 가속기 완전 가이드 (그리고 NVIDIA에서 벗어나려는 중국) (0) | 2026.05.10 |
|---|---|
| vLLM 완벽 해부 — LLM 추론 엔진의 표준이 된 진짜 이유 (0) | 2026.05.10 |
| IaaS PaaS SaaS 차이부터 FaaS XaaS까지 — 클라우드 서비스 모델 완벽 정리 (0) | 2026.05.10 |
| 클라우드 스토리지 완전정복: 블록·파일·오브젝트 차이와 SDS 회사 총정리 (0) | 2026.05.10 |
| HBM이란 무엇인가: AI 인프라의 진짜 병목과 SK하이닉스 vs 삼성전자 10년 라이벌 드라마, 그리고 차세대 HBF까지 (0) | 2026.05.10 |