
이 글을 작성하는 이유는?
쿠버네티스에 대한 정리된 내용은 많이 있지만 막상 보려면 처음보는 용어도 있고 이해하는데 어려움이 있어서 기본 개념을 배워보자라는 마음으로 작성해봤습니다.
Kubernetes란 무엇인가요?
Kubernetes(쿠버네티스)는 컨테이너화된 애플리케이션을 자동으로 배포, 확장, 운영할 수 있도록 도와주는 오픈 소스 플랫폼입니다. 애플리케이션을 컨테이너로 묶어서 관리하기 때문에 개발자와 운영자가 애플리케이션을 보다 효율적으로 실행하고 관리할 수 있도록 돕습니다.
간단히 말하면, 여러 컨테이너가 있을 때 쿠버네티스가 그 컨테이너를 잘 배치하고, 실행 중 문제가 생기면 복구하며, 사용량에 따라 확장/축소까지 자동으로 처리합니다.
정리하자면, 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고 확장 가능한 오픈소스 플랫폼입니다.
컨테이너(Container)란?
컨테이너는 애플리케이션을 실행하는 데 필요한 모든 요소를 하나로 묶은 독립적인 패키지입니다. 여기에는 다음과 같은 요소들이 포함됩니다:
- 코드: 실행될 애플리케이션 자체.
- 의존성: 라이브러리, 프레임워크, 런타임 등 애플리케이션이 필요로 하는 환경.
- 환경: 애플리케이션이 실행되기 위한 시스템 설정.
컨테이너의 가장 큰 장점은 이식성입니다.
어디에서 실행되든지 동일하게 작동하므로, 개발 환경과 운영 환경의 차이로 인해 발생하는 문제를 줄여줍니다.
예를 들어: Python으로 작성된 웹 애플리케이션이 있다고 가정해 봅시다. 일반적으로 Python 인터프리터와 라이브러리를 설치해야 실행이 가능합니다. 하지만 컨테이너로 묶으면 Python 환경과 필요한 라이브러리를 함께 패키지화하여 어디서든 실행할 수 있습니다.
워크로드(Workload)란?
워크로드는 기본적으로 실행하고자 하는 작업 또는 애플리케이션을 의미합니다. 예:
- 웹 서버
- 데이터 처리 작업
- 데이터베이스 서비스
컨테이너화된 워크로드(Containerized Workload)란?
컨테이너화된 워크로드는 이러한 워크로드를 컨테이너 내부에서 실행하는 것을 말합니다. 즉, 애플리케이션을 직접 실행하는 대신, 먼저 컨테이너 이미지로 패키지화하고 컨테이너 형태로 배포하는 방식입니다. 이렇게 하면 애플리케이션의 일관성, 이식성, 확장성을 높일 수 있습니다.
Kubernetes에서 컨테이너화된 워크로드를 사용하는 이유는?
쿠버네티스는 컨테이너화된 워크로드를 다음과 같이 관리합니다:
- 스케줄링: 컨테이너를 실행할 적절한 서버(노드)를 선택.
- 확장: 트래픽이나 작업량이 많아지면 컨테이너 개수를 늘리고, 적어지면 줄임.
- 네트워킹: 컨테이너 간 통신과 외부 네트워크 연결을 관리.
- 자가 치유(Self-Healing): 문제가 생긴 컨테이너를 자동으로 재시작하거나 교체.
예시
온라인 쇼핑몰을 예로 들어 봅시다. 이 쇼핑몰은 다음과 같은 구성 요소로 이루어져 있습니다:
- 프론트엔드: 사용자가 보는 웹 페이지를 제공.
- 백엔드: 데이터 처리와 비즈니스 로직을 처리.
- 데이터베이스: 사용자 정보를 저장.
이 세 가지 구성 요소를 각각 컨테이너로 묶고 쿠버네티스를 사용해 배포합니다. 쿠버네티스는 다음을 보장합니다:
- 세 구성 요소가 모두 정상적으로 실행될 수 있도록 관리.
- 트래픽이 증가하면 프론트엔드와 백엔드 컨테이너를 자동으로 확장.
- 백엔드 컨테이너가 다운되면 자동으로 재시작.
그러면 이제 쿠버네티스의 주요 구성 요소인 Pod, Node, Cluster가 이 과정에서 어떤 역할을 하는지 설명해보겠습니다.


Pod
Pod는 쿠버네티스에서 가장 작은 배포 단위입니다. 컨테이너를 묶는 논리적인 단위라고 할 수 있습니다.
Pod의 역할
- 하나 이상의 컨테이너를 포함할 수 있습니다.
- 일반적으로 하나의 Pod에는 하나의 컨테이너가 들어 있지만, 컨테이너 간에 자원을 공유해야 하는 경우(예: 파일 시스템, 네트워크)를 위해 여러 컨테이너를 포함할 수도 있습니다.
- 같은 Pod 내 컨테이너
- 같은 네트워크 주소(IP)를 공유합니다.
- 같은 스토리지를 공유할 수 있습니다.
- 애플리케이션의 인스턴스를 실행하는 단위로 사용됩니다.
- 예: 웹 서버 컨테이너를 Pod 안에 배포.
Pod는 일시적(임시적)입니다. 만약 Pod가 삭제되거나 문제가 생기면 쿠버네티스가 새로운 Pod를 생성하여 교체합니다.
Node
Node는 Pod를 실행하는 실제 작업 단위입니다. 쿠버네티스 클러스터를 구성하는 서버(물리적이거나 가상)입니다.
Node의 역할
- Pod를 실행할 수 있는 환경을 제공합니다.
- 각 Node는 다음 구성 요소를 포함합니다.
- Kubelet: Node에서 실행되는 에이전트로, 쿠버네티스와 통신하며 Pod를 관리합니다.
- 컨테이너 런타임: 컨테이너를 실행하는 소프트웨어(Docker, containerd 등).
- Kube-Proxy: 네트워크를 관리하고 Pod 간 통신을 가능하게 합니다.
- Node는 클러스터의 리소스를 공유합니다.
Node의 종류
- 마스터 노드: 클러스를 관리하는 역할 (스케줄링, 상태 관리)
- 워커 노드: 실제로 Pod가 실핼되는 곳
Cluster
Cluster는 쿠버네티스의 전체 시스템을 의미합니다. Node들의 집합이며, Pod를 배치하고 실행하는 환경을 제공합니다.
Cluster의 역할
- 여러 Node를 하나로 묶어서 통합적으로 관리.
- 클러스터 내의 모든 리소스(CPU, 메모리, 스토리지 등)를 중앙에서 관리하여 Pod에 할당.
- 사용자 요청(예: 애플리케이션 배포)을 받고, 어떤 Node에 Pod를 배치할지 스케줄링합니다.
- 컨트롤 플레인(Control Plane)
- 클러스터의 중앙 관리 시스템으로, 마스터 노드에 의해 실행됩니다.
- 클러스터의 상태를 지속적으로 모니터링하고 문제가 발생하면 해결(자가 치유)합니다.
지금까지의 내용을 요약한다면 아래와 같습니다.
- Pod: 컨테이너를 실행하는 가장 작은 단위. 애플리케이션의 인스턴스를 담고 있음.
- Node: Pod가 실행되는 실제 서버. 리소스를 제공하며 쿠버네티스와 통신함.
- Cluster: Node들을 묶어서 관리하는 전체 시스템. 중앙에서 Pod 배치를 결정하고 클러스터 상태를 관리.
위 정리된 내용을 예시로 이해해본다면
- 사용자가 웹 애플리케이션을 쿠버네티스 클러스터에 배포합니다.
- 클러스터(Control Plane)는 사용자의 요청을 처리하고 Pod를 생성합니다.
- 클러스터는 이 Pod를 실행할 수 있는 적절한 Node를 찾아 Pod를 배치합니다.
- Node는 Pod를 실행하고, 컨테이너 내부에서 애플리케이션이 실행됩니다.
'DevOps' 카테고리의 다른 글
| 카카오 알림톡 AWS Lambda 구현 (2) | 2023.04.21 |
|---|---|
| AWS EC2 설정 및 도메인 적용 그리고 배포까지 (2) (0) | 2022.11.10 |
| AWS EC2 설정 및 도메인 적용 그리고 배포까지 (1) (0) | 2022.11.10 |
| Jenkins 개발 가이드 + Bitbucket (윈도우 /로컬) (0) | 2022.11.07 |
| Docker 기본 (Dockerfile 작성 및 컨테이너 실행까지) (0) | 2022.10.28 |