[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. 확장성과 비용
- 클라우드 네이티브 애플리케이션을 설계할 때 애플리케이션을 어떻게 확장할 것인지만 생각할 뿐만 아니라 가장 비용 효율적인 방법도 생각해야 함