05A. MySQL 스테이트풀셋 생성하기
05A. 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
그럼 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