지속적 통합(CI) 

여러 사람이 작업하는 코드들의 동기를 맞출 목적으로 지속적 통합이 필요하다. 이러한 지속적 통합을 마이크로 서비스에 어떻게 매핑할 것인가.

마이크로 서비스에서는 하나의 서비스를 변경해서 다른 것과 독립적으로 배포할수 있기를 원한다. 책에서는 3가지 방법을 소개하는데 첫번째는 모든 마이크로 서비스를 위해 통으로 묶어 단일 저장소와 CI빌드를 사용하는 것. 두번째는 첫번째 방법의 변형으로 모든 코드를 포함하는 단일 소스 트리를 두고 다수의 CI빌드가 소스 트리의 부분들과 매핑되도록 하는 것. 즉 독립된 빌드와 매핑된 서브 디렉토리를 가진 단일 저장소가 있는 것이다. 세번째는 마이크로서비스당 하나의 코드 저장소와 CI빌드를 사용하는 것이다. 

지속적 배포(CD)

빌드 파이프라인이란 빌드 내에 여러 다른 단계를 두어 각 단계를 완료하면서 소프트웨어 과정을 추적하면서 품질을 높힐 수 있는 방법이다. 소프트웨어의 생산 경로 전체를 모델링함으로써 소프트웨어 품질의 가시성을 크게 향상시키고 개선할 주요 사안인 빌드 및 릴리즈 프로세스를 한 곳에서 볼 수 있다.

마이크로서비스 역시 CI와 마찬가지로 서비스 하나당 하나의 파이프라인을 갖을 필요가 있다.

산출물

루비의 gem 자바의 jar,war 파이선의 egg같은 산출물은 특정 기술 스택에 한정되어 있어 여러 기술이 혼용될 때 배포가 어렵기 때문에 운영체제에 네이티브한 산물물을 생성하는 것이 좋다. 장점으로는 배포의 관점에서 하부 기술에 신경 쓰지 않아도 되지만 처음 패키지를 생성할 떄 어려움이 있고 다른 운영 체제에 배포할 때 문제가 될 수 있다. 

커스텀이미지

자동화된 구성 관리 시스템은 머신 상에서 스크립트 실행 소요시간이 관건이다. 이를 줄이기 위한 한가지 방법은 공통적으로 의존하는 것들을 주입한 가상 머신 이미지를 만드는 것이다. 가상화 플랫폼을 이용하여 자체 이미지를 만들어 낸다면 배포시 이 커스텀 이미지의 인스턴스를 가동시킨 후 서비스의 최신 버전을 설치하기만 하면 된다. 이미지를 한 번만 빌드하기 때문에 이미지의 복제본을 연속 실행시킬 때 그것들을 설치하는 시간이 필요 없어 시간 절약에 도움이 된다. 단점으로는 이미지 자체의 생성 시간이 오래 걸릴 수 있고 생성된 이미지가 매우 클 수 있다. 이러한 단점을 회피할 수 있는 컨테이너 기술은 도커가 있다.

서비스와 환경구성과 호스트 매핑 

소프트웨어가 CD파이프라인 단계를 거치면서 다양한 종류의 환경에 배포되기 때문에 환경 구성이 종요하다. 환경마다 바뀌어야 하는 환경 구성은 전적으로 최소화 되어야 한다. 서비스의 환경마다 바뀌어야 하는 환경구성이 있다면 배포 프로세스의 일부로서 이를 어떻게 관리해야 할까? 먼저 환경당 하나의 산출물을 빌드하고 환경 구성을 그 산출물에 포함시킬 수 있는데 이는 실환경에서의 검증을 보장할 수 없으며 이 산출물들을 빌드하기 위해 추가시간이 소요되고 빌드시간에 어떤 환경이 존재야 하는지 알아야 한다. 민감한 환경구성 데이터를 어떻게 다룰 것인가도 문제다. 더 나은 방법으로는 단일 산출물을 생성하여 환경 구성을 분리해서 관리하는 것이다. 대규모 마이크로 서비스에서는 환경 구성을 제공하는 전용 시스템을 사용하는것이 바람직하다.

서비스를 설치하고 실행하는 운영 체제 단위인 호스트에 얼마나 많은 서비스르 넣을 것인지 생각해야 한다. 호스트당 다수의 서비스를 매핑하거나, 여러개로 분리된 서비스나 어플리케이션이 하나의 호스트 상의 어플리케이션 컨테이너에 상주하는 모델이 있다. 이는 자원 부족을 최적화 하기 위한 시도이다. 또한 호스트당 단일 서비스를 갖을 수 도 있다. 단일 호스트보다 더 높은 수준의 추상화 대상ㅇ에서 작업하는 서비스로서의 플랫폼이 있다.(PaaS) - ex 헤로쿠

자동화

자동화는 생산성을 유지할 수 있는 탁월한 비결이다. 개발자들에게 그들이 담당하는 개별 서비스 또는 서비스 그룹을 셀프 프로비저닝할 수 있어야 하고 자동화를 가능하게 하는 기술을 잘 선택해야 한다. 

많은 수의 호스트를 관리하는 데 사용하는 핵심 수단중 하나는 기존 물리 머신을 더 작은 부분으로 묶어야 하는데 VMWare이나 AWS와 같은 전통적인 가상화는 호스트 관리의 부담을 줄이는 데 엄청난 해택을 주었지만 주목해야할 새로운 기술은 베이그런트와 리눅스컨테이너, 도커이다.

배포인터페이스 

우리의 산출물과 하부 플랫폼이 무엇이든 간에 특정 서비스를 배포하는데 일관된 인터페이스를 유지하는 것이 필수이다. 어떤 배포도 실행시킬 수 있는 가장 타당한 방법은 매개 변수 전달이 가능한 한 줄의 명령행이다. CI도구로 실행되는 스크립트로 또는 직접 입력하여 시작할 수 있다. 책에서 스크립트를 제공한다.



+ Recent posts