Skip to content

5. 클라우드 네이티브에 대하여

Haesong Lee edited this page May 8, 2024 · 1 revision

image

1. 클라우드 네이티브란?

클라우드 네이티브(Cloud Native)란 넓은 의미로 클라우드 컴퓨팅의 장점을 최대한 활용할 수 있도록 애플리케이션을 개발하고 운영하는 방법론입니다.

클라우드 구축 후 기존 인프라에 만든 애플리케이션을 그대로 적용하는 것이 아닌, 처음부터 클라우드 환경을 고려해 애플리케이션을 만드는 기술과 방법들을 포괄하는 개념입니다.

‘Cloud Native’라는 용어는 2015년, 리눅스에서 처음 사용했는데요. CNCF(Cloud Native Computing Foundation) 재단을 만들어 클라우드 네이티브로 전환할 수 있는 오픈소스 기술들을 추진/관리하고 있습니다.

CNCF에서 정의하는 클라우드 네이티브

클라우드 네이티브 기술은 조직이 퍼블릭, 프라이빗, 그리고 하이브리드 클라우드와 같은 현대적이고 동적인 환경에서 확장 가능한 애플리케이션을 개발하고 실행할 수 있게 해준다. 컨테이너, 서비스 메쉬, 마이크로서비스, 불변(Immutable) 인프라, 그리고 선언형(Declarative) API가 이러한 접근 방식의 예시들이다. 이 기술은 회복성, 관리 편의성, 가시성을 갖춘 느슨하게 결합된 시스템을 가능하게 한다. 견고한 자동화 기능을 함께 사용하면, 엔지니어는 영향이 큰 변경을 최소한의 노력으로 자주, 예측 가능하게 수행할 수 있다. 출처: [CNCF Cloud Native Definition v1.0]

2. 리프트 앤 시프트 방식과의 차이

리프트 앤 시프트는 기존 온프레미스 환경에서 사용되는 애플리케이션을 구조적인 변경 없이 그대로 클라우드로 옮기는 접근 방식입니다. 이에 반해 클라우드 네이티브는 애플리케이션을 클라우드 환경에서 최적화되어 동작하도록 처음부터 새롭게 설계하거나 재구성하는 개념입니다. 클라우드 네이티브 방식은 클라우드의 모든 기능을 활용해 더 높은 효율성과 유연성을 제공합니다.

3. 왜 중요할까요?

클라우드 네이티브의 중요성은 변화하는 비즈니스 환경에 빠르게 적응하고, 리소스를 효율적으로 관리할 수 있다는 점에 있습니다. 이는 시장 변화에 민첩하게 대응하고 혁신을 가속화하는 데 큰 도움이 됩니다.

클라우드 네이티브 주요 구성 요소 4가지

image

1. 마이크로서비스 아키텍처

마이크로서비스 아키텍처(MicroService Architecture, MSA)는 애플리케이션을 독립적인 작은 기능들로 분해하여 구축하는 기술입니다. image

2. 컨테이너 기술

컨테이너 기술은 마이크로서비스 방법론으로 개발한 애플리케이션을 효과적으로 배포·활용할 수 있는 기술입니다. 가상화 기술 중 하나로, 시스템을 가상화하는 것이 아닌 애플리케이션을 구동할 수 있는 컴퓨팅 작업을 패키징하여 가상화한 것입니다.

image

3.DevOps

DevOps는 Development(개발)와 Operation(운영)을 합친 말로, 개발자와 엔지니어의 협업을 강조하는 개발 문화를 의미합니다. 개발과 운영 간의 프로세스를 통합하여 개발에서 배포에 이르는 프로세스의 속도를 높이는 데 초점이 맞춰져 있습니다. DevOps는 개발에서 운영까지를 하나의 파이프라인으로 형성하여 배포가 필요할 때 즉시 반영되는 게 목표입니다. 이를 위해 개발, 테스트, 릴리즈, 운영 등 모든 업무를 한 팀에서 유기적으로 진행하여 의사소통과 의사결정을 위한 시간과 비용을 절감합니다. 또한 원하는 시점에 즉시 서비스를 배포할 수 있어 비즈니스 변화에 빠르게 대응할 수 있습니다.

image

4. CI/CD

CI(Continuous Integration)/CD(Continuous Delivery)는 지속적인 통합과 배포를 통해 애플리케이션 개발 단계를 자동화하여 고객에게 더욱 짧은 주기로 서비스 제공하고 개선하는 방법입니다. image

CI/CD는 DevOps 문화를 성공적으로 구축하기 위해 필요한 요건 중 하나로 개발과 운영 간 업무 속도를 향상하는 데에 기여합니다. 고도화된 CI/CD 구축 시, 다운타임 없이 실행 중인 애플리케이션에 대한 변경 사항을 배포하고, 비즈니스 민첩성, 소프트웨어 품질 및 고객 반응성 등을 신속하게 개선할 수 있습니다.

지속적인 통합(Continous Intergration) 애플리케이션 코드의 새로운 변경 사항이 정기적으로 빌드 및 테스트를 거쳐 공유 리포지토리에 병합되는 것

지속적인 배포(Continuous Delivery) 애플리케이션에 적용한 변경 사항이 버그 테스트를 거쳐 리포지토리에 자동으로 업로드되는 것

4. 클라우드 네이티브 도입 효과

클라우드 네이티브를 통해 구축된 애플리케이션은 클라우드 컴퓨팅을 활용하도록 설계되어 빠른 속도와 유연성을 가지면서 애플리케이션 배포 위험은 낮습니다. 끊임없이 새로운 애플리케이션이 등장하고 비즈니스 요구사항도 빠르게 변화하는 디지털 시장에 맞춰, 혁신적인 서비스를 신속하게 개발하고 배포할 수 있는 것인데요.

이처럼 클라우드 네이티브의 접근 방식으로 시스템을 설계 및 구축하면 고객 요구 사항 같은 작은 변화뿐만 아니라 기술 발전, 시대 변화와 같은 큰 변화에도 대응할 수 있습니다. 빠르게 변화하는 비즈니스 요구에 신속하고 유연하게 대응함으로써 경쟁 우위를 확보하고, IT 서비스의 목표를 비용 절감에서 비즈니스 성장 엔진으로 바꿀 수 있습니다.

또한 IT 운영을 자동화함으로써 운영 효율성을 높일 수 있습니다. Acornsoft의 자료에 따르면, 컨테이너 기술과 DevOps 운영 방식을 이용했을 때, 개발부터 테스트 검증, 운영까지 애플리케이션 배포 속도가 160% 향상한다고 합니다. 서버 자원 사용량은 80% 감소하고 서비스 롤백/장애 복구 시간도 1/3로 줄어들며, 개발과 테스트, 운영 담당자 간 커뮤니케이션 비용은 70% 줄어드는 것으로 나타났습니다.

출처: Acornsoft, Cocktail Cloud Use Cases White Paper, 2018

5. 클라우드 네이티브 애플리케이션

The Twelve-Factor App

클라우드 네이티브를 이해하기 위해서는 먼저 클라우드 환경에서 실행하는 SaaS(Software as a Service) 애플리케이션의 특징을 알아야 합니다. 잘 만들어진 SaaS 애플리케이션은 아래의 특징을 가지고 있습니다.

 • 설정 자동화 절차를 체계화하여(Declarative) 새로운 개발자가 프로젝트에 참여하는 데 드는 시간과 비용을 최소화합니다.

 • 운영체제에 따라 달라지는 부분을 명확히 하고 실행 환경 사이의 이식성을 극대화합니다.

 • 최근 등장한 클라우드 플랫폼에 적합하고 서버와 시스템의 관리가 필요 없습니다.

 • 개발 환경과 운영 환경의 차이를 최소화하고 민첩성을 극대화하면서 지속적인 배포가 가능합니다.

 • 툴, 아키텍처 및 개발 방식을 크게 바꾸지 않고 확장할 수 있습니다(Scale Up).

잘 만들어진 SaaS 애플리케이션은 손쉬운 확장이 가능해야 합니다. 이와 같은 애플리케이션을 만들기 위해 웹 애플리케이션 개발 PaaS 사업자인 Heroku의 엔지니어들은 Twelve-Factor App이라는 SaaS 앱 개발 방법론을 정의했습니다. 이를 기반으로 개발하면 시간이 지나면서 앱이 유기적으로 성장할 수 있습니다. Twelve-Factor App의 주요 내용은 다음과 같습니다.

1. 코드베이스: 버전 관리되는 하나의 코드베이스와 다양한 배포
애플리케이션당 하나의 코드베이스만 존재하고 이를 CI/CD(Continuous Integration/Continuous Delivery)를 통해서 다양한 환경(개발, 테스트, 운영)에 배포합니다.

2. 종속성: 명시적으로 선언되고 분리된 종속성
Maven과 같은 종속성 관리 도구를 사용합니다.

3. 설정: 환경(environment)에 저장된 설정
설정과 코드를 명시적으로 분리하여 실행 환경에 맞는 설정으로 유연하게 변경이 가능하게 합니다.

4. 백엔드 서비스: 백엔드 서비스를 연결된 리소스로 취급
네트워크를 통해서 사용하는 외부의 서비스를 리소스로 간주합니다. 설정 시스템에 저장된 값을 읽어 해당 리소스에 접근합니다.

5. 빌드, 릴리즈, 실행: 철저하게 분리한 빌드와 실행 단계
CI/CD를 통해서 빌드와 릴리즈 단계를 분리합니다.

6. 프로세스: 애플리케이션을 하나 또는 여러 개의 무상태(stateless) 프로세스로 실행
클라우드에서 연산은 상태(State)가 없어야 합니다.

7. 포트 바인딩: 포트 바인딩을 사용해서 서비스 공개
앱은 독립적이어야 합니다. 실행 환경에 대한 런타임 인젝션에 의존하지 않습니다. 각 서비스는 HTTP 환경으로 제공되며 API를 통해서만 접근합니다. 데이터는 공유하지 않습니다.

8. 동시성: 프로세스 모델을 사용한 확장
확장과 자원 사용량 개선을 위해서 각 서비스와 함수는 독립적이고 수평적으로 동작합니다.

9. 폐기 가능: 빠른 시작과 그레이스풀 셧다운(Graceful shutdown)을 통한 안정성 극대화
개별 프로세스들은 쉽게 종료할 수 있고 빠르게 시작할 수 있습니다.

10. 개발/프로덕션환경 일치: 개발, 스테이징, 프로덕션 환경을 최대한 비슷하게 유지
각각의 환경 차이를 줄임으로써 지속적인 배포가 가능하도록 지원합니다.

11. 로그: 로그를 이벤트 스트림으로 취급
분산 시스템에서 로그를 관리하는 것은 중요합니다. 개별 앱은 이를 관리하지 않고 외부 시스템으로 전달하기만 합니다.

12. Admin 프로세스: admin/maintenance 작업을 일회성 프로세스로 실행
관리를 위한 코드와 작업을 분리하지 않고 동일한 환경에서 배포, 실행합니다.

물론 이런 규칙이 클라우드 네이티브 애플리케이션과 완전히 일치하지는 않습니다. 이후로도 계속해서 개발, 발전되었기 때문입니다. 그럼에도 불구하고 이는 클라우드 네이티브의 기반이 되는 원칙으로 여전히 고려해야 할 요소인 것은 분명합니다.

스프링 클라우드에서 위의 요소들을 어떻게 지원하고, 어떤 제품을 연계하여 사용할 수 있는지는 다음에 이어서 설명하겠습니다. 오늘은 클라우드 네이티브만 맛보기!

읽으면 좋을만한 아티클

- spring cloud 와 클라우드 네이티브