[Cloud] 클라우드 네이티브 애플리케이션 설계시 고려할 항목

[Cloud] 클라우드 네이티브 애플리케이션 설계시 고려할 항목


Cloud Architecture

1. 운영 효율성

  • 애플리케이션을 실행하고, 모니터링 방법을 고려하고, 설계를 시작할 때부터 전체 과정에 걸쳐 개선해나가는 것

1.1. 모든 것을 자동화

  • 클라우드 자동화는 Infrastructure as Code와 함께 사용됨
    • 전체 환경 관리가 코드로 정의되므로 환경 준비와 애플리케이션을 배포하는 동안 에러를 최소화할 수 있음
    • e.g., Azure Resource Manager, AWS CloudFormation, Terraform, …
  • 에러 최소화
  • 소스 코드 제어 시스템으로 환경 변화를 추적 가능
  • 동일한 방법으로 새로운 환경에 빠르게 확장 가능
  • 환경을 어떻게 준비하는지에 대한 자동화 뿐만 아니라 애플리케이션의 전체 배포 과정을 자동화해야 함

1.2. 모든 것을 모니터링

  • 모니터링을 통해 애플리케이션과 환경뿐만 아니라 애플리케이션을 어떻게 사용하는지 알 수 있음
  • 모니터링 데이터를 기반으로 운영 비용, 성능, 애플리케이션 기능 개선 가능
  • 전체 스택에 걸친 일관된 모니터링 필요
    • 서비스를 호스팅하는 인프라부터 애플리케이션의 특징과 기능까지 모든 방법을 사용해 모니터링

1.3. 모든 것을 문서화

  • 일반적으로 클라우드 네이티브 앱은 많은 팀이 함께 개발하므로(예: MSA 등), 특히 문서화가 더욱 중요
  • 모든 팀 구성원은 다른 팀이 만든 서비스를 어떻게 사용해야 하는지, 환경을 어떻게 정의하고 구성하는지 등을 이해해야 함
  • 문서화는 자동화되어 있어야 함
    • 예: API를 문서화하는 Open API Swagger 활용

1.4. 변화는 점진적으로

  • 환경과 애플리케이션을 동시에 변경할 때는 점진적으로 진행해야 하며 변경했더라도 롤백할 수 있어야 함
  • IaC를 이용했을 때 장점 중 하나
    • 환경 명세와 정의는 소스 제어 저장소에 있어 변경 사항을 쉽게 롤백

1.5. 장애 대비

  • 애플리케이션에 장애가 발생하지 않도록 설계해야 할 뿐만 아니라 장애 발생시 대처도 생각해야 함
  • 장애를 시뮬레이션하는 것을 도와주는 테스팅 프레임워크를 활용해 장애 대비

2. 보안

  • 클라우드 환경이 온프레미스보다 안전하다는 것이 일반화 되었지만, 애플리케이션 보안에 신경을 써야함
  • 클라우드 네이티브 아키텍처는 많은 구성 요소로 이뤄져 있어 심층 방어 개념이 제일 적합하다고 증명됨
    • 심층 방어: 아키텍처 전반에 보안 장치가 구현된 방법

2.1. 소스 코드

  • 보안 코드 저장소 사용 여부와 저장소 접근을 추적하고 감사하는지 확인 필요
  • 특히 리눅스 컨테이너를 사용한다면 커널 취약점 공격을 확인

2.2. 컨테이너 이미지

  • 베이스 이미지에는 필요한 것들만 추가
  • 필요한 포트만 노출하는지 확인

2.3. 컨테이너 저장소

  • 누가 저장소에 접근했는지 역할 기반 접근 제어(Role-Based Access Control, RBAC)를 이용해 추적 및 감사

2.4. Pod

  • 인증된 저장소에서만 컨테이너 이미지를 다운로드 할 수 있는지 확인
  • 쿠버네티스에서는 이런 정책을 구현하기 위한 정책 컨트롤러를 사용 가능
  • Pod가 ID를 가지고 있어 Pod 내 코드가 다른 서비스에 안전한 방법으로 접근할 수 있는지 확인
  • 클러스터 내 서비스 간 상호작용도 보안을 적용할 필요가 있는지 고려

2.5. 클러스터와 오케스트레이터

  • 오케스트레이터를 호스팅 중인 클러스터에 인터넷으로 접근하는 게 필요한지, VPN이 적절한지 등을 결정 필요
  • 컨트롤 플레인에는 보안 접근이 필요하며 감사 로그도 켜야 함
  • 노드와 네임스페이스 사이의 상호작용 경로에 보안을 위한 네트워크 정책을 사용 가능
  • 쿠버네티스 RBAC가 켜져 있는지 확인

3. 신뢰성과 가용성

  • 신뢰성 (Reliability): 애플리케이션 장애가 발생해도 여전히 작동을 신뢰할 수 있다는 것
    • 애플리케이션이 장애를 극복할 수 있도록 설계해야 함
    • MSA는 각 서비스가 독립되어 있고 장애 시에도 전체 애플리케이션이 다운되지 않는다는 점에서 이런 것을 고려할 때 도움을 줄 수 있음
  • 가용성 (Availability): 일정 시간 동안 이용 가능하다는 것
    • 서비스는 전체 시스템의 가용성을 높이기 위해 수평적 확장을 고려해야 함

4. 확장성과 비용

  • 클라우드 네이티브 애플리케이션을 설계할 때 애플리케이션을 어떻게 확장할 것인지만 생각할 뿐만 아니라 가장 비용 효율적인 방법도 생각해야 함
© 2024 Seungwon Bae 🇰🇷