Easy Understanding

쿠버네티스는 어떻게 나오게 되었나(컨테이너 기술의 변화 과정) 본문

Infra

쿠버네티스는 어떻게 나오게 되었나(컨테이너 기술의 변화 과정)

appleg1226 2020. 11. 1. 18:37

시작 전에

쿠버네티스를 이해하기 전에 기존의 배포 과정들을 

저는 다음의 어플리케이션들을 사용한다는 시나리오를 가정하겠습니다.

MySQL, Java, Node, Redis, Kafka, Zookeeper 등 임의로 배포하고자 하는 어플리케이션을 설정했습니다.

그리고 MySQL, JAVA, Node는 여러 개의 인스턴스로 배포하려고 합니다.

 

아래의 어플리케이션들 각각에 대한 자세한 이해는 필요 없습니다. 

간단하게 이것들이 단계별로 어떻게 배치되는지만 보시면 됩니다.

예시로 사용하고자 하는 어플리케이션들

 

이 글은 세세한 기술적인 디테일은 일부러 생략했습니다.

최대한 개념적인 이해에만 집중하도록 큰 틀 위주로 설명하도록 하겠습니다.

 


서비스를 기존에는 어떻게 배포했는가?

우리는 서비스들을 서버 컴퓨터에 배포합니다.

보통 개발의 단계는 다음의 단계를 거칩니다.

 

1. 개발자의 컴퓨터에서 어플리케이션을 개발합니다.

 

2. 서버 컴퓨터를 구해서 셋팅을 합니다.

 

3. 개발에 사용한 어플리케이션 코드를 git clone을 이용해서 직접 서버 컴퓨터로 다운로드 합니다.

 

4. 각 서버 컴퓨터에서 어플리케이션에 필요한 실행 환경을 설치해야 합니다.

 

5. 이제 어플리케이션을 구동시킵니다.

 

만약에 이걸 각 서버 컴퓨터에 배포한다면 아래와 같은 그림이 되겠죠?

각 서버마다 필요한 어플리케이션들을 배포하고, 다른 프로그램들도 각각 설치했습니다.

 

서버 컴퓨터에 각 인스턴스를 올리거나 설치한 상황

 

요새는 AWS의 EC2 같은 클라우드 서비스에 올리는게 더 익숙하며 보편적입니다.

그래서 클라우드로 배포한다는 것을 가정하고 다음처럼 그림을 바꾸겠습니다.

클라우드에 올렸다는 것을 표현하기 위해 구름모양으로 바꿔서 아래처럼 다시 표현했습니다.

 

클라우드 서비스에 올린 서비스들

 

이렇게 각 서버 컴퓨터나, 각 클라우드 서비스 인스턴스에 배포를 마쳤습니다.

 

결국 이 과정을 종합하면

12개의 서버 컴퓨터를 모두 셋팅하고,

각 12개의 컴퓨터에 각 프로그램들의 설치를 마쳤습니다.

 


불편한 점

설치를 할 때 우리는 이런 과정을 거쳤습니다.

 

자바 어플리케이션을 실행하는 서버에서는 자바를 설치해줬습니다.

이를 위해서 환경 변수도 설정해줘야 합니다.

 

Node 어플리케이션을 실행하기 위해서 노드 환경을 설치해줘야 합니다.

 

다른 것들도 마찬가지로 Linux 환경에서 설치를 일일이 진행해줘야 합니다.

그리고 서버 컴퓨터의 OS에 따라서도 설치 방법이 다를 때도 있지요.

 

설치하다가 한 번 뭐가 막히면 갑자기 '삽질의 시간'이 시작되죠.

물론 개발자가 이 정도는 직접 할 줄은 알아야 하지만 귀찮고 어려운 작업들이 너무 많아요.

 

A부터 Z까지 모든 것을 할 줄 알아야 한다는 것은 물론 중요하지만,

이것을 반복 작업으로 매번 해야한다는 것은 다른 문제입니다.

 

이런 귀찮음과 복잡함을 해결해준 기술이 바로 'Container' 기술입니다. 

 


서버 컴퓨터에 직접 설치하던 시대에서 컨테이너의 시대로

docker와 같은 container 방식은 기존 방식에 비해서는 정말로 혁명적인 기술입니다.

 

Container는 이미 내가 설치하고자 하는 어플리케이션들이 설치된

하나의 '포장상자'라고 할 수 있습니다.

 

내가 만든 것이든, 다른 사람들이 만든 것이든 온라인에 포장되어 있는 상품들을

손쉽게 주문해서 내 컴퓨터에 설치할 수 있습니다.

 

이젠 직접 설치하지 않고

docker를 이용해서 '이 컨테이너를 이 버젼으로 내 시스템에 설치해줘' 라고 요청만 하면 됩니다.

docker run mysql:latest
=> 이 docker 명령어 하나면 내 컴퓨터에 최신 mysql이 설치된다.

그러면 내 컴퓨터의 OS나 환경과 상관없이 내 시스템에 프로그램이 자동으로 설치가 됩니다.

 

이미 만들어진 상품들을 쉽게 내 컴퓨터에 갖다 쓸 수 있을 뿐 아니라,

내가 직접 상품을 만들어서 내 아이디로 인터넷에 있는 docker hub에 올려 놓을 수도 있습니다.

 

그것을 다른 컴퓨터에서 docker 명령으로 내 아이디를 참조해서 설치를 해달라고 하면 됩니다.

docker run my-id/my-image:latest

 

위의 서비스 배포 상태가 docker를 이용하면 다음과 같이 바뀝니다.

 

docker를 이용해서 구성한 배포 환경

 

 

컨테이너를 이용함으로 바뀐 변화는 정리하자면 다음과 같습니다.

 

이전

1) 필요한 서버 인스턴스를 만든다.

2) 서버의 OS에 맞게 필요한 패키지나 어플리케이션을 설치한다.

3) 위의 과정에 대해 필요하다면 스크립트를 만들어야 하기도 한다.

 

이후

1) 서버를 인스턴스를 만든다.

2) 서버에서 docker를 설치한다.

3) docker run을 이용해서 내가 설치하고자 하는 어플리케이션을 설치 및 실행한다.

 


만약 이것보다 훨씬 컨테이너가 많아진다면?

사실 이 정도만 해도 배포 환경은 충분히 개선되었습니다.

위의 예시처럼 12개의 어플리케이션 정도는 수동으로 설치하고자 하면 그렇게 복잡하지 않게 할 수 있죠.

 

이제 비즈니스 단계로 넘어가 봅시다.

 

비즈니스 레벨의 어플리케이션은 12개 정도의 서버 규모는 확실히 아닙니다.

수백 수천 개의 컨테이너 환경이 필요할 상황일 수도 있습니다.

 

만약에 위와 같은 어플리케이션 구조를 가진,

다양한 기능의 어플리케이션을 여러 개 배포해야 한다면 어떻게 될까요? 

 

아래 그림에서는 그 수를 세 배로 늘려봤습니다.

 

위의 어플리케이션 구조를 가진 어플리케이션이 두 개 더 있는 상황

위의 그림을 보시면 우리가 설치해야 하는 서버 인스턴스의 갯수가 세 배로 늘었습니다.

그럼 36개의 인스턴스를 다시 설치하면 되겠네요.

 

슬슬... 복잡하다는 생각이 들기 시작합니다.

 

어우 저 많은 걸 어떻게 만들고 관리해야하나?

어디에서 뭐가 저 많은 서버들을 관리해줄 수는 없나?

만약에 저 시스템의 규모가 10배가 된다면?

만약에 자바 어플리케이션 인스턴스를 몇 개 더 늘리고 싶다면?

업데이트는 어떻게 해야하지?

 

이것을 보니 새로운 기술의 필요성이 충분히 느껴지시나요?

 


이래서 쿠버네티스가 좋습니다.

쿠버네티스는 이런 많은 수의 컨테이너들을 효과적으로 관리할 수 있는 수단입니다.

 

수많은 기능들, 그리고 점점 풍부해지고 있는 생태계 등 쿠버네티스는 엄청난 속도로 발전하고 있습니다.

 

그렇지만 처음 공부하는 입장에서 이런 것들 이전에 가장 근본적인 쿠버네티스의 장점은 무엇보다도,

'컨테이너를 기존보다 더 배포하기 쉽다'는 것입니다.

 

쿠버네티스는 'Container platform'으로서 

기존의 docker container들을 쿠버네티스의 내부로 모아서 관리하게 해줍니다.

 

어떻게 보면 컨테이너의 OS(Operating System) 이라고 이해해도 좋습니다.

 

쿠버네티스를 이용하면 우리가 지금까지 만들었던 Docker Container들은

모두 쿠버네티스 안으로 들어가게 됩니다.

아래 그림처럼요.

 

 

도대체 쿠버네티스가 어떻게 되어 있길래 자신의 울타리로 저 많은 컨테이너들을 묶을 수가 있나요?

그리고 도대체 서버 인스턴스는 몇 개로 구성되어 있는거죠?

 


쿠버네티스는 이렇게 구성할 수 있습니다

쿠버네티스 환경은 여러 서버 인스턴스들의 묶음으로 구성됩니다.

이런 환경을 '클러스터'라고 하지요.

 

아래처럼 쿠버네티스는 노드(Node)라는 것으로 구성되어 있습니다.

노드는 쿠버네티스에서 부르는 단위에 대한 용어고,

그냥 겉모습만 보자면 '하나의 서버 컴퓨터나 클라우드 인스턴스' 라고 하면 됩니다.

kubernetes 구조

우리는 각 서버 컴퓨터에 쿠버네티스 환경을 설치해야 됩니다.

 

먼저 대표 기능을 할 Master Node를 담당할 컴퓨터에 쿠버네티스 환경을 설치합니다.

또한 나머지 서버에는 Worker Node용 쿠버네티스 환경을 설치해주면 클러스터 구축이 끝납니다.

 

이제 우리는 쿠버네티스 환경 안에 컨테이너를 설치할 수 있습니다.

 

그렇다면 컨테이너를 어떻게 설치를 해줘야할까요?

이전처럼 각 노드에 접속해서 docker run을 하면 될까요?

 


쿠버네티스는 이렇게 컨테이너를 저장합니다.

우리는 이전에 docker를 사용할 때 이렇게 사용했습니다.

- 각 서버에 접속한다

- docker를 설치한다.

- docker run을 이용하여 이미지를 설치한다.

 

그러나 쿠버네티스를 이용하면 이렇게 사용하면 됩니다.

- 쿠버네티스 환경을 구축한다.

- 내 컴퓨터에 kubectl을 설치합니다. 이 kubectl은 쿠버네티스의 Master Node에 명령을 보낼 수 있는 프로그램입니다.

- kubectl run을 이용하여 이미지를 설치한다.

 

 

오잉?

그럼 내 이미지는 어디에 배포되는거죠?

어떻게 사용해야하죠?

 

 

쿠버네티스에 kubectl run을 명령하면 나의 이미지는 워커 노드 중

현재 최적이라고 생각하는 노드에 배정이 됩니다.

 

나는 어디에 배정되는지 알지 못한 채로 그냥 쿠버네티스에 맡기는 겁니다.

(물론 직접 노드를 정할 수도 있고, 어디에 배정되었는지도 확인할 수 있습니다)

 

아래 그림은 어떻게 컨테이너들이 쿠버네티스 환경에 배포되는지를 구체적으로 보여줍니다.

각 컨테이너들이 랜덤으로 각 노드에 배정된 것을 보실 수 있습니다.

우리는 이 모든 배포 명령을 kubectl 명령어를 통해서 한 컴퓨터에서 진행할 수 있습니다.

 

이전에 여러 서버들에 각각 접속해서 컨테이너를 배포를 해야했던 환경이,

이제는 환경을 구축해두고 한 서버에만 명령을 보내면 알아서 배포가 되는 환경으로 변했습니다.

 

쿠버네티스를 이용한다면 우리는 노드를 모르더라도 아래처럼 사용할 수가 있게 되는 것이지요.

마치 하나의 '플랫폼'처럼요.

 

 

 


이게 다라면 쿠버네티스가 아니지 

쿠버네티스는 하나의 플랫폼으로서 동작하면서 그 안에서 너무나도 많은 것들을 할 수가 있습니다.

간단하게 어떤 것들을 지원하고 있는지 설명해 드리겠습니다.

 

- 배포가 편해요

docker에서 했던 것처럼, yaml로 명세 파일을 직접 작성하여 container의 생성 및 동작을 자동화 할 수 있습니다.

 

- Container Image의 갯수도 조절하여 배포할 수 있어요

우리가 위에서 Java application의 갯수를 3개로 설정을 했죠.

쿠버네티스는 이걸 replicaSet이라는 기능을 이용해서 필요하다면 4개로,

더 필요하다면 10개까지도 복제해서 배포할 수 있게 해 줍니다.

이 갯수는 설정 파일에서 숫자 하나만 바꿔주면 됩니다.

 

- 배포 상태를 관리해주고, 문제가 생기면 원래대로 동작할 수 있도록 해줘요

쿠버네티스에는 Deployment라는 기능이 있는데, 이걸 이용하면 이미지를 배포하기에 편리한 기능이 많습니다.

업데이트를 점진적으로 수행(Rolling Update)해주기도 하고,

중간에 문제가 생길 경우에 Rollback도 해주고 컨테이너 관리를 여러모로 편리하게 해줍니다.

 

- 모니터링 / 로깅 / 보안 / CI/CD 등 여러 기능을 지원해주는 생태계가 풍부합니다

여러 개의 어플리케이션을 운용하면서 위의 사항들은 매우 중요합니다.

쿠버네티스는 이러한 기능들을 간단하게 추가하고 사용할 수 있는 풍부한 환경이 마련되어 있습니다.

 

- 클라우드 플랫폼들에서 적극적으로 지원해요.

이 복잡한 서비스를 더욱 간편하고 강력하게 사용할 수 있도록 주요 클라우드 플랫폼들은

쿠버네티스 지원 기능을 갖추고 있습니다.

AWS, GCP, AZURE 등 여러 클라우드 서비스에서는 모두 각자의 지원 서비스를 제공하고 있습니다.

이 플랫폼들에서 기존에 제공하는 서비스들을 같이 조합하면 더욱 안정된 플랫폼을 구축할 수 있습니다.

 


마치며

쿠버네티스는 위의 개념처럼 간단하게 사용할 수 있는 기술은 아닙니다.

그리고 모두가 도입해야 하는 기술도 아닙니다.

그럼에도 불구하고 그 편리함과 통합성 때문에 쿠버네티스는 반드시 공부해야할 기술이라고 생각합니다.

나중에 쿠버네티스는 점점 발전하여 업계에서 표준과도 같은 기술이 될 가능성이 높습니다. 

 

당장 도입하지 않더라도 쿠버네티스를 아는 것은 나중에라도 큰 도움이 될 것입니다.

 

자세한 기술들은 쿠버네티스 공식 문서와 관련 서적을 참고하시면 되겠습니다.

 

 

참고) 핵심만 콕! 쿠버네티스, Kubernetes 공식 문서(kubernetes.io/ko/docs/home/)

'Infra' 카테고리의 다른 글

M1 맥북 사용자의 EKS 배포 오류에 대하여  (3) 2021.07.25