- 본 가이드에서는 mariadb를 pod로 배포하는 과정을 담았습니다.
- pod 생성 시 초기 데이터를 입력하는 과정도 포함되어 있습니다.
- mariadb 데이터 저장을 위해 pv와 pvc 볼륨을 생성한다.
1. PersistentVolume 생성
vi mariadb-pv.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mariadb-pv-volume
labels:
type: local
spec:
storageClassName: mariadb-storage-class
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/data/k8s/db/"
$ kubectl create -f mariadb-pv.yaml
hostPath
- hostPath volume 타입
- node의 로컬 디스크 경로를 pod에서 마운트해서 사용
- hostpath 설정 시 pod가 배포되는 node 경로에 db 데이터 저장
- pod가 삭제되더라도 hostPath에 있는 파일들은 삭제되지 않고 다른 pod가 hostPath를 마운트하게 되면 남아 있는 파일에 access 가능
- 참고
2. PersistentVolumeClaim 생성
vi mariadb-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mariadb-pv-claim
spec:
storageClassName: mariadb-storage-class
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
$ kubectl create -f mariadb-pvc.yaml
3. Secret 생성
- mariadb 접속 비밀번호를 정의한 secret.yaml을 생성한다.
- password에는 base64로 인코딩된 값을 넣어준다. (암호화)
echo -n {DB_PASSWORD} | base64
vi mariadb-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
name: mariadb-secret
data:
password: UGFhUy1UQUAyWSIy
$ kubectl create -f mariadb-secret.yaml
4. configMap 생성
- mariadb pod 생성 시 초기 데이터를 입력해 준다.
vi mariadb-configmap.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mariadb-initdb-config
data:
init.sql: |
CREATE DATABASE IF NOT EXISTS mydata;
USE mydata;
CREATE TABLE friends (id INT, name VARCHAR(256), age INT, gender VARCHAR(3));
INSERT INTO friends VALUES (1, 'Abhijeet', 32, 'm');
INSERT INTO friends VALUES (2, 'Anjali', 29, 'f');
INSERT INTO friends VALUES (3, 'Aayush', 27, 'm');
$ kubectl create -f mariadb-configmap.yaml
5. service 생성
vi mariadb-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
name: mariadb
spec:
ports:
- port: 3306
selector:
app: mariadb
$ kubectl create -f mariadb-svc.yaml
6. deployment 생성
vi mariadb-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mariadb
spec:
selector:
matchLabels:
app: mariadb
strategy:
type: Recreate
template:
metadata:
labels:
app: mariadb
spec:
containers:
- image: mariadb:10.7
name: mariadb
ports:
- containerPort: 3306
name: mariadb
volumeMounts:
- name: mariadb-persistent-storage
mountPath: /docker-entrypoint-initdb.d
- mountPath: /var/lib/mysql
subPath: "mysql"
name: mairadb-data
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
volumes:
- name: mariadb-persistent-storage
configMap:
name: mariadb-initdb-config
- name: mairadb-data
persistentVolumeClaim:
claimName: mariadb-pv-claim
$ kubectl create -f mariadb-deployment.yaml
subPath
- volumeMount는 기본적으로 그 폴더를 덮어씌우기 때문에 기존 파일이 있을 시 파일이 사라지게 된다.
- 빈 폴더에 mount 설정 시 문제가 없지만 그렇지 않으면 파일이 날아가는 일이 발생한다.
- subPath를 지정하게 되면 기존 파일은 유지하면서 subPath 하위에 새로운 파일이 저장된다.
- 단, mountPath와 subPath는 이름은 동일하게 작성해야 한다.
- 참고
$ kubectl get pods -l app=mariadb
NAME READY STATUS RESTARTS AGE
mariadb-7bbcc5574f-4wgzm 1/1 Running 0 71m
7. mariadb 접속
$ kubectl exec -it mariadb-7bbcc5574f-4wgzm -- bash
MariaDB [(none)]> SHOW databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydata |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.000 sec)
Database changed
MariaDB [mydata]> SHOW tables;
+------------------+
| Tables_in_mydata |
+------------------+
| friends |
+------------------+
1 row in set (0.000 sec)
MariaDB [mydata]> select * from friends;
+------+----------+------+--------+
| id | name | age | gender |
+------+----------+------+--------+
| 1 | Abhijeet | 32 | m |
| 2 | Anjali | 29 | f |
| 3 | Aayush | 27 | m |
+------+----------+------+--------+
3 rows in set (0.001 sec)
8. 다른 pod에서 mariadb 접속하기
- 아래 명령어 실행 시 10.7 버전의 mariadb pod를 생성하여 기존에 생성한 mariadb pod에 접속하게 된다.
- pod에서 빠져나올 시 만들어진 pod는 자동으로 삭제된다.
$ kubectl run -it --rm --image=mariadb:10.7 --restart=Never mariadb-client -- mysql -h 10.233.89.123 -p{DB+PASSWORD}
If you don't see a command prompt, try pressing enter.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydata |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.000 sec)
MariaDB [(none)]> exit
Bye
pod "mariadb-client" deleted
참고