Search

Cloud Computing & Container

Cloud Computing

“a model for enabling ubiquitous, convenient, on-demand network access to a shared pool of configurable computing resources (e.g., networks,servers, storage, applications, and services) that can be rapidly provisioned and released withminimal management effort or service provider interaction.” “You do not own computing infrastructure, but you rent it.”
클라우드 컴퓨팅은 구름 속의 컴퓨터처럼, 사용자가 컴퓨팅 자원이 어디에 존재하는지 알지 못하더라도 손쉽게 사용할 수 있는 기술이다. 2010년에 클라우드 컴퓨팅이라는 용어가 정립되었지만, 그 이전에도 NASA 등에서 이미 활용되고 있었던 기술이다. 직접 구축하여 사용하는 기술에서, 다른 기업의 자원을 빌려 사용하는 방식으로 변화했다.

클라우드 컴퓨팅의 정의

클라우드 컴퓨팅에는 세 가지 주요 서비스 모델이 있음:
IaaS (Infrastructure as a Service): 사용자가 CPU, 디스크, 네트워크 등의 가상화된 컴퓨팅 인프라를 provision해서 사용할 수 있는 서비스. Amazon EC2, S3, Windows Azure등이 해당함. OS, Storage, 네트워킹, 배포된 앱 등을 직접 관리한다.
PaaS (Platform as a Service): 런타임, 개발 도구, 데이터베이스 등을 제공하여 개발자가 애플리케이션을 쉽게 개발하고 배포할 수 있도록 돕는다. 사용자는 네트워크, 서버, OS, 스토리지 등의 내부 infrastrucure을 관리하지 않고 배포된 어플리케이션에 대한 control이 있다. Google App Engine등이 있다. Docker나 Kubernetes도 이에 해당한다고 볼 수 있다.
SaaS (Software as a Service): 모든 애플리케이션은 제공업체가 관리하며 웹 브라우저를 통해서 제공됨. 유튜브 라이브 스트리밍 서비스와 Gmail, Dropbox 등이 있다.

Deployment Models

Public Cloud: 인터넷을 통해서 접근할수 있는 클라우드 컴퓨팅 형태로, AWS의 EC2(가상 서버)와 S3(스토리지 서비스)가 대표적이다. 퍼블릭 클라우드를 사용할때는 그 회사만 가지는 기술을 씀으로써 다른 곳으로 이전할 수 없는 data Lockin문제가 발생할 수 있다.
Private Cloud: 사설 클라우드는 특정 조직만을 위한 전용 클라우드 환경으로, 보안과 제어가 더 강화되어 있습니다. 기업 내부 데이터 센터에서 호스팅할 수 있다.
Hybrid Cloud: 퍼블릭과 프라이빗 클라우드를 동시에 사용하는 모델로, Private이 념치면 public을 사용한다.
Community Cloud: 특정 커뮤니티가 공유하는 클라우드로, 자원을 공동으로 사용하는 방식.

데이터센터

데이터센터 = 클라우드 컴퓨팅을 위한 물리적인 컴퓨터가 존재하는곳.
네이버 데이터센터는 춘천에 위치해있고 대전에도 짓고 있는 중이다.
구글은 500만개 정도의 cpu를 운영중이다.
데이터센터 구축은 비용이 많이 드는 작업이다. 건물 설계, 냉방, 전기설비 등.
스타트업은 서비스의 demand가 얼마나 있을지 예측하기 어렵고 건물과 서버를 감당할 수 없기 때문에 클라우드 서비스를 사용할 의사가 있다.
클라우드 서비스는 on demand로 사용할 수 있으며 up-front비용(가입비)이 없다는 장점이 있다.

On-Premise vs Cloud

on-premise는 기업이 자체 시설에서 보유하고 직접 유지보수하는 private 데이터센터이다. 서비스 운영을 위한 엔지니어가 필요해진다.
클라우드는 가상화된 virtual storage와 virtual network를 제공받고 비용을 내는 구조이며 서비스 운영을 위한 비용을 절감할 수 있다.
클라우드 서비스를 사용하면 DevOps를 단순화할 수 있다. DevOps는 개발 및 운영 사이클을 빠르게 하기 위해서 프로세스를 자동화하는 작업이다.

Pet Model vs Cattle Model

클라우드의 자원 관리 모델.
Pet Model은 마치 애완동물처럼 각 서버에 이름을 붙이고 개별적으로 관리하는 방법이다. Pet들은 유일하고 문제가 발생하면 고쳐서 다시 사용한다.
Cattle Model은 서버들을 소처럼 대량으로 관리하며 문제가 발생할 경우 그냥 죽이고 새로운 서버를 추가해 total count를 유지한다. 각 서버의 이름은 단지 구분만을 위한 일련번호로 도커와 쿠버네티스가 정한다.

Infrastructure

Infrastructure로는 Hardware&Network, OS, Middleware(데이터베이스, 웹서버 등)이 있다. 하드웨어 자원은 CPU, Memory, Storage가 있다.
하드디스크 노트북은 이동중에 쓰면 bad sector가 발생할 수 있다. SSD의 성능은 read, write횟수가 많아져도 속도가 유지되는것이 중요하고 1년정도 지나면 고장날 가능성이 높으므로 하드웨어의 관리는 직접 하기 어렵다.

IaC

소스코드를 통해서 infrastructure를 관리하는 방식.
서버, 데이터베이스, 네트워크 등의자원을 소프트웨어처럼 관리한다.
코드를 사용하면 유저들이 infrastructure를 configuring하고 배포하는 과정을 더 빠르고 일관되게 할 수 있다. 즉 클라우드를 사용할 때 서버, 네트워크, DB등을 코드를 통해 실행시켜주며 필요할 때 필요한 만큼 빌려쓸 수 있고, CPU의 타입이나 어떤 스토리지를 사용하는지 등을 신경쓸 필요가 없다.
하드웨어 플랫폼에 독립적으로 만들어서 Configuration consistency를 유지하고 Immutable한 Infrastructure를 구현하고 일관된 서비스를 제공할 수 있다. 또한 configuration이 동일하므로 Cattle모델을 적용해서 똑같은 서버들을 죽이거나 바꾸면서 운영한다.

Virtualization

Virtual Machine: 하나의 물리적인 컴퓨터 위에 가상의 복수의 머신을 실행한다. 복수의 머신들 위에서 각각의 운영체제들이 실행되고 한 컴퓨터 위에서 각각 물리적인 장치를 할당받아서 실행됨.
VM을 실행하면 컴퓨터의 성능이 떨어지는 이유는 물리적으로 하나의 코어를 VM이 할당받기 때문이다.
Virtualization은 하드웨어로부터 OS를 분리한다.
Host OS위에 Hypervizor레이어가 올라가고 hypervizor는 복수 개의 VM을 실행한다. 각 VM은 Guest OS를 실행하며 hypervisor는 guest os에 코어를 하나이상 할당해주면서 실행시킨다. hypervisor software로는 vmware, virtualbox등이 있다.
hypervisor를 사용하면 쉽게 VM의 수를 scale할 수 있으므로 물리적인 장치를 configuring할 필요가 없으므로 cloud환경에서 필요에 따라 늘리거나 줄일 수 있다. 필요한 만큼의 가상머신을 만든다는것은 필요한 개수만큼의 컴퓨터를 만들어내는 것이므로 성능이 필요하지 않은 상황에서 유용하다.

VM의 단점

VM의 문제점은 각 VM이 OS의 full copy를 가지고 있으므로 많은 저장용량을 차지하고, 상대적으로 느리다. 또한 리눅스 host위에 리눅스 VM이 올라가는 Linux over Linux problem이 발생한다.
똑같은 OS가 두 개 올라가니 그만큼 앱을 실행할 공간이 줄어든다.
OpenStack은 2010년 나사에서 개발한 클라우드 컴퓨팅 소프트웨어로 연구개발을 위해 private cloud에서 여러개의 프로그램을 실행하기 위해서 만들어졌다. Openstack의 KVM, 리눅스의 Xen등의 기술은 하드웨어를 가상화해서 hypervisor를 통해 사용한다. Openstack과 같은 협의의 클라우드 컴퓨팅을 사용하면 많은 비용이 발생한다. 어플리케이션을 필요할 때 실행시키는 것이 목적이지 컴퓨터를 빌리는 것이 목적이 아니다.
실제로 애플에서 OpenStack으로 VM을 사용해서 운영했더니 30퍼센트의 비용이 더 발생했다. 이를 virtualization tax라고 부른다.
협의의 클라우드 컴퓨팅에서는 필요할 때 필요한 만큼의 어플리케이션을 실행하기 위해서 Openstack을 설치하고 가상머신에 자원을 할당하여 그 위에 앱을 올렸다.

OS-level Virtualization and Container

Unix운영체제가 탄생한 1970년대 컴퓨터는 고가였기 때문에 계정을 만들어서 필요한 만큼 사용하고 계정을 삭제하는 멀티유저 형식이었다. 계정을 삭제하면 컴퓨터가 계정을 만들기 이전 상태로 깔끔하게 지운다. 윈도우는 프로그램을 삭제해도 깔끔하게 지워지지 않고 메모리에 남아있어서 디스크 용량이 부족해질 수 있다.
프로그램을 설치하기 위해서는 예를 들면 프로그램뿐만 아니라 파이썬 설치 및 서드파티 라이브러리 import, pip등의 프로그램을 설치하고 환경변수 등을 세팅해야한다. 이를 단순화하기 위해서 개발도구와 운영체제 일부 및 환경변수 등을 한꺼번에 묶어서 리눅스에 설치하고 작업마치면 통째로 버리는 기술이 OS-level 가상화이다.
컨테이너란 application layer의 코드와 dependency를 하나로 묶어 추상화하는 기술이다. 여러개의 컨테이너가 하나의 컴퓨터 안에서 돌아가며 OS커널을 공유하며 독립된 프로세스로 실행된다. Linux Container등이 해당한다. 유닉스 운영체제에서 계정과 프로그램을 설치하고 깨끗하게 삭제하는 기술을 기반으로 구현되었다.
컨테이너는 하드웨어 스택을 vm에서처럼 가상화하는것이 아니라 OS레벨에서 가상화하여 여러개의 컨테이너를 OS커널 위에서 직접 실행한다.
컨테이너들은 hostOS를 활용하므로 OS의 커널을 share하고 각 VM마다 Guest OS가 존재하는것보다 훨씬 빠르게 동작하고 메모리도 적게 사용한다.
Docker는 유닉스기반이 아닌 윈도우에서도 컨테이너 기술이 돌아갈 수 있도록 만들었다.
컨테이너를 사용해서 프로그램을 설치하고 깨끗하게 지우는 과정이 사용자에게는 virtual machine처럼 느낀다. 실제로는 hostOS위에서 돌아가는 프로그램일 뿐이다.
컨테이너는 멀티유저 환경에서 서로가 독립적인 것처럼 isolated process로 컨테이너 간 서로 간섭이 없다. 컨테이너는 혼자서 컴퓨터를 사용하는것처럼 인식한다.
사실 macOS에서 도커를 사용할 때, 도커는 리눅스 기반의 컨테이너를 사용해야 하므로 macOS위에서 리눅스 환경을 제공하기위해 xhyve라는 경량화된 리눅스 가상머신을 사용한다. 마치 컨테이너가 리눅스 위라고 착각하도록 macOS의 환경을 구겨넣는것과 같다. 윈도우는 WSL위에서 실행된다.

VM vs Container

VM을 사용하면 코어 개수나 메모리때문에 더 많은 VM을 사용할수록 성능이 떨어진다. VM을 띄우는 것이 목적이 아니라 앱을 50개 실행하고 싶은건데 목적과 다른 결과가 발생한다.
컨테이너는 새로운 기술이 아니라 유닉스의 프로그램을 설치하고 지우는 기술을 활용해서 만든 것이다.
Docker의 대체제로는 무료 오픈소스인 Podman을 많이 사용한다.