CloudNet@ 팀의 가시다님께서 Leading 하시는 AEWS Study 3주차 스터디 내용 정리
이번 포스팅에서는 EKS Storage 에 대한 개념을 알아보겠습니다.
1. kubernetes storage
kubernetes (k8s) Pod 의 데이터는 기본적으로 Stateless 입니다.
즉 k8s는 Pod 삭제 시 Pod 내의 데이터도 함께 소멸되는 시스템입니다.
하지만, Stateful 한 Application 을 배포하기 위해서는 데이터 지속성이 보장되어야합니다.
다음은 데이터 지속성을 보장하기 위한 스토리지 요구 사항입니다.
- 스토리지는 Pod 수명 주기에 의존해서는 안된다.
- 스토리지는 Kubernetes 클러스터의 모든 Pod 및 Node 에서 사용할 수 있어야 한다.
- 스토리지는 충돌이나 애플리케이션 오류에 관계없이 가용성이 높아야 한다.
1.1. Storage 유형
Kubernetes Storage 는 다음과 같이 분류할 수 있습니다.
- emptyDir
- hostPath
- PV/PVC
3가지 스토리지 타입에 대한 테스트와 개념은 아래 포스팅에서 확인하실 수 있습니다.
이번 포스팅에서는 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)
hostPath 와 Local 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 를 활용한 동적 프로비저닝에 대해 알아보겠습니다.