순서


<aside>

  1. nodejs를 docker image로 생성
  2. image를 ecr에 업로드하여 eks node에게 전달
  3. k8s service.yaml에서 LB로 지정
  4. 설정된 LB를 route53 A record에 지정 </aside>

구축


<aside>

Node.js 기반 애플리케이션 Docker → Kubernetes → Route 53 배포 보고서


1. Docker 이미지 빌드 및 테스트

1.1 Node.js 애플리케이션 코드 작성

index.js 파일에 간단한 웹 서버 코드를 작성하였음. 이 서버는 Express를 사용하였으며, 기본 경로 /로 HTTP 요청이 들어오면 HTML 메시지를 반환하도록 설정하였음.

코드는 아래와 같음:

javascript
복사편집
const express = require('express');
const app = express();
const PORT = 3000;

app.get('/', (req, res) => {
  res.send('<h1>Welcome to My Node.js Server!</h1><p>This is served from a Node.js container.</p>');
});

app.listen(PORT, () => {
  console.log(`Server is running on <http://localhost>:${PORT}`);
});

1.2 의존성 관리 설정

Node.js 프로젝트의 의존성을 관리하기 위해 package.json 파일을 작성하였음. 이 파일에는 express 라이브러리를 포함하였음.

package.json 파일의 내용은 아래와 같음:

json
복사편집
{
  "name": "my-nodejs-app",
  "version": "1.0.0",
  "description": "A simple Node.js web server",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.18.2"
  }
}

1.3 Dockerfile 작성

Node.js 애플리케이션을 Docker 컨테이너에서 실행하기 위해 Dockerfile을 작성하였음.

작성된 Dockerfile은 아래와 같음:

dockerfile
복사편집
FROM node:16
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

1.4 Docker 이미지 빌드 및 테스트

Dockerfile을 사용하여 Docker 이미지를 빌드하였음. 명령어는 다음과 같음:

bash
복사편집
docker build -t my-nodejs-app:latest .

로컬에서 Docker 컨테이너를 실행하고, 정상 작동 여부를 확인하였음:

bash
복사편집
docker run -p 3000:3000 my-nodejs-app:latest

브라우저에서 http://localhost:3000에 접속하여 정상적으로 메시지가 출력됨을 확인하였음.


2. Docker 이미지 ECR 업로드

2.1 ECR 리포지토리 생성

AWS CLI를 사용하여 ECR 리포지토리를 생성하였음:

bash
복사편집
aws ecr create-repository --repository-name my-nodejs-app --region ap-northeast-2

2.2 ECR 로그인

AWS CLI를 통해 ECR 레지스트리에 인증을 수행하였음:

bash
복사편집
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <your-account-id>.dkr.ecr.ap-northeast-2.amazonaws.com

2.3 Docker 이미지 태그 설정 및 업로드

ECR 레지스트리에 이미지를 업로드하기 위해 태그를 설정하고 이미지를 푸시하였음:

bash
복사편집
docker tag my-nodejs-app:latest <your-account-id>.dkr.ecr.ap-northeast-2.amazonaws.com/my-nodejs-app:latest
docker push <your-account-id>.dkr.ecr.ap-northeast-2.amazonaws.com/my-nodejs-app:latest


3. Kubernetes에 배포

3.1 Deployment 및 Service 파일 작성

Node.js 애플리케이션을 Kubernetes 클러스터에 배포하기 위해 deployment.yamlservice.yaml 파일을 작성하였음.

Deployment 파일:

yaml
복사편집
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nodejs-app
  labels:
    app: my-nodejs-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-nodejs-app
  template:
    metadata:
      labels:
        app: my-nodejs-app
    spec:
      containers:
      - name: my-nodejs-app
        image: <your-account-id>.dkr.ecr.ap-northeast-2.amazonaws.com/my-nodejs-app:latest
        ports:
        - containerPort: 3000

Service 파일:

yaml
복사편집
apiVersion: v1
kind: Service
metadata:
  name: my-nodejs-app-service
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 3000
  selector:
    app: my-nodejs-app

3.2 Kubernetes 클러스터에 배포

작성한 YAML 파일을 Kubernetes 클러스터에 적용하였음:

bash
복사편집
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

3.3 LoadBalancer 확인

kubectl get services 명령을 통해 생성된 LoadBalancer의 EXTERNAL-IP를 확인하였음.

브라우저를 통해 확인한 결과, Node.js 서버가 정상적으로 작동함을 확인하였음.


4. Route 53을 통한 도메인 연결

4.1 Route 53 설정

AWS Route 53에서 Hosted Zone을 생성하거나 기존 도메인을 사용하였음.

4.2 A 레코드 추가

LoadBalancer의 EXTERNAL-IP를 Route 53 도메인의 A 레코드로 추가하였음:

4.3 도메인 테스트

Route 53 도메인을 브라우저에서 확인하였으며, 정상적으로 Node.js 애플리케이션이 작동하는 것을 확인하였음.

</aside>