- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
Spring Boot와 MySQL 실행하기
지금까지 Nginx 웹 서버로 기본 웹페이지만 띄워보았습니다. 이번에는 Spring Boot와 MySQL을 쿠버네티스 클러스터에서 실행해보겠습니다.
MySQL 스테이트풀셋 생성하기
먼저 MySQL 스테이트풀셋을 생성합니다. 그런데 스테이트풀셋과 지금까지 사용했던 디플로이먼트는 어떤 차이점이 있을까요? 이름 그대로 스테이트풀셋은 상태를 가지고 있고, 디플로이먼트는 상태를 가지고 있지 않습니다(stateless). 따라서 스테이트풀셋은 퍼시스턴트 볼륨 클레임(pvc)을 통해 퍼시스턴트 볼륨(pv)을 생성하여 데이터를 저장하고 유지합니다.
다음 내용을 mysql-statefulset.yaml
파일로 저장합니다.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mysql
image: mysql:5.7
ports:
- protocol: TCP
containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: examplepassword
- name: MYSQL_DATABASE
value: example
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
storageClassName: standard
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
다음 명령을 실행하여 mysql-statefulset.yaml
파일로 스테이트풀셋을 생성합니다.
$ kubectl create -f mysql-statefulset.yaml
statefulset.apps/mysql created
kubectl get all
명령으로 오브젝트 목록을 출력해봅니다.
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/mysql-0 1/1 Running 0 11s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d20h
NAME READY AGE
statefulset.apps/mysql 1/1 12s
statefulset.apps/mysql
이 생성된 것을 볼 수 있습니다. 특히 스테이트풀셋은 레플리카셋을 생성하지 않으며, 파드의 이름이 랜덤하지 않고 mysql-0처럼 0부터 순차적으로 증가합니다.
이제 서비스를 생성해보겠습니다. 다음 내용을 mysql-service.yaml
파일로 저장합니다.
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
clusterIP: None
selector:
app: mysql
ports:
- protocol: TCP
port: 3306
다음 명령을 실행하여 mysql-service.yaml
파일로 서비스를 생성합니다.
$ kubectl create -f mysql-service.yaml
service/mysql created
kubectl get all
명령으로 오브젝트 목록을 출력해봅니다.
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/mysql-0 1/1 Running 0 21m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d20h
service/mysql ClusterIP None <none> 3306/TCP 97s
NAME READY AGE
statefulset.apps/mysql 1/1 21m
service/mysql
이 생성된 것을 볼 수 있습니다.
그럼 MySQL 데이터베이스가 정상적으로 동작하는지 체크해보겠습니다.
kubectl run -it --rm mysql-client --image=mysql:5.7 --restart=Never -- sh
로 mysql 클라이언트 파드를 생성합니다. 그리고 mysql -h mysql -u root -p
를 실행한 뒤 Enter password:가 나오면 examplepassword
를 입력하여 MySQL 데이터베이스에 로그인합니다. show databases;
를 입력하여 데이터베이스 목록을 출력해봅니다. 이상이 없으면 exit
, exit
를 입력하여 빠져나옵니다.
$ kubectl run -it --rm mysql-client --image=mysql:5.7 --restart=Never -- sh
If you don't see a command prompt, try pressing enter.
sh-4.2# mysql -h mysql -u root -p
Enter password: examplepassword
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.40 MySQL Community Server (GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| example |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.01 sec)
mysql> exit
Bye
sh-4.2# exit
exit
pod "mysql-client" deleted
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.