[yongggg's] Kubernetes 개념 (Docker 와의 비교)
안녕하십니까 이번 장에는 Kubernetes의 기본 개념에 대해 살펴보는 시간이 되겠습니다.
클라우드 환경에서 대규모 애플리케이션을 관리하는 일은 쉽지 않습니다. 서버가 다운되면 자동으로 복구해야 하고, 트래픽이 늘어나면 새로운 서버를 빠르게 추가해야 합니다. 이런 작업을 자동화해주는 것이 바로 Kubernetes(쿠버네티스)입니다.
1. Kubernetes란?
Kubernetes(쿠버네티스, 줄여서 k8s)는 Container 기반 Application을 자동으로 배포, 확장 운영할 수 있도록 도와주는 Opensource-platform이다. 이를 Container Orchestration Platform(컨테이너 오케스트레이션 플랫폼)이라고도 말하며 쉽게 말해, 여러 개의 서버에서 Container를 관리하고 실행하는 도구이다.
Docker 같은 컨테이너 기술을 사용하면, 하나의 Application을 가볍고 독립적으로 실행할 수 있는데, 여러 개의 컨테이너를 동시에 운영하려면 Kubernetes가 필요하다.
✅ 요약하면, 다음과 같이 비유할 수 있다.
- Docker는 하나의 배(컨테이너)를 만드는 것
- Kubernetes는 수많은 배를 자동으로 관리하는 항구
2. Kubernetes의 주요 개념과 작동 원리
2-1. Kubernetes Cluster 구조
- Master Node(마스터 노드): Cluster 전체를 관리하는 Control 타워 역할을 하며, API 서버, 스케쥴러, 컨트롤러 등이 포함된다. 주로 어떤 Container를 어디에 배치할지 결정하는 역할을 담당한다.
- Worker Node(워크 노드): Application이 실행되는 실제 서버를 뜻하며, 하나 이상의 Pod를 실행하고 마스터 노드의 명령을 받아 Container를 실행한다.
2-2. Kubernetes의 주요 개념
- Container(컨테이너): 다양한 컴퓨팅 환경에서 일관되게 애플리케이션을 배포하고 실행하는 데 사용되는 경량의 이동식 소프트웨어 패키징 기술이며, 라이브러리, 프레임워크, 런타임 환경을 포함하여 모든 종속 항목과 함께 애플리케이션을 캡슐화하는 독립형 실행 단위이다.
- Pod(파드): Container가 실행되는 가장 작은 단위, 한 개 이상의 컨테이너를 포함할 수 있다. 배포(Deployment)와 실행(Runtime) 단위로서, 컨테이너(Container)를 감싸는 가장 작은 배포 단위이다.
Kubernetes에서는 Container를 직접 관리하지 않고, Pod 단위로 관리한다. 그 이유는- 컨테이너는 상태를 유지하기 어렵기 때문이다. (Pod을 통해 Kubernetes가 관리할 수 있음)
- 컨테이너 간 네트워킹이 필요할 수 있다. (Pod 내부에서 같은 네트워크 공간을 공유함)
- 컨테이너끼리 협업이 필요할 수 있다. (같은 Pod 안에 여러 개의 Container를 둘 수 있음)
- Service(서비스): Pod는 언제든지 사라질 수 있으므로, 네트워크 통신을 위해 고정된 endpoint를 제공하는 역할을 한다.
- Deployment(디플로이먼트): Application을 원하는 개수만큼 실행하고 자동으로 관리하는 역할을 한다.
- ReplicaSet(리플리카셋): 특정 Pod 개수를 유지하는 역할을 한다. (예를 들어, Pod가 죽으면 자동으로 새로운 Pod를 생성함.)
- Ingress(인그레스): 외부 트래픽을 Kubernetes 내부 서비스로 라우팅하는 역할을 한다.
3. Kubernetes의 기능과 특징
- 자동 확장: 사용량을 기준으로 필요에 따라 컨테이너 및 해당 리소스를 확장하거나 축소한다.
- 라이프사이클 관리: 관리자가 배포를 일시 중지한 후 계속 진행할 수 있을 뿐만 아니라 이전 버전으로 롤백할 수 있다.
- 원하는 상태 선언: 관리자가 필요한 항목을 정의하고 Kubernetes를 통해 이를 구현한다.
- 자가 회복 및 탄력성: 자동 재시작 배치, 복제 및 확장을 포함한다.
- 확장 가능한 스토리지: 관리자가 필요에 따라 동적으로 스토리지를 추가할 수 있다.
- 로드 밸런싱: 시스템은 내부 또는 외부 로드 밸런싱을 위해 여러 도구를 사용한다.
- DevSecOps 지원: 컨테이너 라이프사이클 및 Cloud 전반에서 컨테이너 운영 보안을 단순화하고 팀이 보안 앱을 시장에 더 빠르게 출시할 수 있도록 지원한다.
4. Kubernetes vs Docker
Docker
- Docker는 컨테이너를 빌드하고 실행하기 위한 플랫폼 및 도구 모음으로, 애플리케이션과 해당 종속 항목을 경량의 격리된 컨테이너로 패키징할 수 있다.
- 개발자는 Docker를 사용하여 코드, 라이브러리 및 런타임 환경과 같이 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 컨테이너 이미지를 생성할 수 있다.
- Docker를 사용하면 다양한 환경에서 애플리케이션을 일관되게 배포할 수 있으므로, 호스트 시스템에 관계없이 애플리케이션이 안정적으로 실행된다.
- Docker는 사용하기 쉬운 명령줄 인터페이스(CLI)와 컨테이너 관리를 위한 강력한 도구 및 서비스 에코시스템을 제공한다.
Kubernetes
- Kubernetes(K8s라고도 함)는 컨테이너형 애플리케이션의 배포, 확장 및 관리를 자동화하는 오픈 소스 컨테이너 오케스트레이션 플랫폼이다.
- Kubernetes는 머신 클러스터에서 컨테이너를 실행하고 조정하기 위한 프레임워크를 제공한다.
- 자동 확장, 로드 밸런싱, 서비스 검색, 자가 회복 등의 기능을 제공한다.
- Kubernetes는 선언적 구성 및 확장을 허용하므로 복잡한 애플리케이션 배포를 더 쉽게 관리할 수 있다.
- 높은 수준의 내결함성 및 탄력성을 제공하여 장애 발생 시에도 애플리케이션이 항상 실행되고 언제든지 사용 가능한 상태로 유지되도록 한다.
요약하면 Docker는 주로 컨테이너의 빌드 및 패키징에 중점을 두는 반면 Kubernetes는 규모에 맞게 컨테이너를 오케스트레이션하고 관리하는 데 중점을 둔다. Docker는 컨테이너를 만들고 실행하는 도구를 제공하는 반면 Kubernetes는 분산 환경에서 컨테이너형 애플리케이션을 배포하고 관리하기 위한 인프라를 제공한다. 따라서 일반적으로 Docker를 사용하여 컨테이너 이미지를 빌드한 다음 Kubernetes를 사용하여 머신 클러스터 전반에서 컨테이너를 관리하고 오케스트레이션한다.