# infra\_based

## 인프라 기초

### 시스템 기반의 기초 지식

* 시스템 기반(애플리케이션을 가동하기 위해 필요한 하드웨어나 OS/미들웨어 등과 같은 인프라)의 구성 요소
  * 기능 요구사항(fuctional requirement)
    * 시스템의 기능으로서 요구되는 사항
    * 시스템이나 소프트웨어에서 무엇을 할 수 있는지를 모아놓은 것
  * 비기능 요구사항(non-functional requirement)
    * 시스템의 성능이나 신뢰성, 확장성, 운용성, 보안 등과 같은 요구사항
  * 하드웨어
    * 시스템 기반을 구성하는 물리적인 요소로서 서버 장비 본체나 데이터를 저장하기 위한 스토리지, 전원장치
  * 네트워크
    * 시스템 이용자가 원격지에서 액세스 할 수 있도록 서버들을 연결하기 위한 요구사항
  * OS(운영체제)
    * 하드웨어나 네트워크 장비를 제어하기 위한 기본 소프트웨어로, 하드웨어의 리소스나 프로세스를 관리합니다.
  * 미들웨어
    * 서버 OS 상에서 서버가 특정 역할을 다하기 위한 기능을 갖고 있는 소프트웨어
* Server(Backend)
  * 클라이언트에게 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터 시스템으로 컴퓨터 프로그램(sever program) 또는 장치(device)를 의미함
  * Home server : 집에서 직접 간단한 홈서버를 구축할 수 있음
  * Internet Data Center(IDC) : IDC에 공간을 임대해서 서버를 구축할 수 있음
  * 온프레미스(On-Premise) : 온프레미스 환경은 자체적인 서버를 구축해서 직접 서버를 운영하는 방식을 의미함
  * 클라우드(Cloud) : 클라우드 서비스는 AWS와 같은 클라우드 프로바이더에 제공되는 서비스를 이용해 직접 서버를 구축하지 않고 서버를 임대해서 사용하는 방식을 의미함
* 가상화
  * 하나의 컴퓨터에서 여러 개의 운영체제를 가동할 수 있게 도와주는 소프트웨어 기술
  * 한 개의 컴퓨터에 있는 자원을 여러 개로 쪼개거나 여러 컴퓨터의 자원을 하나로 합치는 데에 기본적인 기술
  * 여러 컴퓨터를 묶어서 하나처럼 활용하며 여러 개의 가상화된 서버로 나누는 기술
  * 장점
    * 시스템의 확장성 및 유연성 향상(필요할 때 서버를 새로 구매하는 것이 아니라 기존에 쪼개 놓은 서버를 바로 사용할 수 있는 것)
    * 시스템 확장에 빠르게 대응 가능함
    * 물리적인 비용 절감
  * 단점
    * 성능면에서 다소 손해를 볼 수 있음(가상의 자원으로 쪼개는 만큼의 병목현상이 발생)
* 가상화 기술의 종류

  <figure><img src="https://user-images.githubusercontent.com/47103479/227557171-698e1aef-3429-4d62-a328-87f659fece6d.png" alt=""><figcaption><p>https://itwiki.kr/w/%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88_%EA%B0%80%EC%83%81%ED%99%94</p></figcaption></figure>

  * 호스트 가상화
    * 장점 : 운영체제 선택에 제약이 없음
  * 하이퍼바이저 가상화 (기존의 가상화 소프트웨어와 OS의 영역을 하드웨어와 맞물려서 적용)
    * 장점 : 하드웨어 직접 제어로 효율적인 리소스 사용
    * 단점 : 자체적인 머신 관리 기능이 없어 관리를 위한 별도 프로그램 필요
  * 컨테이너 가상화 (더 가볍고 경량화된 애플리케이션들을 다양하게 운용하기 위해 연구, 운영체제 위에 바로 실행할 수 있는 애플리케이션을 띄움)
    * 장점 : 다른 가상화 방식보다 성능 저하가 적고 빠른 운영이 가능, 라이브러리, 패키지 등 애플리케이션 운영에 필요한 기술을 바로 가져다 쓸 수 있음
    * 단점 : 컨테이너별로 설정할 수 있는 부분에 많은 제약이 있음
* 클라우드 컴퓨팅
  * 인터넷이라는 통신 서비스를 활용한 컴퓨팅 서비스 종류의 하나로 개인용 컴퓨터가 아닌, 인터넷을 통해 연결된 원격 컴퓨터를 활용하는 기술
  * 개인용 컴퓨터보다 성능이 뛰어난 컴퓨터나 저장장치 등의 컴퓨터 자원을 다른 곳에서 빌려 사용할 수 있도록 처리해 주는 IT 기술
* 클라우드 컴퓨팅 서비스 이용 방식
  * ![image](https://user-images.githubusercontent.com/47103479/227557270-ca42f8c6-fcf5-4d31-beb5-c47bb6b91a4c.png)
    * <https://www.redhat.com/en/topics/cloud-computing/iaas-vs-paas-vs-saas>
  * IaaS(Infrastructure-as-a-Services)
    * 물리적 서버(CPU, Memory 및 OS), 네트워크, 스토리지를 가상화하여 다수의 고객을 대상으로 유연하게 제공하는 인프라 서비스
    * Infrastrucutre 레벨을 제공하는 서비스로, 하드웨어 부분을 제공받는 방식
    * 사용자가 원하는 S/W를 별도 구매해 언제든 설치, OS 설치부터 사용자가 원하는 설정이 가능함, OS위의 계층에 대해서는 관리를 해야 함
  * PaaS(Platform-as-a-Services)
    * 사용자가 응용 프로그램을 작성할 수 있도록 플랫폼 및 환경을 제공하는 방식
    * Web 기반의 서비스 또는 애플리케이션 등의 개발 및 실행을 위한 표준 플랫폼 환경을 서비스 형태로 제공하는 서비스
    * 관리 및 운영은 클라우드 업체가 해주기 때문에 사용자는 애플리케이션 활용 자체에만 집중
    * 개발된 애플리케이션은 다른 플랫폼으로 옮기기 어려울 수 있음
  * SaaS(Software-as-a-Services)
    * 사용자의 별도 설치 없이 클라우드를 통해 애플리케이션이 제공됨, 추가적인 설치 및 개발 없이 해당 서비스에서 제공하는 기능들을 웹 브라우저를 이용하여 사용이 가능함
    * 사용자는 애플리케이션을 웹 브라우저로 불러와 언제 어디서나 사용할 수 있음
    * 구글의 Gmail이나 MS Office 365 등과 같이 응용프로그램(Application)을 인터넷 및 웹 브라우저를 통해 제공하는 서비스
    * 인터넷으로 접속해야 하기 때문에 데이터 보안에 문제가 될 수도 있음
  * 클라우드 컴퓨팅 스택(Cloud Computing Stack) : 클라우드 컴퓨팅 서비스는 중첩되어 제공하는 것을 뜻함
* 도커 Docker
  * 애플리케이션 실행 환경을 작성 및 관리하기 위한 플랫폼
  * 도커는 애플리케이션 실행에 필요한 환경을 이미지로 만들고 해당 이미지를 활용해 다양한 환경에서 실행 환경을 구축하기 위한 오픈소스 플랫폼입니다. 도커는 내부에서 컨테이너를 사용
  * 개발자가 커밋을 할 때마다 CI를 통해 도커 이미지로 빌드를 하고 해당 이미지를 관리, 개발 환경이든 테스트 환경이든, 실제 운영 환경이든 해당 이미지를 배포하면 컨테이너에서 독립적으로 배포된 환경에서 동작하기 때문에 오류 없이 동작
* 쿠버네티스 Kubernetes
  * 실제 애플리케이션은 여러 컨테이너에 걸쳐 있고 이러한 컨테이너는 여러 서버에 배포되어 있음, 이렇게 여러 대의 서버나 하드웨어를 모아서 한 대처럼 보이게 하는 기술을 클러스터링(clustering), 가용성과 확장성을 향상할 수 있음
  * 멀티호스트 환경에서 컨테이너를 클러스터링 하기 위한 툴을 컨테이너 오케스트레이션 툴(컨테이너들을 클러스터링 하기 위해 컨테이너 시작 및 정지와 같은 조작, 호스트 간 네트워크 연결, 스토리지 관리, 컨테이너를 어떤 호스트에서 가동할지와 같은 스케줄링 기능을 제공)

## Reference

* <https://www.oreilly.com/library/view/infrastructure-as-code/9781098114664/>
* <http://www.yes24.com/Product/Goods/64728692>
* <http://www.yes24.com/Product/Goods/69304366>
