컨테이너 내의 디스크에 있는 파일은 임시적이며, 컨테이너에서 실행될 때 애플리케이션에 적지 않은 몇 가지 문제가 발생합니다. 한 가지 문제는 컨테이너가 크래시될 때 파일이 손실된다는 것입니다. kubelet은 컨테이너를 다시 시작하지만 초기화된 상태입니다. 두 번째 문제는 Pod에서 같이 실행되는 컨테이너간에 파일을 공유할 때 발생합니다. 쿠버네티스 볼륨 추상화는 이러한 문제를 모두 해결합니다.
1.임시볼륨 (empty volume)
파드가 시작될 때 빈 상태로 시작되며, 저장소는 로컬의 kubelet 베이스 디렉터리(보통 루트 디스크) 또는 램에서 제공됩니다.
echo "This is hostpath-mount-02" >> /hostpath-mount/hostpath.txt
이제 앞서 hostpath=true 라벨링을 부여한 노드로 접속해서, 실제 노드 값을 확인해 봅니다.
Session Manager를 통해서 접속이 가능합니다.
아래와 같은 방법으로도 확인이 가능합니다.
# EC2 IP와 instance id 조회
~/environment/useful-shell/aws_ec2_ext.sh
나온 결과의 실제 EC2 Node IP를 확인하고, Session Manager로 접속해 봅니다.
# host-path로 Labeling되어 있는 EC2의 instanace id로 접근
aws ssm start-session --target {instance-id}
아래와 같이 EC2 콘솔에서 값을 조회해 봅니다.
cat /tmp/hostpath.txt
노드에서 실행한 값이 앞서 Container1,2에서 실행한 값을 모두 포함하는지 확인해 봅니다.
노드기반의 hostPath는 노드가 삭제되면 모든 데이터는 소멸됩니다.
3. 퍼시스턴트 볼륨
퍼시스턴트볼륨은 사용자 및 관리자에게 스토리지 사용 방법에서부터 스토리지가 제공되는 방법에 대한 세부 사항을 추상화하는 API를 제공합니다. 이를 위해 퍼시스턴트볼륨(PV) 및 퍼시스턴트볼륨클레임(PVC)이라는 두 가지 새로운 API 리소스를 제공합니다.
퍼시스턴트볼륨 (PV)은 관리자가 프로비저닝하거나 스토리지 클래스를 사용하여 동적으로 프로비저닝한 클러스터의 스토리지입니다. PV는 Volumes와 같은 볼륨 플러그인이지만, PV를 사용하는 개별 파드와는 별개의 라이프사이클을 가진다. 이 API 오브젝트는 NFS, iSCSI 또는 클라우드 공급자별 스토리지 시스템 등 스토리지 구현에 대한 세부 정보를 포함하고 있습니다.
퍼시스턴트볼륨클레임 (PVC)은 사용자의 스토리지에 대한 요청입니다. 이것은 파드와 비슷하다. 파드는 노드 리소스를 사용하고 PVC는 PV 리소스를 사용한다. 파드는 특정 수준의 리소스(CPU 및 메모리)를 요청할 수 있지만, 클레임은 특정 디스크 크기 및 접근 모드를 요청할 수 있습니다. (예: ReadWriteOnce, ReadOnlyMany 또는 ReadWriteMany로 마운트 할 수 있음. AccessModes 참고).
퍼시스턴트볼륨클레임을 사용하면 사용자가 추상화된 스토리지 리소스를 사용할 수 있지만, 다른 문제들 때문에 성능과 같은 다양한 속성을 가진 퍼시스턴트볼륨이 필요한 경우가 일반적입니다. 클러스터 관리자는 사용자에게 해당 볼륨의 구현 방법에 대한 세부 정보를 제공하지 않고 크기와 접근 모드와는 다른 방식으로 다양한 퍼시스턴트볼륨을 제공할 수 있어야 하며, 이러한 요구를 위해서는 스토리지클래스 리소스가 있습니다.
3.1 스토리지 클래스 확인
클러스터에 이미 있는 스토리지 클래스를 확인합니다.
kubectl get storageclass
다음과 같은 결과를 확인 할 수 있습니다.
$ kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
gp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer false 18h
eksctl을 사용하여 Amazon EBS CSI 추가 기능을 추가하려면 다음 명령을 실행합니다.
# EBS CSI Addon 명령 실행
eksctl create addon --region ${AWS_REGION} --name aws-ebs-csi-driver --cluster ${ekscluster_name} --service-account-role-arn arn:aws:iam::${ACCOUNT_ID}:role/AmazonEKS_EBS_CSI_DriverRole --force
EKS 메뉴의 Add-ons(추가기능)을 확인하면, 아래와 같이 정상적으로 EBS CSI Driver가 추가된 것을 확인 할 수 있습니다.
Amazon EBS CSI 추가 기능의 최신 버전을 확인합니다.
eksctl get addon --name aws-ebs-csi-driver --cluster ${ekscluster_name}
최신버전으로 업데이트하려면, UPDATE AVAILABLE 에서 출력된 값으로 업데이트를 시도합니다.
아래 예제는 v1.23.1-eksbuild.1 로 업그레이드하는 예제입니다.
#Addon 기반 업데이트
export EBS_DRIVER_UPDATE_VERSION=v1.23.1-eksbuild.1
eksctl update addon --name aws-ebs-csi-driver --version ${EBS_DRIVER_UPDATE_VERSION} --cluster ${ekscluster_name} --force
3.6 스토리지 클래스 생성
EBS CSI-Driver 를 기반으로 하는 Storage Class 를 구성해 봅니다. 스토리지클래스는 관리자가 제공하는 스토리지의 클래스들을 설명할 수 있는 방법을 제공합니다. 클래스는 서비스의 품질 수준, 백업 정책, 클러스터 관리자가 정한 임의의 정책에 매핑될 수 있습니다.
아래와 같이 간단하게 새로운 EBS Storage Class를 생성합니다.
mkdir ~/environment/ebs_csi
#Storage Class 생성
cat <<EoF > ~/environment/ebs_csi/ebs_csi_sc_test01.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ebs-sc-01
annotations:
storageclass.kubernetes.io/is-default-class: "false"
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
EoF
#storage class 생성과 확인
kubectl apply -f ~/environment/ebs_csi/ebs_csi_sc_test01.yaml
kubectl get sc
volumeBindingMode 필드는 볼륨 바인딩과 동적 프로비저닝의 시작 시기를 제어합니다. 설정되어 있지 않으면, Immediate 모드가 기본으로 사용된다.
Immediate 모드는 퍼시스턴트볼륨클레임이 생성되면 볼륨 바인딩과 동적 프로비저닝이 즉시 발생하는 것을 나타냅니다. 토폴로지 제약이 있고 클러스터의 모든 노드에서 전역적으로 접근할 수 없는 스토리지 백엔드의 경우, 파드의 스케줄링 요구 사항에 대한 파악없이 퍼시스턴트볼륨이 바인딩되거나 프로비저닝되며, 이로 인해 스케줄되지 않은 파드가 발생할 수 있습니다.