새소식

AWS/EKS

[EKS Study 3주차] EKS Storage

  • -

CloudNet@ 팀의 가시다님께서 Leading 하시는 AEWS Study 3주차 스터디 내용 정리

이번 포스팅에서는 EKS Storage 에 대한 개념을 알아보겠습니다.

 

1. kubernetes storage

 

kubernetes (k8s) Pod 의 데이터는 기본적으로 Stateless 입니다.
k8s는 Pod 삭제 시 Pod 내의 데이터도 함께 소멸되는 시스템입니다.

 

하지만, Stateful 한 Application 을 배포하기 위해서는 데이터 지속성이 보장되어야합니다.

다음은 데이터 지속성을 보장하기 위한 스토리지 요구 사항입니다.

  1. 스토리지는 Pod 수명 주기에 의존해서는 안된다.
  2. 스토리지는 Kubernetes 클러스터의 모든 Pod 및 Node 에서 사용할 수 있어야 한다.
  3. 스토리지는 충돌이나 애플리케이션 오류에 관계없이 가용성이 높아야 한다.

 

1.1. Storage 유형

 

Kubernetes Storage 는 다음과 같이 분류할 수 있습니다.

  1. emptyDir
  2. hostPath
  3. PV/PVC

 

3가지 스토리지 타입에 대한 테스트와 개념은 아래 포스팅에서 확인하실 수 있습니다.

 

[PKOS Study 2주차] Kubernetes Storage ( emptyDir, hostPath, PV/PVC )

CloudNet@ 팀의 가시다님께서 Leading 하시는 PKOS 2기 Study 내용 요약 해당 Kubernetes Study 는 '24단계 실습으로 정복하는 쿠버네티스' 책을 기반으로 진행 중입니다. 이번 포스팅에서는 쿠버네티스의 Stora

kimalarm.tistory.com

 

이번 포스팅에서는 PV 와 PVC 에 대해 더 자세히 알아볼 예정입니다.

 

1.2. Persistent Volume(PV)

 

PV 를 사용하면 애플리케이션, 컨테이너, Pod, Node 의 수명주기에 관계없이 데이터를 지속적으로 사용할 수 있습니다.

 

PV 설정 시 설정 가능한 Access Mode

a. ReadWriteOnce: 볼륨은 동시에 하나의 노드에서만 읽기/쓰기를 허용
b. ReadOnlyMany: 볼륨은 동시에 여러 노드에서 읽기 전용 모드를 허용
c. ReadWriteMany: 볼륨은 동시에 여러 노드에서 읽기/쓰기를 허용

 

PV Reclaim Policy

a. Retain: Node 종료시, PV 볼륨 보존
b. Delete: Node 종료시, PV 볼륨 삭제

 

 

1.3. Persistent Volume Claims(PVC)

 

PV 가 실제 스토리지 볼륨을 나타낸다면, PVC 는 스토리지 볼륨을 사용하기 위한 요청 문서입니다.

PV 는 직접 Pod 에 마운트 할 수 없고, PVC 를 통해 명시적으로 요청되어야 합니다.
또한, PV는 하나의 PVC에만 연결될 수 있습니다.

 

2. CSI Driver

 

CSI (Container Storage Interface) Driver 는 k8s 에서 다양한 스토리지 솔루션을 쉽게 사용할 수 있도록 해줍니다.
AWS 에서는 EBS, EFS 등의 CSI Driver 를 제공하고 있습니다.

 

3. hostPath vs Local Path Provisioner(PV)

 

hostPathLocal Path Provisioner모두 Node 의 디렉토리 공간을 사용한다는 공통점이 있습니다.

하지만 큰 차이점이 하나 있습니다.
hostPath 는 외부에서 확인이 불가능하고, local-path-provisioner 는 pv 와 pvc 를 통해 배포된 상태를 파악할 수 있다는 것입니다.

 

다음과 같이 Node의 각 디렉토리를 사용하는 리소스를 배포해봅니다.

 

3.1. hostPath

 

hostPath 를 사용하는 Pod 배포

cat << EOT > web-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
  name: weblog
spec:
  volumes:
  - name : host-path
    hostPath:
      path: /data
      type: Directory
  containers:
  - image: nginx:1.17
    name: weblog
    volumeMounts:
    - name: host-path
      mountPath: /var/log/nginx
EOT

 

kubectl apply -f web-hostpath.yaml

 

hostPath 확인

kubectl describe pod weblog | grep Volumes: -A4

 

 

3.2. Local Path Provisioner (PV)

 

Storage Class 배포

curl -s -O https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
kubectl apply -f local-path-storage.yaml

 

PV 배포

cat << EOT > local-pv.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: localpath-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: "local-path"
EOT

 

kubectl apply -f local-pv.yaml

 

PVC 배포

cat << EOT > local-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  terminationGracePeriodSeconds: 3
  containers:
  - name: app
    image: centos
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: localpath-claim
EOT

 

kubectl apply -f local-pvc.yaml

 

PV, PVC 확인

kubectl get pv,pvc

 

 

실제 환경에서는 Local Path 를 잘 사용하지 않을지라도,
만약 사용하게 된다면 hostPath 를 사용하는 것보다 Local Path Provisioner 를 통해 PV 와 PVC 를 만들어 사용하는 것이 리소스 관리 측면에서 더 용이할 것으로 보입니다.

 


 

이번 포스팅에서는 kubernetes storage 에 대해 간단하게 알아보았습니다.

다음 포스팅에서는 본격적으로 EBS CSI Driver 를 활용한 동적 프로비저닝에 대해 알아보겠습니다.

Contents

포스팅 주소를 복사했습니다