쿠버네티스 소개

niyu·2022년 4월 22일
0

쿠버네티스 기초

목록 보기
1/15
post-thumbnail

컨테이너 (Container)

컨테이너란 데스크탑, 클라우드 등 어디서나 실행될 수 있도록 어플리케이션 코드가 해당 라이브러리 및 종속 항목과 함께 패키징되어 있는 소프트웨어 실행 유닛이다.

즉, 실행환경을 독립적으로 운용할 수 있도록 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술이다.

기존에 가상화나 클라우드 컴퓨팅을 얘기할 때는 가상머신(Virtual Machine)을 많이 언급했다.

컨테이너와 가상 머신의 차이
컨테이너와 가상 머신의 차이 (출처: www.docker.com/resources/what-container/)

왼쪽이 컨테이너의 구조고 오른쪽이 가상 머신의 구조다.

가상 머신은 하이퍼바이저 위에 가상 머신마다 어플리케이션 및 이와 연관된 라이브러리들과 함께 OS가 실행해야 하는 하드웨어의 가상 사본인 게스트 운영체제가 있고, 그 위에 앱이 위치한다.

컨테이너는 모든 인스턴스에 게스트 OS를 포함할 필요가 없고 그 대신 호스트 운영체제 위에 도커가 있고 바로 어플리케이션이 위치한다.

가상머신과는 달리 컨테이너가 레이어가 더 간단하고 호스트 OS의 기능과 리소스를 간편하게 활용할 수 있기 때문에 컨테이너는 작고 빠르며 이식성이 뛰어나 가상 머신보다 성능을 높이기 쉽다.

🧩 Hypervisor (= Virtual Machine Manager) : 동일한 컴퓨팅 리소스를 공유하면서 여러 운영 체제가 서로 간에 동시에 실행될 수 있도록 해주는 소형 소프트웨어 계층이다. 하이퍼바이저가 있기 전에는 대부분의 컴퓨터는 한 번에 하나의 운영 체제만 실행할 수 있었지만, 하이퍼바이저를 통해 메모리, 스토리지 등의 컴퓨팅 리소스들을 각 가상머신에 배분해 하나의 호스트에서 다수의 운영 체제를 동시에 실행할 수 있다.

도커의 개념
도커의 개념 (출처: docs.docker.com/get-started/overview)

도커를 이용하면 위 그림처럼 간단한 명령으로 이미지를 만들고 저장소에 저장할 수 있다. 또한 도커를 설치한 호스트에 해당 컨테이너 이미지를 다운로드해서 컨테이너를 실행할 수 있다.

컨테이너가 있기 전에는 호스트에도 개발 환경에 필요한 설정을 똑같이 해야 했다. 이 과정에서 여러 가지 장애 요소가 많이 발생해서 어려움이 있었지만, 컨테이너를 통해 앱을 배포하고 관리하기가 더 편해지게 되었다.

🧩 Docker : 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 컨테이너 환경에서 어플리케이션을 패키징하고 실행할 수 있는 기능을 제공한다. 도커만 있다면 실제 서버 어디에서든지 실행할 수 있다. 쉽게 말해 컨테이너 런타임이라 볼 수 있다.

🧩 Image : 컨테이너 실행에 필요한 파일과 설정값들을 포함하고 있는것으로, 컨테이너는 이미지를 실행한 상태라 볼 수 있다.

컨테이너 오케스트레이션 시스템

컨테이너만으로는 실제 상용 서비스를 운영하기에는 부족한 부분이 있는데, 컨테이너 오케스트레이션 시스템은 컨테이너의 부족한 부분을 채워주는 역할이다.

실제 서비스를 운영할 때 컨테이너만 단독으로 사용한다고 하면 컨테이너 이미지를 만들고 여러 대 서버에 컨테이너를 배포하는 전체 과정을 수동으로 제어해야 한다. 또한 서버에 장애가 발생했을 경우 해당 서버의 컨테이너를 다른 서버로 옮기는 등의 작업도 해야 한다.

컨테이너 오케스트레이션 시스템을 사용하면 수동으로 제어했던 부분들을 모두 자동화하기 때문에 시스템 운영이 훨씬 수월해진다.

컨테이너 오케스트레이션 시스템
컨테이너 오케스트레이션 시스템 (출처: tech.kakao.com/2018/12/24/kubernetes-deploy/)

컨테이너 오케스트레이션 시스템으로 상용 서비스에 사용할 서버들을 클러스터로 구성하면 서버 1대든 100대든 컨테이너를 한 번의 명령으로 자동 배포할 수 있다. 또한 클러스터 일부에 장애가 발생하면 알아서 장애가 발생한 서버에 있는 컨테이너들을 정상 운영 중인 다른 서버로 옮겨서 실행시킨다. 개발자는 운영중인 서비스의 안정성을 컨테이너 오케스트레이터에 맡겨 두고 장애가 발생한 서버를 고치기만 하면 된다.

🧩 Cluster : 여러대의 서버를 묶어 시스템 하나로 구성하는 방식

쿠버네티스 (Kubernetes)

이런 컨테이너 오케스트레이션 시스템 중 가장 널리 사용되는 솔루션이 쿠버네티스다. 쿠버네티스는 컨테이너를 쉽고 빠르게 배포, 확장 및 관리를 자동화해주는 오픈소스 플랫폼이다.

쿠버네티스의 주요 특징은 다음과 같다.

🌟 서비스 디스커버리와 로드밸런싱(Service discovery and load balancing) : 컨테이너에 고유한 IP 주소와 DNS 이름을 제공하고 이를 통해 로드밸런싱을 지원해 컨테이너에 대한 트래픽이 많으면 이를 로드밸런싱하여 배포가 안정적으로 이루어질 수 있도록 한다.
🌟 스토리지 오케스트레이션(Storage orchestration): 로컬 저장소와 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재할 수 있다.
🌟 자동화된 롤아웃과 롤백(Automated rollouts and rollbacks) : 어플리케이션 상태를 모니터링하면서 동시에 모든 인스턴스가 종료되지 않도록 어플리케이션이나 해당 구성의 변경 사항을 점진적으로 배치할 뿐만 아니라 잘못된 배치의 경우 롤백을 바로 수행할 수 있다.
🌟 자동화된 빈 패킹(Automatic bin packing) : 서비스의 리소스 요구 사항에 따라 컨테이너를 자동으로 배치할 수 있다.
🌟 자동화된 복구(Self-healing) : 서비스하고 있는 컨테이너가 종료되거나 사용자가 정의한 health-check가 실패하는 경우 자동으로 컨테이너를 복구할 수 있다.
🌟 시크릿과 구성 관리(Secret and configuration management) : 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리할 수 있다.

쿠버네티스 클러스터 아키텍처

쿠버네티스는 클러스터 운영체제라고 생각할 수 있다. 쿠버네티스 클러스터는 마스터 노드와 여러 개의 워커 노드로 구성된다. 마스터 노드는 전체 쿠버네티스 시스템을 관리하고 통제하는 쿠버네티스 컨트롤 플레인을 관장한다. 워커노드는 실제 배포하고자 하는 애플리케이션의 실행을 담당한다.

쿠버네티스 클러스터 구성 요소
쿠버네티스 클러스터 구성 요소 (출처: kubernetes.io/ko/docs/concepts/overview/components/)


🔎 컨트롤 플레인
클러스터를 관리하고 클러스터의 기능을 실행한다. 컨트롤 플레인의 구성 요소는 클러스터의 상태를 유지하고 제어하지만 어플리케이션을 실행하지 않는다. 어플리케이션은 워커 노드에서 실행된다.

  • API 서버: 사용자, 컨트롤 플레인과 통신
  • 스케줄러: 어플리케이션의 배포 가능한 각 구성 요소에 워커 노드를 할당
  • 컨트롤러 매니저: 구성 요소 복제, 워커 노드 추적, 노드 장애 처리 등 클러스터 수준 기능을 실행
  • etcd: 클러스터 구성을 지속적으로 저장하는 안정적인 분산 데이터 스토리지

🔎 노드
워커 노드는 컨테이너화된 어플리케이션을 실행하는 시스템이다.

  • kubelet: API 서버와 통신하고 노드에서 컨테이너를 관리
  • kube-proxy: 어플리케이션 구성 요소 간에 네트워크 트래픽을 분산하는 쿠버네티스 서비스 프록시
  • 컨테이너 런타임: 컨테이너를 실행하는 도커

🔎 어플리케이션 실행

컨테이너 이미지를 패키지로 만들어 이미지 레지스트리에 푸시한 후 쿠버네티스 API 서버에 어플리케이션의 디스크립션을 게시한다. 디스크립션에는 컨테이너 이미지가 있고 어플리케이션 컴포넌트 간 관련성 및 노드 배치 정보 등이 있다.

스케줄러는 API 서버가 어플리케이션의 디스크립션을 처리할 때 각 그룹에서 필요한 연산 리소스와 각 노드의 할당되지 않은 리소스를 기반으로 사용 가능한 워커노드로 컨테이너의 지정 그룹을 예약한다. 이후 해당 노드의 kubelet은 필요한 컨테이너 이미지를 가져와 컨테이너를 실행하도록 컨테이너 런타임에 지시한다.


참고 :
[Book] 쿠버네티스 입문 - 1. 쿠버네티스 소개
[Book] 쿠버네티스 인 액션 - 1. 쿠버네티스 소개
IBM - 컨테이너
kubernetes.io - 쿠버네티스란 무엇인가?

0개의 댓글