도커의 컨테이너와 쿠버네티스의 파드에서 다루는 데이터는 일시적이다.
(즉, 컨테이너가 삭제되면 데이터도 삭제된다.)
데이터를 보존하기 위해서는 Volume Mount를 구성하는 방법이 있다.
Volume Mount
쿠버네티스는 PV, PVC라는 두 가지 리소스를 통해, 스토리지가 제공되는 방법에 대한 세부 사항을 추상화하는 API를 제공한다.
PV, PVC
PV, PVC란 무엇인지 개념을 간단하게 학습하고 실습한 결과를 기록한다.
PV는 쿠버네티스 클러스터 외부 스토리지와 연결을 담당하는 리소스
즉, 스토리지 원본에 대한 추상화된 API를 제공하는 녀석이라고 생각하면 될 듯 하다.
스토리지 <-> PV
PVC는 PV와 파드를 연결하는 리소스 (PV를 사용하기 위한 리소스)
Pending
상태가 된다. ex) PV 용량 부족, 스토리지 클래스 불일치 등Bound
상태가 된다.즉, PVC는 PV를 사용하기 위해 요청을 정의하고 파드와 연결을 도와주는 녀석이다.
PV <-> PVC
<-> Pod
4가지 단계가 있다.
생명주기
환경 : ubuntu 20.04, k3s
<> : 작성자 요구사항에 맞게 작성
# pv-definition.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: <mysql-pv>
spec:
capacity:
storage: <20Gi>
accessModes:
- ReadWriteMany # 3가지 옵션 중 선택 (ReadWriteMany, ReadOnlyMany, ReadWriteOnce)
storageClassName: <mysql>
hostPath: # 실제 운영환경에서는 권장 안함. (외부 스토리지 연동 권장)
path: <"커스텀 경로">
persistentVolumeReclaimPolicy: Retain # 3가지 옵션 중 선택 (Retain, Delete, Recycle)
kubectl apply -f pv-definition.yml
kubectl get pv
kubectl describe pv
# pvc-definition.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: <mysql-pvc>
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: <20Gi> # PV에서 정의한 용량을 초과하면 안됨.
storageClassName: <mysql> # PV에서 정의한 이름과 일치시킨다.
kubectl apply -f pvc-definition.yml
kubectl get pvc
kubectl describe pvc
# mysql-dp.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: <mysql-dp>
spec:
selector:
matchLabels:
app: <mysql>
template:
metadata:
labels:
app: <mysql>
spec:
containers:
- image: mysql # 최신 버전 사용함.
name: <mysql>
env:
- name: MYSQL_DATABASE
value: <"데이터베이스 이름">
- name: MYSQL_ROOT_PASSWORD
value: <"비밀번호">
volumeMounts:
- name: <mysql-persistent-storage> # volume name과 일치해야 함.
mountPath: /var/lib/mysql # mysql에서 사용하는 경로
volumes:
- name: <mysql-persistent-storage>
persistentVolumeClaim:
claimName: <mysql-pvc> # PVC name과 일치해야 함.
---
apiVersion: v1
kind: Service
metadata:
name: <mysql-svc>
spec:
ports:
- port: <포트번호>
selector:
app: <mysql>