쿠버네티스란 무엇인가?
1. 쿠버네티스의 정의
쿠버네티스는 구글에서 개발하고, 현재는 CNCF(Cloud Native Computing Foundation)에서 관리하는 오픈소스 컨테이너 오케스트레이션 도구이다.
쉽게 말해서 컨테이너로 포장된 애플리케이션을 효율적으로 배포, 관리, 확장, 복구하는 시스템이다.
쉽게 비유하면, "컨테이너"라는 일꾼들이 앱을 들고 다닌다면, 쿠버네티스는 이들을 지휘하는 "지휘자"이다.
2. 컨테이너 오케스트레이션이란?
컨테이너(Container)란, 앱과 앱이 실행되는 환경을 함께 담아낸 포장된 환경으로, 도커(Docker)가 대표적이다.
오케스트레이션(Orchestration)이란, 여러 개의 컨테이너가 함께 동작하도록 배치하고, 조율하고 자동화 하는 기술이다.
컨테이너 하나만 쓰는 것은 어렵지 않지만, 다수의 컨테이너를 동시에 실행하고, 멈추고, 새로 만들어지는 상황에서는 자동으로 관리해줘야 효율적이다.
이러한 역할을 쿠버네티스가 한다.
3. 왜 필요할까?
- 웹 서비스가 마이크로서비스로 나누어져있다.
- 트래픽에 따라 자동으로 확장되거나 줄어들어야 한다.
- 장애가 생기면 자동으로 복구되어야 한다.
이러한 요구사항으로 컨테이너 인프라 운영을 위한 자동화 플랫폼으로 쿠버네티스가 등장했다.
쿠버네티스가 등장하게 된 배경
1. 전통적인 애플리케이션 배포 방식
과거에는 다음과 같은 방식으로 웹 서비스가 운영되었다.
- 하나의 물리 서버에 운영 체제가 설치되었다.
- 운영 체제 위에 애플리케이션을 직접 배포하였다.
- 여러 개의 애플리케이션을 올릴 경우 서로 충돌하거나, 자원 낭비가 발생하였다.
- 서버가 죽으면 서비스도 함께 죽었다.
서버마다 직접 접속해서 설정하고, 수동으로 관리해야 했기 때문에 유지보수가 어렵고 비효율적이었다.
2. 가상머신(Virtual Machine)의 등장
가상머신이 등장한 이후 다음과 같이 웹 서비스가 운영되었다.
- 물리 서버 위에 여러 개의 가상 운영체제를 올리게 되었다.
- 하나의 물리 서버로 여러 애플리케이션을 분리해서 운영할 수 있게 되었다.
하지만, 무겁고 느리며, 리소스를 많이 차지하였으며, 배포 자동화가 쉽지 않았다.
3. 도커(Docker)와 컨테이너 기술
2013년 등장한 Docker는 기존의 가상머신보다 훨씬 가볍고 빠른 컨테이너 기술을 선보였다.
애플리케이션과 실행환경을 묶어 컨테이너 이미지로 포장하였다.
컨테이너 이미지의 등장으로 다음과 같은 장점을 갖게 되었다.
- 어디에서나 동일하게 실행 할 수 있다.
- 서버간의 이동이 쉽다.
- 빠른 실행 속도와 자원 효율성이 좋았다.
그러나, 컨테이너가 많아질 경우 "언제, 어디서, 어떤" 컨테이너를 실행해야하는지,
"어떻게" 죽은 컨테이너를 감지하고 다시 띄워야 하는지,
"어떻게" 네트워크를 연결하고 로드를 분산해야 할지에 대한 문제가 생겼다.
4. 마이크로서비스 아키텍쳐(MSA)의 확산
현대의 웹 서비스는 하나의 거대한 프로그램이 아니라, "작은 기능 단위의 여러 개의 서비스"로 나뉘어진 구조로 변화하였다.
각 서비스는 독립적인 컨테이너로 구성되며, 이로 인해 수 많은 컨테이너로 관리하게 되었다.
5. 쿠버네티스의 등장
많은 컨테이너를 자동으로 배치하고, 연결하고, 복구하고, 확장하는 도구의 필요성으로 인해 쿠버네티스가 등장하게 되었다.
쿠버네티스의 핵심 개념
1. 컨테이너(Container)
컨테이너는 애플리케이션과 실행 환경을 하나로 묶은 패키지로, 어디에서 실행하든 동일하게 동작하는 것이 가장 큰 장점이다.
2. 파드(Pod)
쿠버네티스에서 컨테이너를 실행하는 가장 작은 단위로, 하나의 파드 안에는 하나 이상의 컨테이너가 들어갈 수 있다.
같은 파드 안의 컨테이너는 IP, 저장소, 네트워크를 공유한다.
3. 노드(Node)
노드는 실제 컨테이너가 실행되는 서버로, 물리적 머신이 될 수도 있고, 가상 머신이 될 수도 있다.
4. 클러스터
여러 노드를 모아놓은 전체 시스템이다. 모든 파드는 이 클러스터 안에서 실행된다.
5. 컨트롤 플레인
쿠버네티스 클러스터 전체를 관리하는 두뇌로, 어떤 파드를 어디에 배포할지, 문제가 생기면 어떻게 대응할지 결정한다.
컨트롤 플레인의 구성요소는 다음과 같다.
- API 서버: 사용자, 관리자, 내부 시스템이 처음으로 요청을 보내는 곳으로, 클러스터에 있는 리소스를 생성, 조회, 수정, 삭제 동작 수행
- 스케줄러(scheduler): 새롭게 생성된 파드를 어떤 노드에 배치할지 판단한다. CPU, 메모리 등의 조건으로 판단
- 컨트롤러 매니저(Controller Manager): 클러스터의 상태를 감시하고, 기대 상태와 다를 경우 자동으로 조정한다.
- etcd: 쿠버네티스의 중앙 데이터 저장소로, key-value 형태로 관리하며, 클러스터 내 모든 객체의 상태를 기록한다.
쿠버네티스가 하는 일
쿠버네티스는 단순한 실행 도구가 아닌, 애플리케이션 운영 전반을 자동화하는 시스템이다.
1. 컨테이너의 자동 배포(Deployment)
쿠버네티스는 사용자가 정의한 설정에 따라 컨테이너를 자동으로 배포한다.
replicas: 3
위의 설정을 하면 동일한 파드 3개를 생성한다.
어느 노드에 배포할 것인지는 스케줄러(scheduler)가 처리하며, 어떻게 만들 것인지는 컨트롤러(Controller)가 자동으로 처리한다.
2. 오토스케일링(Autoscaling)
트래픽이 많아지는 경우 파드의 수를 자동으로 늘리고, 사용량이 줄어들면 자동으로 줄이는 기능이다.
CPU 사용률이나, 사용자 요청 수를 기준으로 설정하여 자동으로 조정할 수 있다.
HPA(Horizontal Pod Autoscaler)를 통해 설정할 수 있다.
3. 장애 복구(Self-Healing)
컨테이너가 죽거나, 파드가 사라지면 쿠버네티스는 이를 자동으로 감지하고 새로 생성한다.
이로 인해 누군가가 모니터링할 필요가 없어진다.
4. 서비스 디스커버리와 로드 밸런싱
컨테이너는 종료되거나 재배포되면서 위치(IP 주소)가 계속 바뀌기 때문에, 서비스(Service) 객체를 통해 고정된 가상 IP와 DNS를 제공하여, 항상 동일한 주소로 접근할 수 있게 해준다.
또한, 서비스는 내부적으로 연결된 여러 파드 중 하나를 자동으로 선택하여 요청을 분산 처리(로드 밸런싱)함으로써 리소스를 효율적으로 사용하고 트래픽 병목을 방지한다.
5. 구성 및 보안 관리
설정 파일, 환경 변수, 외부 설정 파일 등을 저장할 수 있으며, 민감한 정보(비밀번호, 토큰, 인증서 등)를 안전하게 관리하여, 유연한 배포 환경을 제공한다.
정리
쿠버네티스는 컨테이너를 자동으로 배포하고, 트래픽 변화에 따라 유연하게 확장/축소하며, 장애 상황에서는 스스로 복구하고, 외부와의 연결을 안정적으로 유지하도록 도와주며, 또한 환경 설정과 민감한 정보를 안전하게 분리하여 관리함으로써 보안성과 유연성을 동시에 확보할 수 있다.