Post

[Kubernetes] 3-tier 웹 어플리케이션 배포(VM)

이번 포스팅에서는 Kubernetes에서 3-tier 웹 애플리케이션을 VM(Virtual Machine)을 통해 배포하고 관리하는 방법을 살펴보겠습니다. 3-tier 웹 애플리케이션은 프론트엔드, 백엔드, 그리고 데이터베이스로 구성된 구조로, 이 포스팅에서는 NodePort Service, ClusterIP Service, Spring Boot 백엔드, MySQL 데이터베이스 설정을 다룹니다.

1. 프로젝트 시나리오

이 프로젝트에서는 아래와 같은 구조로 애플리케이션을 구성합니다.

  1. 프론트엔드 (NodePort Service): 외부 접속을 위해 NodePort를 통해 외부에 노출됩니다.
  2. 백엔드 (ClusterIP Service): 프론트엔드에서만 접근 가능한 내부 서비스로, Spring Boot 애플리케이션이 실행됩니다.
  3. 데이터베이스 (ClusterIP Service): MySQL 데이터베이스는 백엔드와만 연결되며, 외부로 노출되지 않습니다.

기본 시나리오

  • 외부 트래픽은 NodePort Service를 통해 프론트엔드에 접속합니다.
  • 프론트엔드는 ClusterIP Service를 통해 백엔드(Spring Boot)와 통신합니다.
  • 백엔드는 ClusterIP Service를 통해 데이터베이스(MySQL)에 데이터를 저장하고, 이를 처리합니다.

이 모든 작업은 default 네임스페이스에서 진행되며, 구성요소는 각각의 YAML 파일을 통해 관리됩니다.

2. 실습 단계

2.1 Docker Compose 파일을 Kubernetes로 변환

먼저, Docker Compose 파일을 Kubernetes YAML 파일로 변환하는 작업을 수행합니다. 이를 위해 kompose 도구를 사용합니다.

kompose 설치

1
2
3
4
5
bash

curl -L https://github.com/kubernetes/kompose/releases/download/v1.31.2/kompose-linux-amd64 -o kompose
chmod +x kompose
sudo mv ./kompose /usr/local/bin/kompose

Docker Compose 파일 변환

1
2
3
4
bash

cd ~/LABs/3tier
kompose convert

이 명령어는 Docker Compose 파일을 Kubernetes에 맞는 YAML 파일로 변환합니다. 변환 후 생성된 파일 목록은 다음과 같습니다:

  • mydiary-back-service.yaml
  • mydiary-db-service.yaml
  • mydiary-front-service.yaml
  • mydiary-back-deployment.yaml
  • mydiary-db-deployment.yaml
  • mydiary-front-deployment.yaml

네트워크 폴리시 관련 파일은 삭제하고, 각 서비스 및 배포 파일을 수정합니다.

2.2 YAML 파일 수정

프론트엔드 서비스 설정 (NodePort)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
yaml

apiVersion: v1
kind: Service
metadata:
  name: mydiary-front
spec:
  type: NodePort
  ports:
    - name: "3000"
      port: 3000
      targetPort: 3000
      nodePort: 30009
  selector:
    app: mydiary-front

백엔드 서비스 및 배포 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
yaml

apiVersion: v1
kind: Service
metadata:
  name: mydiary-back
spec:
  ports:
    - name: "8080"
      port: 8080
      targetPort: 8080
  selector:
    app: mydiary-back
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mydiary-back
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mydiary-back
  template:
    metadata:
      labels:
        app: mydiary-back
    spec:
      containers:
        - name: mydiary-back
          image: dbgurum/mydiary-back:1.0
          env:
            - name: SPRING_DATASOURCE_URL
              value: jdbc:mysql://mydiary-db:3306/paperdb?serverTimezone=Asia/Seoul
            - name: SPRING_DATASOURCE_USERNAME
              value: user
            - name: SPRING_DATASOURCE_PASSWORD
              value: pass123

데이터베이스 서비스 및 배포 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
yaml

apiVersion: v1
kind: Service
metadata:
  name: mydiary-db
spec:
  ports:
    - name: "3306"
      port: 3306
      targetPort: 3306
  selector:
    app: mydiary-db
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mydiary-db
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mydiary-db
  template:
    metadata:
      labels:
        app: mydiary-db
    spec:
      containers:
        - name: mydiary-db
          image: mysql:5.7-debian
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: pass123
            - name: MYSQL_DATABASE
              value: paperdb

2.3 Kubernetes 리소스 적용

모든 YAML 파일을 한 번에 적용하려면 다음 명령어를 사용합니다.

1
2
3
bash

kubectl apply -f ~/LABs/3tier/

리소스 상태 확인

1
2
3
bash

kubectl get deploy,po,svc -o wide | grep mydiary

위 명령어로 배포, Pod, 서비스 상태를 확인할 수 있습니다. 처음에는 백엔드와 프론트엔드 서버가 시간이 걸려 실행되지만, 약 1분 정도 후에 모든 서비스가 정상적으로 Running 상태가 됩니다.

2.4 로그 확인 및 테스트

Spring Boot 백엔드 로그 확인

1
2
3
bash

kubectl logs -f mydiary-back-f77cb94cf-lc8dz

백엔드 서버의 로그를 실시간으로 확인하여 요청과 응답이 제대로 이루어지는지 확인할 수 있습니다.

프론트엔드 접속

NodePort를 통해 외부에서 프론트엔드 애플리케이션에 접속할 수 있습니다. 아래 URL을 통해 프론트엔드 페이지에 접근합니다.

http://192.168.56.101:30009/

데이터베이스 접속 및 데이터 확인

1
2
3
4
bash

kubectl exec -it mydiary-db-7c5cdcfbdc-bzhtj -- bash
mysql -uroot -p

MySQL에 접속한 후, 데이터베이스에 저장된 데이터를 확인합니다.

1
2
3
4
sql

use paperdb;
select * from paper;

위 명령어를 통해 게시판에 입력된 데이터를 조회할 수 있습니다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.