[Kubernetes] 3-tier 웹 어플리케이션 배포(VM)
이번 포스팅에서는 Kubernetes에서 3-tier 웹 애플리케이션을 VM(Virtual Machine)을 통해 배포하고 관리하는 방법을 살펴보겠습니다. 3-tier 웹 애플리케이션은 프론트엔드, 백엔드, 그리고 데이터베이스로 구성된 구조로, 이 포스팅에서는 NodePort Service, ClusterIP Service, Spring Boot 백엔드, MySQL 데이터베이스 설정을 다룹니다.
1. 프로젝트 시나리오
이 프로젝트에서는 아래와 같은 구조로 애플리케이션을 구성합니다.
- 프론트엔드 (NodePort Service): 외부 접속을 위해 NodePort를 통해 외부에 노출됩니다.
- 백엔드 (ClusterIP Service): 프론트엔드에서만 접근 가능한 내부 서비스로, Spring Boot 애플리케이션이 실행됩니다.
- 데이터베이스 (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;
위 명령어를 통해 게시판에 입력된 데이터를 조회할 수 있습니다.
Comments powered by Disqus.