컨테이너 인프라 환경
- 온프레미스(on-premises)
- 엔지니어가 개발환경을 만들어 제공하면 사용자는 그에 맞는 도구를 모두 설치해야한다.
- Iaas(Infastructure as a Service)
- 서비스로서의 인프라 환경
- 이미 구성된 환경을 사용자가 필요에 따라 선택하고 조합해서 사용할 수 있게 제공해준다.
- 개발 방법론
- 폭포수(waterfall)
- 계획 단계에서 설계와 환경을 완전히 구비한 후 예정된 목표를 달성해 나간다.
- 애자일(agile)
- 일정 주기를 정한 다음에 해당 주기에 맞춰 요구 사항을 만족하는 프로토타입을 만들고 이를 개선해나가며 최종 목표에 점진적으로 접근한다.
- 애자일 방법론에 맞춰 사용자가 요구하는 인프라를 즉각 제공하는 주요 기능은 유지하면서, 사용자마다 독립적인 환경에서 개발해도 모두 동리한 결과를 얻을 수 있고 개발된 소프트웨어의 성능을 보장하며 인프라의 가용리소스를 최대한 확보할 수 있는
컨테이너 인프라 환경
이 등장하였다.
컨테이너 인프라 환경이란?
- 리눅스 운영체제의 커널 하나에서 여러개의 컨테이너가 격리된 상태로 실행되는 인프라 환경
- 컨테이너는 하나의 운영체제 커널에서 다른 프로세스에 영향을 받지 않고 독립적으로 실행되는 프로세스 상태를 의미
- 가상화 환경에서는 각각의 가상머신이 모두 독립적인 운영체제 커널을 가지고 있어야 하기 때문에 그만큼 더 소모해야 하고 성능이 떨어질 수 밖에 없다.
- 컨테이너 가상화 상태에서 동작하는 프로세스보다 가볍고 빠르게 동작한다.
- 컨테이너 : 하나 이상의 목적을 위해 독립적으로 작동하는 프로세스
- 컨테이너 인프라 환경을 구성하면 눈송이 서버(여러 사람이 만져서 설정의 일관성이 떨어진 서버)를 방지하는 데 효과적이다.
모놀리식 아키텍처(Monolithic Architecture)
- 하나의 큰 목적이 있는 서비스 또는 애플리케이션에 여러 기능이 통합돼 있는 구조
- 소프트웨어가 하나의 결합된 코드로 구성되기 때문에 초기단계에서 설계하기 용이하며 개발이 좀 더 단순하고 코드 관리가 간편하다.
- 하지만, 어떤 서비스에서 이뤄진 수정이 연관된 다른 서비스에 영향을 미칠 가능성이 커진다.
- 또한, 서비스가 점점 성장해 기능이 추가될 수록 처음에는 단순했던 서비스 간의 관계가 매우 복잡해질 수 있다.
- 구현된 서비스중 하나가 사용량이 증가해 서버를 증설해야 한다면 그 서비스 때문에 다른 서비스가 포함된 애플리케이션 까지 확장하는 것은 상당히 비효율적이다.
- 특정 서비스를 수정하는 과정에서 예기치 못한 에러가 발생한다면 해당 서비스 외에 전체 서비스를 이용할 수없는 상황이 생길 수도 있다.
위와 같은 문제를 해겨하는 방안으로 마이크로 서비스 아키텍처가 등장했다.
마이크로 서비스 아키텍처(MSA, MicroServices Architecture)
- 시스템 전체가 하나의 목적을 지향하는 바는 모놀리식 아키텍처와 동일하다.
- 보안, 인증과 관련된 기능이 독립된 서비스를 구성하고 있으며 다른 서비스들도 독립적으로 동작할 수 있는 완결된 구조이다.
- 개발된 서비스를 재사용하기 쉽고, 향후 서비스가 변경됐을 때 다른 서비스에 영향을 미칠 가능성이 줄어들며 사용량의 변화에 따라 특정 서비스만 확장 할 수 있다.
- 사용자의 요구사항에 따라 가용성을 즉각적으로 확보해야 하는 IaaS 환경에 적합하다.
- 하지만, 복잡도가 높으며 각 서비스가 서로 유기적으로 통신하는 구조로 설계되기 때문에 네트워크를 통한 호출 횟수가 증가해 성능에 영향을 줄 수 있다.
- 하나의 애플리케이션 안에 포함돼 있던 각각의 서비스가 관련된 기능과 데이터베이스를 독립적으로 가지는 구조
- 각 서비스는 API게이트웨이와 REST API를 이용한 통신방식으로 사용자의 요청을 전달한다.
- 어떤 서비스가 등록돼 있는지 파악하기 위해 서비스 디스커버리를 사용한다.
- 수많은 서비스 내부 통신을 이벤트로 일원화하고 이를 효과적으로 관리하기 위해 별도로 이벤트 버스를 서비스로 구성한다.
- 각 서비스는 필요한 기능이 특화된 데이터베이스를 선택해 개별 서비스에 할당 할 수 있다.
- 각서비스는 독립적으로 동작할 수 있는 완결된 구조라서 이미 개발된 기능이 다른 서비스에 필요하다면 바로 재사용할 수 있다.
컨테이너 인프라 환경에 적합한 아키텍처
- 컨테이너 인프라 환경에서는 컨테이너를 서비스 단위로 포장해 손쉽게 배포하고 확장할 수 있다.
- 컨테이너 인프라환경에서 제공하는 컨테이너는 마이크로서비스 아키텍처의 서비스와 1:1로 완벽하게 대응된다.
컨테이너 인프라 환경을 지원하는 도구
- 컨테이너 인프라 환경은 크게 컨테이너, 컨테이너 관리, 개발환경 구성 및 배포 자동화, 모니터링으로 구성된다.
도커
- 도커는 컨테이너 환경에서 독립적으로 애플리케이션을 실행할 수 있도록 컨테이너를 만들고 관리하는 것을 도와주는 컨테이너 도구이다.
- 도커로 애플리케이션을 실행하면 운영체제 환경에 관계없이 독립적인 환경에서 일관된 결과를 보장한다.
쿠버네티스
- 쿠버네티스는 다수의 컨테이너를 관리하는데 사용한다.
- 컨테이너 인프라에 필요한 기능을 통합하고 관리하는 솔루션
- 컨테이너의 자동배포와 배포된 컨테이너에 대한 동작보증, 부하에 따른 동적확장 등의 기능을 제공한다.
젠킨스
- 지속적 통합(CI) & 지속적 배포(CD)을 지원한다.
- 지속적 통합과 지속적 배포는 개발한 프로그램의 빌드, 테스트, 패키지화, 배포단계를 모두 자동화해 개발단계를 표준화한다.
프로메테우스와 그라파나
- 컨테이너 인프라 환경에서는 많은 종류의 소규모 기능이 각각 나누어 개발되기 때문에 중앙 모니터링이 필요하다.
- 모니터링을 위한 도구
- 프로메테우스는 상태 데이터를 수집하고, 그라파나는 프로메테우스로 수집한 데이터를 관리자가 보기 좋게 시각화한다.
- 프로메테우스와 그라파나는 컨테이너로 패키징돼 동작하며 최소한의 자원으로 쿠버네티스 클러스터의 상태를 시각적으로 표현한다.
테스트 환경 구성하기
코드형 인프라: 코드로 하드웨어를 설정하고 운영체제를 설치하고, 네트워크를 구성하고 개발환경을 구축하는것
테스트 환경을 자동으로 구성하는 도구
버추얼박스
- 운영체제를 게스트 운영체제로 사용할 수 있다.
베이그런트
- 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요할때 시스템을 사용할 수있는 상태로 만들어 준다.(프로비저닝)
putty
- 슈퍼퍼티를 통해 한번에 여러개의 가상머신에 접근가능