[k8s] mariadb pod 생성하기

sue·2022년 9월 19일
0

Kubernetes

목록 보기
4/5
  • 본 가이드에서는 mariadb를 pod로 배포하는 과정을 담았습니다.
  • pod 생성 시 초기 데이터를 입력하는 과정도 포함되어 있습니다.
  • mariadb 데이터 저장을 위해 pv와 pvc 볼륨을 생성한다.

1. PersistentVolume 생성

vi mariadb-pv.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mariadb-pv-volume # pv 이름
  labels:
    type: local
spec:
  storageClassName: mariadb-storage-class
  capacity:
    storage: 50Gi # 스토리지 용량 크기
  accessModes:
    - ReadWriteOnce # 하나의 Pod에서만 access가 가능하도록 설정, ReadWriteMany는 여러 개 노드에서 접근 가능
  hostPath:
    path: "/data/k8s/db/" # node에 저장될 스토리지 공간
$ 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 # pvc 이름
spec:
  storageClassName: mariadb-storage-class
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
$ kubectl create -f mariadb-pvc.yaml

3. Secret 생성

  • mariadb 접속 비밀번호를 정의한 secret.yaml을 생성한다.
  • password에는 base64로 인코딩된 값을 넣어준다. (암호화)
# db 비밀번호를 base64로 인코딩
echo -n {DB_PASSWORD} | base64
vi mariadb-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
  name: mariadb-secret
data:
  password: UGFhUy1UQUAyWSIy # base64로 인코딩 된 pw 값 입력
$ 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 # MariaDB 이미지 
        name: mariadb
        ports:
        - containerPort: 3306 # Container 포트
          name: mariadb
        volumeMounts:
        - name: mariadb-persistent-storage
          mountPath: /docker-entrypoint-initdb.d # 해당 폴더에 .sql 파일 존재 시 Container 생성 시 실행
        - mountPath: /var/lib/mysql # MariaDB 이미지 공식 데이터 저장소 경로
          subPath: "mysql"
          name: mairadb-data
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
           secretKeyRef:
             name: mariadb-secret # Secret의 이름
             key: password # Secret의 data에 들어간 key:value
      volumes:
      - name: mariadb-persistent-storage
        configMap:
          name: mariadb-initdb-config # configMap 설정
      - name: mairadb-data
        persistentVolumeClaim:
          claimName: mariadb-pv-claim # pv 볼륨 설정
$ 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

# mysql -u root -p

# 초기 데이터 생성 확인
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

참고

profile
All is well ! 🔥

0개의 댓글