게으름을 위한 부지런한 게으름뱅리' 블로그

[K8S] K8S에서 공용 Data 사용하기 (PV와 PVC yaml 예시) 본문

IT/K8S

[K8S] K8S에서 공용 Data 사용하기 (PV와 PVC yaml 예시)

LazismLee 2024. 7. 1. 22:08
반응형

 

  • PV와 PVC 정의: PV는 스토리지를 나타내며, PVC는 해당 스토리지에 대한 요청을 나타냅니다.
  • 공용 스토리지 클래스: 모든 Pod에서 공유할 수 있도록 공용 스토리지 클래스를 설정할 수 있습니다.
  • Access Mode 설정: PV를 설정할 때, 여러 Pod에서 동시에 읽기/쓰기 권한을 필요로 할 경우 ReadWriteMany Access Mode를 사용할 수 있습니다.

기본 예시)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: shared-pv  # PersistentVolume의 이름
spec:
  capacity:
    storage: 5Gi  # 할당된 스토리지 용량
  volumeMode: Filesystem  # 볼륨 모드, 파일 시스템으로 설정
  accessModes:
    - ReadWriteMany  # 볼륨에 대한 액세스 모드 설정, 여러 파드가 읽고 쓸 수 있음
  persistentVolumeReclaimPolicy: Retain  # PV 삭제 시 재사용 가능하도록 유지
  storageClassName: shared-storage-class  # 사용할 스토리지 클래스 이름
  hostPath:
    path: /data/shared  # 호스트의 경로, 이 경로의 파일 시스템이 PV로 마운트됨

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: shared-pvc  # PersistentVolumeClaim의 이름
spec:
  accessModes:
    - ReadWriteMany  # PVC에 대한 액세스 모드 설정, 여러 파드가 읽고 쓸 수 있음
  resources:
    requests:
      storage: 5Gi  # 요청한 스토리지 용량
  storageClassName: shared-storage-class  # 사용할 스토리지 클래스 이름

 

장점

 

  • 추상화: PV와 PVC는 스토리지를 Pod에서 추상화하여, Pod의 실제 스토리지 및 클러스터 환경과 분리시킵니다.
  • 동적 프로비저닝: PVC를 통해 필요에 따라 자동으로 스토리지를 프로비저닝할 수 있습니다. 이는 관리를 단순화하고 효율성을 높입니다.
  • 다양한 백엔드 지원: 다양한 스토리지 백엔드를 지원하므로 클라우드 제공업체의 스토리지, 로컬 디스크, 네트워크 스토리지 등을 유연하게 사용할 수 있습니다.
  • 재사용 및 재사용: PV는 재사용할 수 있으며, PVC는 여러 Pod에 재사용할 수 있어 리소스의 효율성을 높입니다.
  • Access Mode 제어: PV와 PVC를 설정하여 ReadWriteOnce, ReadOnlyMany, ReadWriteMany 등 다양한 Access Mode를 지원하여 다양한 스토리지 사용 시나리오에 대응할 수 있습니다.

 

단점

 

  • 복잡성: PV와 PVC를 설정하고 관리하는 것은 초기 설정에서 일정한 복잡성을 동반할 수 있습니다. 특히, 클러스터 스토리지 구성이 복잡한 경우 관리가 어려울 수 있습니다.
  • 스토리지 클래스 필요: PV를 정의할 때 스토리지 클래스를 지정해야 하며, 이는 클러스터에서 지원되는 스토리지 백엔드에 따라 다를 수 있습니다. 이로 인해 특정 스토리지 백엔드에 종속될 수 있습니다.
  • 동적 프로비저닝 오버헤드: 동적 프로비저닝을 사용할 경우 프로비저닝된 스토리지 리소스가 클러스터에서 사용되지 않을 때까지 비용이 발생할 수 있습니다.
  • 볼륨 관리의 복잡성: 다수의 PV와 PVC를 관리하고 연결하는 것은 볼륨 관리의 복잡성을 증가시킬 수 있습니다. 특히, 여러 애플리케이션과 다양한 스토리지 사용 시나리오에서 관리가 복잡해질 수 있습니다.

예시 1 공유 NFS 스토리지 사용하기

NFS(Network File System)를 사용하여 여러 파드가 공유 스토리지에 접근하는 방법을 보여줍니다.

 

1. PV 정의 (shared-nfs-pv.yaml)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: shared-nfs-pv  # PersistentVolume의 이름
spec:
  capacity:
    storage: 10Gi  # 할당된 스토리지 용량
  accessModes:
    - ReadWriteMany  # 볼륨에 대한 액세스 모드 설정, 여러 파드가 읽고 쓸 수 있음
  nfs:
    server: nfs-server-ip-address  # NFS 서버의 IP 주소
    path: /exports/shared-data  # NFS 서버에서 공유되는 경로

 

 

 

2. PVC 정의 (shared-nfs-pvc.yaml)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: shared-nfs-pvc  # PersistentVolumeClaim의 이름
spec:
  accessModes:
    - ReadWriteMany  # PVC에 대한 액세스 모드 설정, 여러 파드가 읽고 쓸 수 있음
  resources:
    requests:
      storage: 10Gi  # 요청한 스토리지 용량
  volumeName: shared-nfs-pv  # PVC가 바인드할 PersistentVolume의 이름

 

3. Pod에서 PVC 사용 (pod-using-nfs.yaml)

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod  # Pod의 이름
spec:
  containers:
    - name: nginx-container  # 컨테이너의 이름
      image: nginx  # 사용할 컨테이너 이미지
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"  # 컨테이너 내에서 볼륨을 마운트할 경로
          name: shared-nfs-volume  # 볼륨의 이름
  volumes:
    - name: shared-nfs-volume  # 볼륨의 이름
      persistentVolumeClaim:
        claimName: shared-nfs-pvc  # Pod에서 사용할 PersistentVolumeClaim의 이름

 

예시 2: StatefulSet을 사용한 공유 스토리지 사용하기

StatefulSet을 사용하여 각각의 Pod에 고유한 PV를 할당하고, 이 PV를 공유 스토리지로 사용하는 방법을 보여줍니다.

 

1.StatefulSet 정의 (statefulset-shared-storage.yaml)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web  # StatefulSet의 이름
spec:
  serviceName: "nginx"  # StatefulSet에 의해 생성된 Headless Service의 이름
  replicas: 3  # Replica 수, 즉 Pod의 개수
  selector:
    matchLabels:
      app: nginx  # Pod를 선택할 Label Selector
  template:
    metadata:
      labels:
        app: nginx  # Pod의 Label
    spec:
      containers:
        - name: nginx  # 컨테이너 이름
          image: nginx  # 사용할 컨테이너 이미지
          volumeMounts:
            - name: shared-storage  # 마운트할 볼륨의 이름
              mountPath: /usr/share/nginx/html  # 컨테이너 내에서 볼륨을 마운트할 경로
  volumeClaimTemplates:
    - metadata:
        name: shared-storage  # PVC 템플릿의 이름
      spec:
        accessModes: [ "ReadWriteMany" ]  # PVC의 액세스 모드 설정, 여러 파드가 읽고 쓸 수 있음
        resources:
          requests:
            storage: 5Gi  # 요청한 스토리지 용량

 

2. StatefulSet에 배포된 Pod에서 공유 스토리지 사용하기

StatefulSet을 생성하면 각 Pod에 고유한 PVC가 생성되며, 이 PVC를 통해 공유 스토리지를 마운트할 수 있습니다.

 

예시 3: 공유 스토리지 클래스를 이용한 PV와 PVC 사용하기

공유 스토리지 클래스를 정의하고, 이를 사용하여 여러 파드에서 공유 스토리지에 접근하는 방법을 보여줍니다.

 

1.스토리지 클래스 정의 (shared-storage-class.yaml)

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: shared-storage-class  # StorageClass의 이름
provisioner: kubernetes.io/aws-ebs  # PV를 생성할 때 사용할 프로비저너 이름, AWS EBS를 사용한다는 의미
parameters:
  type: gp2  # 생성할 PV의 유형 설정, 여기서는 gp2(EBS의 General Purpose SSD)를 사용
  fsType: ext4  # PV에 마운트될 파일 시스템 타입 설정, 여기서는 ext4를 사용

 

2. PV와 PVC 정의 (shared-pv-and-pvc.yaml)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: shared-pv  # PersistentVolume의 이름
spec:
  capacity:
    storage: 5Gi  # 할당된 스토리지 용량
  volumeMode: Filesystem  # 볼륨 모드, 파일 시스템으로 설정
  accessModes:
    - ReadWriteMany  # 볼륨에 대한 액세스 모드 설정, 여러 파드가 읽고 쓸 수 있음
  persistentVolumeReclaimPolicy: Retain  # PV 삭제 시 재사용 가능하도록 유지
  storageClassName: shared-storage-class  # 사용할 스토리지 클래스 이름
  awsElasticBlockStore:
    volumeID: <aws-volume-id>  # AWS Elastic Block Store(EBS) 볼륨의 ID
    fsType: ext4  # PV에 마운트될 파일 시스템 타입 설정

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: shared-pvc  # PersistentVolumeClaim의 이름
spec:
  accessModes:
    - ReadWriteMany  # PVC에 대한 액세스 모드 설정, 여러 파드가 읽고 쓸 수 있음
  resources:
    requests:
      storage: 5Gi  # 요청한 스토리지 용량
  storageClassName: shared-storage-class  # 사용할 스토리지 클래스 이름

 

3. Pod에서 PVC 사용 (pod-using-shared-pvc.yaml)

apiVersion: v1
kind: Pod
metadata:
  name: webapp  # Pod의 이름
spec:
  containers:
    - name: webapp  # 컨테이너의 이름
      image: nginx  # 사용할 컨테이너 이미지
      volumeMounts:
        - mountPath: "/data"  # 컨테이너 내에서 볼륨을 마운트할 경로
          name: shared-storage  # 볼륨의 이름
  volumes:
    - name: shared-storage  # 볼륨의 이름
      persistentVolumeClaim:
        claimName: shared-pvc  # Pod에서 사용할 PersistentVolumeClaim의 이름

 

이 세 가지 예시는 각기 다른 방법으로 PVs와 PVCs를 사용하여 Kubernetes 환경에서 공유 스토리지를 다루는 방법을 보여줍니다. 각 예시는 특정 상황이나 요구 사항에 맞게 선택하여 적용할 수 있습니다.

반응형
Comments