DevOps/k8s

Kubernetes에서 MySQL과 연동하여 볼륨(Persistent Volume) 사용하기

딩코딩 2025. 2. 6. 22:34

쿠버네티스(Kubernetes)에서 MySQL을 배포할 때, 데이터를 지속적으로 유지하려면 Persistent Volume (PV) 및 **Persistent Volume Claim (PVC)**를 활용해야 합니다. 이 글에서는 MySQL을 쿠버네티스에서 운영하면서 볼륨을 연동하는 방법을 설명합니다.


1. Persistent Volume (PV) 생성

PV는 클러스터 내에서 사용할 수 있는 스토리지 자원을 정의하는 객체입니다. MySQL 데이터를 유지하기 위해 PV를 생성합니다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: mysql-storage
  hostPath:
    path: "/mnt/data"
  • storage: 10Gi (10GB 크기의 볼륨)
  • accessModes: ReadWriteOnce (하나의 노드에서 읽기/쓰기 가능)
  • persistentVolumeReclaimPolicy: Retain (삭제 후에도 데이터 유지)
  • hostPath: "/mnt/data" (노드의 경로에 데이터를 저장)

2. Persistent Volume Claim (PVC) 생성

PVC는 애플리케이션이 PV를 요청하는 객체입니다. PVC를 생성하여 MySQL Pod에서 사용할 수 있도록 설정합니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: mysql-storage
  • storageClassName: mysql-storage (PV와 매칭되는 Storage Class 지정)
  • accessModes: ReadWriteOnce (하나의 노드에서 접근 가능)
  • requests.storage: 10Gi (요청하는 스토리지 크기)

3. MySQL Deployment 및 Service 생성

PVC를 MySQL Pod에서 사용할 수 있도록 DeploymentService를 생성합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.7
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "rootpassword"
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pvc
  • image: mysql:5.7 (MySQL 5.7 이미지 사용)
  • MYSQL_ROOT_PASSWORD: "rootpassword" (루트 비밀번호 설정)
  • volumeMounts: /var/lib/mysql에 PVC를 마운트하여 데이터 보존
  • volumes: mysql-pvc와 연결

MySQL Service 생성

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: ClusterIP
  ports:
    - port: 3306
      targetPort: 3306
  selector:
    app: mysql
  • ClusterIP 서비스로 설정하여 외부에서 직접 접근할 수 없도록 제한합니다.
  • 내부에서 MySQL에 접근하려면 kubectl port-forward를 활용해야 합니다.
kubectl port-forward svc/mysql 3306:3306

이제 로컬 머신에서 다음 명령으로 MySQL에 접근할 수 있습니다.

mysql -h 127.0.0.1 -P 3306 -u root -p

또한 원격 클러스터에서 접근하려면 SSH 터널링을 사용할 수 있습니다.

ssh -L 3306:localhost:3306 user@your-remote-cluster

이렇게 하면 로컬에서 원격 클러스터의 MySQL에 접속할 수 있습니다.


4. 배포 및 확인

이제 위의 YAML 파일들을 적용하여 MySQL을 쿠버네티스 클러스터에 배포합니다.

kubectl apply -f mysql-pv.yaml
kubectl apply -f mysql-pvc.yaml
kubectl apply -f mysql-deployment.yaml
kubectl apply -f mysql-service.yaml

배포된 MySQL Pod 확인:

kubectl get pods

MySQL 볼륨 상태 확인:

kubectl get pv
kubectl get pvc

MySQL 컨테이너에 접속하여 데이터가 유지되는지 확인:

kubectl exec -it <mysql-pod-name> -- mysql -u root -p

비밀번호를 입력하고 MySQL이 정상적으로 동작하는지 확인하면 됩니다.

 

5. 결론

쿠버네티스에서 MySQL과 볼륨(PV & PVC)을 연동하면, Pod가 재시작되어도 데이터를 유지할 수 있습니다.