[쿠버네티스] - PV, PVC

chancehee·2024년 1월 21일
0

쿠버네티스

목록 보기
15/17
post-thumbnail
post-custom-banner

[ 개요 ]

도커의 컨테이너와 쿠버네티스의 파드에서 다루는 데이터는 일시적이다.
(즉, 컨테이너가 삭제되면 데이터도 삭제된다.)

데이터를 보존하기 위해서는 Volume Mount를 구성하는 방법이 있다.
Volume Mount

쿠버네티스는 PV, PVC라는 두 가지 리소스를 통해, 스토리지가 제공되는 방법에 대한 세부 사항을 추상화하는 API를 제공한다.
PV, PVC

PV, PVC란 무엇인지 개념을 간단하게 학습하고 실습한 결과를 기록한다.

[ PV ]

PV는 쿠버네티스 클러스터 외부 스토리지와 연결을 담당하는 리소스

  • 관리자가 프로비저닝하거나 스토리지 클래스를 사용하여 동적으로 프로비저닝한 클러스터의 스토리지
  • 사용자 및 관리자에게 스토리지 사용 방법에서부터 스토리지가 제공되는 방법에 대한 세부 사항을 추상화하는 API를 제공
  • 컨트롤러 및 파드와 별개의 쿠버네티스 리소스이며, 파드의 생명주기와 별개로 작동

즉, 스토리지 원본에 대한 추상화된 API를 제공하는 녀석이라고 생각하면 될 듯 하다.
스토리지 <-> PV

[ PVC ]

PVC는 PV와 파드를 연결하는 리소스 (PV를 사용하기 위한 리소스)

  • 파드와 비슷하게 파드가 노드 리소스를 사용하는 것처럼, PVC는 PV 리소스를 사용함
  • 클레임은 특정 크기 및 접근 모드를 요청할 수 있다. (ReadWriteOnce, ReadOnlyMany, ReadWriteMany)
  • PVC는 PV가 사용 가능하지 않다면 Pending 상태가 된다. ex) PV 용량 부족, 스토리지 클래스 불일치 등
  • PVC는 사용 가능한 PV를 찾으면 Bound 상태가 된다.

즉, PVC는 PV를 사용하기 위해 요청을 정의하고 파드와 연결을 도와주는 녀석이다.
PV <-> PVC <-> Pod

[ PV, PVC 생명주기 ]

4가지 단계가 있다.
생명주기

  1. 프로비저닝(Provisioning)
  2. 바인딩(Binding)
  3. 사용(Using)
  4. 회수(Reclaiming)

[ 실습 ]

환경 : ubuntu 20.04, k3s
<> : 작성자 요구사항에 맞게 작성

[ PV ]

# 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 ]

# 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

[ Pod 연동 ]

# 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>

참고자료

post-custom-banner

0개의 댓글