Skip to content

EKS Storage

EBS와 EFS 비교

특성Amazon EBSAmazon EFS
타입블록 스토리지파일 스토리지
사용 사례데이터베이스 저장, 로그 저장, 파일 시스템 필요로 하는 애플리케이션여러 인스턴스에서 공유하는 파일 시스템, 콘텐츠 관리 시스템, 빅 데이터 및 분석 작업
성능고성능 및 저지연, 다양한 볼륨 타입 제공, IOPS 및 처리량 조절 가능지연 시간이 길고 처리량이 높은 워크로드에 적합, 퍼포먼스 및 처리량 모드 제공
데이터 접근성하나의 EC2 인스턴스에만 연결 가능, 다중 연결 모드 지원여러 EC2 인스턴스, EKS 파드에서 동시에 접근 가능, NFSv4.1 및 NFSv4.0 프로토콜 지원
가용성특정 가용 영역(AZ)에 종속적, AZ 내 고가용성 보장리전 전체에 걸쳐 고가용성 보장, 여러 가용 영역에 걸쳐 데이터 복제
백업 및 복구스냅샷 기능 제공, 스냅샷을 통해 다른 리전으로 데이터 복사 가능내장된 백업 기능 없음, 별도의 백업 솔루션 필요
비용사용한 용량에 따라 비용 청구, 높은 성능 요구 시 비용 증가 가능사용한 용량에 따라 비용 청구, 동적 스케일링으로 비용 절감 가능

empty-dir로 테스트

Github Link

간단하게 backend와 database pod을 만들어 놓고 테스트를 먼저 해봤습니다.

Empty Dir

empty-dir은 pod이 지워지면 volume도 같이 삭제됩니다.
https://kubernetes.io/docs/concepts/storage/volumes/#emptydir

Liveness, Readiness

https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

Liveness Probe

livenessProbe는 컨테이너가 "살아 있는지"를 확인하는 데 사용됩니다. 즉, 컨테이너가 아직도 작동하고 있으며 응답이 있는지 확인합니다. 이 프로브가 실패하면, Kubernetes는 컨테이너를 다시 시작합니다.

주요 용도

  • 애플리케이션 복구: 애플리케이션이 특정 오류 상태에 빠져 응답하지 않는 경우, livenessProbe가 이를 감지하고 컨테이너를 재시작합니다.
  • 데드락 방지: 프로세스가 데드락에 걸리거나 무한 루프에 빠졌을 때 이를 감지하여 복구합니다.

Readiness Probe

readinessProbe는 컨테이너가 "준비가 되었는지"를 확인하는 데 사용됩니다. 즉, 트래픽을 받을 준비가 되었는지 확인합니다. 이 프로브가 실패하면, Kubernetes는 해당 컨테이너에 대한 트래픽을 서비스에서 제외합니다.

주요 용도

  • 서비스 가용성: 컨테이너가 트래픽을 받을 준비가 되지 않았을 때 이를 감지하여 트래픽을 차단함으로써, 서비스의 안정성을 보장합니다.
  • 애플리케이션 초기화: 애플리케이션이 초기화 과정을 완료하지 않았거나, 외부 서비스와의 연결을 설정하지 않은 경우, 트래픽을 받지 않도록 합니다.

Init Containers

https://kubernetes.io/docs/concepts/workloads/pods/init-containers/

init Container는 아래와 같은 용도로 많이 사용 됩니다.
여기서는 postres가 실행될때까지 기다리는 용도로 사용되었습니다.

  • 애플리케이션 설정: 메인 컨테이너가 시작되기 전에 필요한 설정 파일을 다운로드하거나 설정을 적용하는 작업.
  • 데이터베이스 마이그레이션: 데이터베이스 마이그레이션 스크립트를 실행하여 메인 애플리케이션이 실행되기 전에 데이터베이스를 준비하는 작업.
  • 권한 설정: 필요한 파일이나 디렉토리에 적절한 권한을 설정하는 작업.

EBS

Github Link
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/ebs-csi.html
https://github.com/kubernetes-sigs/aws-ebs-csi-driver/tree/master/examples/kubernetes
프리티어인 t2.micro로 진행이 안되서 t3.medium으로 노드그룹을 다시 만들고 진행하였습니다.

IAM 역할 설정

sh
eksctl create iamserviceaccount \
    --name ebs-csi-controller-sa \
    --namespace kube-system \
    --cluster <cluster-name> \
    --role-name AmazonEKS_EBS_CSI_DriverRole \
    --role-only \
    --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
    --approve

EBS CSI 드라이버 추가

sh
eksctl create addon --name aws-ebs-csi-driver --cluster <cluster-name> --service-account-role-arn arn:aws:iam::<role-number>:role/AmazonEKS_EBS_CSI_DriverRole --force

Storage Class

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
allowVolumeExpansion: true
parameters:
  type: gp3
  fsType: ext4
  encrypted: "true"
  kmsKeyId: arn:aws:kms:us-west-2:123456789012:key/abcd1234-a123-456a-a12b-a123b4cd56ef
  iopsPerGiB: "3"
  throughputPerGiB: "125"
allowedTopologies:
  - matchLabelExpressions:
      - key: topology.ebs.csi.aws.com/zone
        values:
          - ap-northeast-2a
          - ap-northeast-2b

volumeBindingMode

PV가 바인딩될 시점을 지정합니다.

  • Immediate: PVC가 생성되면 즉시 PV를 바인딩합니다.
  • WaitForFirstConsumer: PVC가 Pod에 바인딩될 때까지 대기합니다.

reclaimPolicy

PVC가 삭제된 후 PV를 어떻게 처리할지를 지정합니다.

  • Retain: PV를 유지합니다.
  • Delete: PV를 삭제합니다.

allowVolumeExpansion

PV의 크기를 확장할 수 있는지 여부를 지정합니다.

type

  • gp2: General Purpose SSD (이전 세대)
  • gp3: General Purpose SSD (최신 세대, 기본값)
  • io1: Provisioned IOPS SSD
  • sc1: Cold HDD
  • st1: Throughput Optimized HDD
  • standard: Magnetic

fsType

EBS 볼륨이 파일 시스템으로 포맷될 때 사용되는 파일 시스템 유형을 지정합니다.
이는 PV가 Pod에 마운트될 때 파일 시스템이 자동으로 포맷되고, 마운트되는 방식을 결정합니다.

  • ext4: 리눅스에서 가장 널리 사용되는 파일 시스템 유형 중 하나로, 일반적인 용도로 적합합니다.
  • xfs: 대용량 데이터베이스와 같이 고성능이 요구되는 경우 사용됩니다.
  • 그 외 btrfs, ext3 등 다른 파일 시스템 유형도 지정할 수 있습니다.

encrypted, kmsKeyId

EBS 볼륨을 암호화할지 여부를 지정합니다.
EBS 볼륨 암호화에 사용할 KMS (Key Management Service) 키의 ID를 지정합니다.

iopsPerGiB

IOPS(Input/Output Operations Per Second) 성능을 지정하는 옵션 gp3 또는 io1 볼륨에만 해당됩니다.

  • GiB당 제공될 IOPS 수를 지정합니다.
  • EBS gp3 볼륨은 기본적으로 GiB당 3 IOPS를 제공합니다.
  • IOPS 성능은 특정 용량 이상에서만 적용되며, 성능을 높일수록 비용이 증가합니다.

throughputPerGiB

gp3 볼륨에 대해 GiB당 스루풋 (Throughput)을 지정합니다.

  • GiB당 제공될 스루풋을 지정합니다.
  • 스루풋은 볼륨이 데이터를 전송할 수 있는 속도를 의미합니다.
  • gp3 볼륨은 기본적으로 GiB당 125 MiB/s의 스루풋을 제공합니다.

allowedTopologies

토폴로지 키와 값을 매칭하여 PV가 해당 토폴로지에서만 프로비저닝되도록 제한합니다.

EFS

Github Link
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/efs-csi.html
https://github.com/kubernetes-sigs/aws-efs-csi-driver/tree/master/examples/kubernetes

IAM

sh
export cluster_name=eksnest
export role_name=AmazonEKS_EFS_CSI_DriverRole
eksctl create iamserviceaccount \
    --name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster $cluster_name \
    --role-name $role_name \
    --role-only \
    --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
    --approve
TRUST_POLICY=$(aws iam get-role --role-name $role_name --query 'Role.AssumeRolePolicyDocument' | \
    sed -e 's/efs-csi-controller-sa/efs-csi-*/' -e 's/StringEquals/StringLike/')
aws iam update-assume-role-policy --role-name $role_name --policy-document "$TRUST_POLICY"

EFS CSI 드라이버 추가

공식문서 가보면 console에서 추가라하고 권장합니다. 시키는데로 해봅시다.
EKS > 클러스터 > 클러스터 이름 클릭 > 추가기능 > Amazon EFS CSI 드라이버 선택 > 위에서 만든 IAM 역할 선택, VPC는 EKS의 VPC 선택 > 생성

보안그룹추가

EC2 > 보안 그룹 > 보안 그룹 생성
이름 원하는것을 기재하고 VPC를 EKS가 생성되면서 만들어진 VPC 선택, 인바운드 규칙은 유형은 NFS, 소스는 VPC의 IPv4 CIDR를 기재해준다. IPv4 CIDR는 VPC를 가면 확인할 수 있다.
이후 EFS > 만든 EFS 선택 > 네트워크 액세스를 들어가서 만든 보안그룹을 선택하고 저장해준다. 2개,3개가 있으면 모두 선택해야 한다.