PersistentVolume 을 사용한 애플리케이션 데이터 저장

KubernetesBeginner
지금 연습하기

소개

이 랩에서는 Kubernetes 에서 PersistentVolume 을 사용하여 애플리케이션 데이터를 저장하는 방법을 배우게 됩니다.

PersistentVolume (PV) 은 클러스터 내에서 네트워크 스토리지를 나타내는 Kubernetes 리소스입니다. 컨테이너의 라이프사이클과 독립적으로 애플리케이션 데이터를 저장하는 데 사용할 수 있습니다. 즉, 컨테이너가 종료되거나 다른 노드로 이동하더라도 데이터를 보존할 수 있습니다.

이 랩에서는 PersistentVolume 을 생성하고 이를 사용하여 간단한 웹 애플리케이션의 데이터를 저장합니다. 그런 다음 PersistentVolumeClaim (PVC) 을 사용하여 PersistentVolume 에 액세스하도록 애플리케이션을 수정합니다. 마지막으로, 특정 스토리지 리소스를 요청하도록 PVC 를 수정합니다.

Minikube 클러스터 시작

리소스를 생성하기 전에 실행 중인 Kubernetes 클러스터가 필요합니다. Minikube 는 로컬 머신에서 실행되는 가벼운 Kubernetes 환경입니다.

  1. 작업 디렉토리로 이동:

    터미널을 열고 기본 프로젝트 폴더로 이동합니다.

    cd /home/labex/project
  2. Minikube 시작:

    Kubernetes 클러스터를 초기화하기 위해 Minikube 를 시작합니다.

    minikube start
    • 이 명령은 로컬 머신에 단일 노드 Kubernetes 클러스터를 설정합니다.
    • Minikube 는 시스템 성능에 따라 시작하는 데 몇 분 정도 걸릴 수 있습니다.
  3. Minikube 가 실행 중인지 확인:

    Minikube 클러스터의 상태를 확인합니다.

    minikube status
    • kubeletapiserver와 같은 구성 요소가 Running으로 나열되어 있는지 확인합니다.
    • 클러스터가 실행 중이지 않으면 minikube start를 다시 실행합니다.

Minikube 를 시작하는 데 문제가 발생하면 필요에 따라 minikube delete를 사용하여 환경을 재설정하십시오.

PersistentVolume 생성

이 단계에서는 데이터를 저장하는 데 사용할 수 있는 PersistentVolume 을 생성합니다. 다음 내용으로 pv.yaml이라는 YAML 파일을 생성합니다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /mnt/data

이 파일은 1Gi 의 용량과 ReadWriteOnce 액세스 모드를 가진 PersistentVolume 을 생성합니다. hostPath 필드는 데이터가 호스트 머신의 /mnt/data 경로에 저장됨을 지정합니다. persistentVolumeReclaimPolicy 필드는 Retain 으로 설정되어 PersistentVolume 이 삭제되더라도 데이터가 보존됨을 의미합니다.

다음 명령을 사용하여 PersistentVolume 을 클러스터에 적용합니다.

kubectl apply -f pv.yaml

간단한 웹 애플리케이션 배포

이 단계에서는 1 단계에서 생성한 PersistentVolume 에 데이터를 저장하는 간단한 웹 애플리케이션을 배포합니다. 다음 내용으로 web-app.yaml이라는 YAML 파일을 생성합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
        - name: web-app
          image: nginx
          volumeMounts:
            - name: data
              mountPath: /usr/share/nginx/html/data
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: my-pvc

이 파일은 하나의 레플리카와 nginx 이미지를 실행하는 컨테이너를 가진 Deployment 를 생성합니다. volumeMounts 필드는 컨테이너가 PersistentVolume 을 /usr/share/nginx/html/data 경로에 마운트해야 함을 지정합니다. volumes 필드는 컨테이너가 my-pvc라는 PersistentVolumeClaim 을 사용해야 함을 지정합니다.

다음 명령을 사용하여 Deployment 를 클러스터에 적용합니다.

kubectl apply -f web-app.yaml

PersistentVolumeClaim (PVC) 생성

이 단계에서는 1 단계에서 생성한 PersistentVolume 에서 스토리지를 요청하는 데 사용될 PersistentVolumeClaim 을 생성합니다. 다음 내용으로 pvc.yaml이라는 YAML 파일을 생성합니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi

이 파일은 ReadWriteOnce 액세스 모드와 PersistentVolume 에서 500Mi 의 스토리지를 요청하는 PersistentVolumeClaim 을 생성합니다.

다음 명령을 사용하여 PersistentVolumeClaim 을 클러스터에 적용합니다.

kubectl apply -f pvc.yaml

데이터 영속성 확인

이 단계에서는 데이터가 PersistentVolume에 영속적으로 저장되고 있는지 확인합니다. 컨테이너에서 실행 중인 웹 애플리케이션에 액세스하여 PersistentVolume에 일부 데이터를 기록합니다.

먼저 다음 명령을 실행하여 애플리케이션을 실행 중인 파드(pod)의 이름을 찾습니다.

kubectl get pods -l app=web-app

애플리케이션을 실행 중인 단일 파드가 표시되어야 합니다. 파드 이름을 기록해 두십시오.

다음으로, 다음 명령을 실행하여 애플리케이션을 실행 중인 컨테이너에서 셸 세션을 엽니다.

kubectl exec -it /bin/sh pod-name --

pod-name을 이전에 기록한 파드 이름으로 바꾸십시오.

셸 세션에 접속한 후, 다음 명령을 실행하여 test.txt 파일을 추가합니다.

echo "This is a test file." > /usr/share/nginx/html/data/test.txt

이 명령은 PersistentVolume의 데이터 디렉터리에 "This is a test file." 텍스트가 포함된 test.txt 파일을 생성합니다.

다음 명령을 사용하여 웹 애플리케이션을 삭제합니다.

kubectl delete deployment web-app

다음 명령을 사용하여 웹 애플리케이션을 다시 생성합니다.

kubectl apply -f web-app.yaml

데이터 디렉터리에서 생성한 파일이 여전히 존재하는지 다음 명령으로 확인합니다.

kubectl get pods -l app=web-app
kubectl exec pod-name -- cat /usr/share/nginx/html/data/test.txt

pod-name을 이전에 기록한 파드 이름으로 바꾸십시오.

PVC 스토리지 리소스 수정

이 단계에서는 PersistentVolume 에서 특정 스토리지 리소스를 요청하도록 PVC 를 수정합니다. pvc.yaml 파일을 수정하여 500Mi 대신 1Gi 의 스토리지를 요청합니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

마지막 줄의 storageclass 에 allowVolumeExpansion: true 필드를 추가합니다.

kubectl edit storageclass standard
PVC storage modification example

다음 명령을 사용하여 업데이트된 PersistentVolumeClaim 을 클러스터에 적용합니다.

kubectl delete deployment web-app
kubectl delete pvc my-pvc
kubectl apply -f web-app.yaml
kubectl apply -f pvc.yaml

요약

이 랩에서는 Kubernetes 에서 PersistentVolume 을 사용하여 애플리케이션 데이터를 저장하는 방법을 배웠습니다. PersistentVolume 을 생성하고, PersistentVolume 을 사용하는 간단한 웹 애플리케이션을 배포했으며, PersistentVolumeClaim 을 생성하여 PersistentVolume 에서 스토리지를 요청하고, 특정 스토리지 리소스를 요청하도록 PersistentVolumeClaim 을 수정했습니다. 또한 컨테이너가 종료되거나 다른 노드로 이동하더라도 데이터가 PersistentVolume 에 지속적으로 저장되는지 확인했습니다.