Skip to main content

05A. MySQL 스테이트풀셋 생성하기

About 2 minKubernetescrashcoursedigitaloceankubernetesminkubekubctl

05A. MySQL 스테이트풀셋 생성하기 관련

목차

언제나 최신 Kubernetes

Unit 5. Spring Boot와 MySQL 실행하기

언제나 최신 Kubernetes

먼저 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







 



<FontIcon icon="iconfont icon-k8s"/>이 생성된 것을 볼 수 있습니다.
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)
exit
#
# Bye
# sh-4.2# 
exit
# 
# exit
# pod "mysql-client" deleted

이찬희 (MarkiiimarK)
Never Stop Learning.