이재홍의 언제나 최신 Kubernetes - Unit 5. Spring Boot와 MySQL 실행하기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

Spring Boot와 MySQL 실행하기

이재홍 http://www.pyrasis.com

지금까지 Nginx 웹 서버로 기본 웹페이지만 띄워보았습니다. 이번에는 Spring Boot와 MySQL을 쿠버네티스 클러스터에서 실행해보겠습니다.

MySQL 스테이트풀셋 생성하기

먼저 MySQL 스테이트풀셋을 생성합니다. 그런데 스테이트풀셋과 지금까지 사용했던 디플로이먼트는 어떤 차이점이 있을까요? 이름 그대로 스테이트풀셋은 상태를 가지고 있고, 디플로이먼트는 상태를 가지고 있지 않습니다(stateless). 따라서 스테이트풀셋은 퍼시스턴트 볼륨 클레임(pvc)을 통해 퍼시스턴트 볼륨(pv)을 생성하여 데이터를 저장하고 유지합니다.

다음 내용을 mysql-statefulset.yaml 파일로 저장합니다.

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 파일로 저장합니다.

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이 생성된 것을 볼 수 있습니다.

그림 5-1 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 공유는 허용합니다.

Published

2022-10-22