💡 핵심 개념
- IaaS(Infrastructure as a Service) 필요에 따라 인프라를 선택하고 조합하여 사용하는 서비스
- 애자일(Agile) 개발 방법론 짧은 주기를 통해 프로토타입을 만들고 개선하며 목표에 접근
- 컨테이너(Container) 운영체제 커널에서 독립적으로 실행되는 프로세스 상태, 가상화보다 가볍고 빠름
개념 | 설명 | 예시 |
---|---|---|
IaaS | 클라우드를 통해 필요한 인프라를 서비스 형태로 제공, 사용량에 따라 비용 지불 | AWS, Azure, GCP 등에서 필요한 만큼의 VM, 스토리지, 네트워크 사용 |
애자일 | 짧은 주기(스프린트)로 반복적 개발과 테스트, 지속적 피드백 반영 | 2주 단위 스프린트로 프로토타입 개발, 사용자 피드백 반영하여 개선 |
컨테이너 | 애플리케이션과 실행환경을 포함한 독립적 실행환경, 호스트 OS 커널 공유로 자원 효율적 | Docker를 사용해 앱과 라이브러리, 설정 파일을 패키지로 배포 |
장점 | 단점 |
---|---|
초기 개발이 간단 | ❌ 유지보수 어려움: 코드 복잡성 증가로 버그 수정, 기능 추가 어려움 |
배포가 용이 | ❌ 확장성 부족: 특정 기능 사용량 증가 시 전체 앱 확장 필요 |
작은 프로젝트에 적합 | ❌ 기술 혁신 어려움: 새로운 기술 도입 시 전체 시스템 변경 가능성 |
❌ 장애 위험 증가: 한 부분의 오류가 전체 서비스에 영향 |
웹툰에 트래픽이 몰리는 등 기능에 문제 발생 시 전체 서비스에 영향을 미칠 수 있음
장점 | 단점 |
---|---|
✅ 독립적 개발/배포/확장: 각 서비스는 다른 서비스에 영향 없이 개발, 배포, 확장 가능 | ❌ 복잡성 증가: 서비스 간 통신 관리 복잡 |
✅ 장애 격리: 특정 서비스 문제가 다른 서비스에 영향을 미치지 않음 | ❌ 데이터 일관성: 서비스 간 데이터 일관성 유지 어려움 |
✅ 기술 다양성: 각 서비스에 적합한 기술 선택 가능 | ❌ 모니터링/관리 복잡성: 전체 시스템의 모니터링 및 관리 복잡 |
사용자 서비스, 상품 서비스, 주문 서비스, 결제 서비스, 배송 서비스로 분리하여 독립적으로 개발, 배포, 확장
결론.... 마이크로서비스는 필요하다!
일관성
개발자가 로컬에서 작업한 내용이 그대로 테스트 서버와 실제 운영 환경에서도 동일하게 동작하므로, "내 컴퓨터에서는 잘 돌아가는데..."라는 말은 더 이상 듣지 않아도 됩니다.
효율성과 생산성
도커는 가상 머신에 비해 훨씬 가볍고 빠른 성능을 자랑합니다. 이는 애플리케이션의 배포와 확장을 더욱 효율적으로 만들어줍니다. 개발자들은 이러한 특성 덕분에 새로운 기능을 빠르게 테스트하고 배포할 수 있어 생산성이 크게 향상됩니다.
격리
도커의 컨테이너 기술은 각 애플리케이션을 독립적인 환경에서 실행할 수 있게 해줍니다. 이는 한 애플리케이션의 문제가 다른 애플리케이션에 영향을 미치지 않도록 보장하며, 전체 시스템의 안정성과 보안성을 높여줍니다.
FROM node:16
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
# 이미지 빌드
docker build -t my-node-app .
# 컨테이너 실행
docker run -p 3000:3000 my-node-app
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
pipeline {
agent any
stages {
stage('소스 코드 가져오기') {
steps {
git 'https://github.com/user/repo.git'
}
}
stage('빌드') {
steps {
sh 'mvn clean package'
}
}
stage('테스트') {
steps {
sh 'mvn test'
}
}
stage('배포') {
steps {
sh 'docker build -t myapp .'
sh 'docker run -d -p 8080:8080 myapp'
}
}
}
}
scrape_configs:
- job_name: 'kubernetes-service'
static_configs:
- targets: ['localhost:9090']
labels:
job: 'kubernetes-service'
kubernetes_namespace: 'default'
https://yumserv.tistory.com/475
업타임쿠마라는 것도 있는데 참고하시길 ~
graph TD
A[컨테이너 인프라 환경] --> B[Docker: 컨테이너 생성 및 관리]
A --> C[Kubernetes: 컨테이너 관리 및 자동 배포]
A --> D[Jenkins: 지속적 통합 및 배포]
A --> E[Prometheus & Grafana: 모니터링]
A --> F[코드형 인프라: Vagrant, VirtualBox]
sudo apt-get update && sudo apt-get install docker.io
docker pull nginx
docker run -d -p 80:80 nginx
kubectl apply -f deployment.yaml
항목 | 모놀리식 아키텍처 | 마이크로서비스 아키텍처 |
---|---|---|
구조 | 하나의 큰 애플리케이션 | 작은 독립 서비스들의 집합 |
배포 | 전체 애플리케이션 배포 | 개별 서비스 단위 배포 |
확장성 | 전체 애플리케이션 확장 필요 | 필요한 서비스만 선택적 확장 가능 |
개발 | 초기 개발 간단 | 초기 설계 복잡하지만 장기적으로 유연 |
장애 영향 | 전체 서비스에 영향 | 해당 서비스에만 영향 |
기술 스택 | 단일 기술 스택 | 서비스별 최적 기술 선택 가능 |
컨테이너 적합성 | 낮음 | 높음 (1:1 매핑 효율적) |
적합 프로젝트 | 소규모, 단순 프로젝트 | 복잡하고 확장 가능성 높은 프로젝트 |
도구 | 주요 역할 | 핵심 기능 |
---|---|---|
Docker | 컨테이너 생성 및 관리 | • 애플리케이션 패키징 • 일관된 환경 제공 • 이미지 빌드 및 공유 |
Kubernetes | 컨테이너 오케스트레이션 | • 자동 배포 및 확장 • 부하 분산 • 자동 복구 • 롤링 업데이트 |
Jenkins | CI/CD 자동화 | • 지속적 통합 • 지속적 배포 • 파이프라인 관리 |
Prometheus | 모니터링 데이터 수집 | • 메트릭 수집 • 알림 설정 • 데이터 쿼리 |
Grafana | 데이터 시각화 | • 대시보드 생성 • 시각적 모니터링 • 다양한 차트 제공 |