쿠버네티스는 컨테이너화 된 애플리케이션을 효율적으로 배포하고 운영하기 위해 설계된 오픈 소스 플랫폼입니다.
그렇다면 컨테이너는 무엇이고 쿠버네티스 라는 것으로 배포를 한다면 쿠버네티스가 있기 이전의 애플리케이션의 배포는 어떻게 이루어졌을까요?
쿠버네티스 이전의 배포
가상화 기술이 등장하기 이전에는 애플리케이션을 물리 서버에서 실행했었습니다.
하나의 물리 서버에서 여러 애플리케이션을 실행시키게 되면서 하나의 애플리케이션이 리소스를 전부 차지하는 상황이 발생하여 다른 애플리케이션의 성능이 떨어지는 등 문제가 발생하게 되었습니다.
이에 대한 해결책으로 서로 다른 여러 물리 서버에서 각 애플리케이션을 실행할 수 도 있겠지만 각 서버의 리소스가 충분히 활용되지 않고, 유지해야 하는 물리 서버의 개수가 늘어나기 때문에 많은 비용이 발생하였습니다.
이런 문제를 해결하기 위해 가상화 기술이 등장하였고, 물리 서버에 여러 가상 머신(Virtual Machine)을 설치하면서 하나의 물리 서버의 CPU에서 여러 가상 시스템(VM)을 실행할 수 있게 되었습니다.
가상 머신을 이용하여 애플리케이션을 가상 머신에 나누어 설치하여 물리 서버만 사용했던 때보다 리소스를 더 효율적으로 사용할 수 있게 되었고 더 나은 확장성을 얻을 수 있게 되었습니다.
하지만 가상 머신은 하드웨어 상에서 자체 운영체제를 포함한 모든 구성요소를 실행하는 완전한 머신이기에 무겁고 느리다는 단점이 존재했습니다.
컨테이너의 등장
이런 단점을 보완하기 위해 컨테이너라는 기술이 등장하였습니다.
컨테이너는 가상 머신과 유사하지만 격리 속성을 완화하여 애플리케이션 간에 운영체제를 공유합니다. 그 덕분에 GUEST OS를 추가로 설치해야하는 가상머신보다 더 가볍습니다.
또한 가상머신과 마찬가지로 자체 파일 시스템, CPU 점유율, 메모리, 프로세스 공간 등이 존재하며 기본 인프라와의 종속성을 제거했기 때문에 클라우드나 OS배포본에 모두 자유롭게 이식할 수 있습니다.
컨테이너는 다음과 같은 이유 등으로 인기가 많습니다.
- VM 이미지를 사용하는 것에 비해 컨테이너 이미지 생성이 쉽고 효율적입니다.
- 안정적이고 주기적으로 컨테이너 이미지를 빌드해서 배포할 수 있고 (이미지의 불변성 덕에) 빠르고 효율적으로 되돌릴 수 있습니다.
- 배포 시점이 아닌 빌드/릴리스 시점에 애플리케이션 컨테이너 이미지를 만들기 때문에 애플리케이션이 인프라 구조에서 분리됩니다.
- OS 수준의 정보와 메트릭에서 머무르지 않고, 애플리케이션의 상태나 그 밖의 시그널을 볼 수 있습니다.
- 다른 OS는 물론이고 로컬 환경 이든 클라우드 환경이든 동일하게 동작합니다.
개발자들은 오픈 소스를 사용하여 짧은 시간에 고품질의 애플리케이션을 개발하는 경우가 많습니다. 그런데 오픈 소스의 경우에는 버전이 계속 바뀌기 때문에 팀원들과 다른 버전의 오픈 소스를 사용하는 상황이 벌어질 위험이 있습니다.
이러한 개발자 간의 개발 환경 차이는 개발 생산성과 안정성을 떨어뜨리는 문제가 있습니다. 이런 상황에서 컨테이너 기술을 이용하여 애플리케이션 실행에 필요한 라이브러리나 운영체제 패키지 등을 모두 담아서 이미지를 만들면 테스트와 실제 운영환경 간의 차이를 없앨 수 있게 되어 개발 생산성을 높이고 안정적으로 서비스를 배포할 수 있게 됩니다.
컨테이너 오케스트레이션 도구의 등장
이러한 컨테이너가 가지는 강점 덕분에 많은 조직에서 컨테이너를 이용하여 배포를 하게 되었지만 서비스의 규모가 커지면서 컨테이너의 수가 증가하게 되었고 각각의 컨테이너를 하나하나 직접 관리하는 것이 너무 힘들어지게 되었습니다.
이러한 문제를 해결하기 위해 등장한 기술이 바로 컨테이너 오케스트레이션(container orchestration)입니다.
컨테이너 오케스트레이션 도구는 다음과 같은 역할을 합니다.
- 클러스터 (Cluster)
- 중앙제어
- 관리해야 하는 컨테이너의 개수가 많아지면서 컨테이너 들을 추상화하여 하나의 클러스터로 운영합니다.
- 클러스터를 관리하기 위해 마스터 노드를 두고 마스터 노드가 클러스터에 명령을 내리는 구조입니다.
- 네트워킹
- 클러스터 내 노드 간 네트워킹이 원활하게 이루어져야 합니다.
- 노드 스케일
- 클러스터 내에 컨테이너가 무한하게 증가하더라도 관리가 가능해야 합니다.
- 중앙제어
- 상태 관리 (State)
- 원하는 상태를 설정하면 해당 상태로 자동으로 변경되어야 합니다.
- 특정 컨테이너에 문제가 생겨 상태가 변경될 경우 원래의 정상적인 상태로 돌아와야 합니다.
- 트래픽이 증가하여 서버의 증설이 필요할 경우 자동으로 서버를 늘려주어야 합니다. (오토 스케일링)
- 스케줄링 (Scheduling)
- 서버의 리소스를 확인하여 새로운 컨테이너를 생성할 때 적합한 서버에 배치할 수 있어야 합니다.
- 배포 버전 관리 (Rollout / Rollback)
- 배포(Rollout) 시 컨테이너 하나하나 관리자가 직접하는 것이 아닌 중앙에서 배포를 진행하면 자동으로 진행해야 합니다.
- 배포한 컨테이너를 다시 되돌리고(Rollback) 싶을 경우에도 마찬가지로 자동으로 진행되어야 합니다.
- 서비스 등록 및 조회 (Service Discovery)
- 새로운 서비스가 추가된 경우 자동으로 해당 서비스에 대한 설정이 추가되어야 합니다.
- 볼륨 스토리지 (Volume)
- 각 컨테이너 별 볼륨 관리를 추상적으로 손쉽게 관리할 수 있어야 합니다.
많은 컨테이너 오케스트레이션 도구들이 등장하였지만 현재는 쿠버네티스가 사실상의 표준처럼 쓰이고 있습니다.