AWS. EKS 퍼시스턴트볼륨 사용하기

created Oct 02, 2022 | updated Oct 15, 2022

파드 사이에 데이터를 공유하고 파드의 라이프사이클에 영향없이 데이터가 유지되길 원한다면 퍼시스턴트 볼륨을 사용해야 한다.

본 포스팅은 AWS EKS가 이미 설치된 상황을 가정하고 설명한다.

K8S Volume


기본 개념

  • 볼륨은 독립적인 K8S 오브젝트가 아니다. 따라서 자체적으로 생성/삭제하는 것은 불가능하다.
  • 볼륨은 파드의 구성요소이고 파드와 동일한 라이프 사이클을 가진다.
    • 그렇다면 파드가 삭제될 때 볼륨의 콘텐츠도 삭제될까? 답은 볼륨의 유형에 따라 다르다.
  • 볼륨의 유형으로는 emptyDir, hostPath, gitRepo, nfs, cloud(gcePersistentDisk, awsElasticBlockStore, azureDisk), ConfigMap, Secret, PersistentVolumeClaim 등이 있고, 목적에 따라 사용된다.
  • 파드는 동시에 복수의 볼륨을 사용할 수 있다.

퍼시스턴트 스토리지

  • 볼륨의 데이터 유지가 필요하다면 퍼시스턴트 타입의 볼륨을 사용해야 한다.
  • 방법 1 : 퍼시스턴트 디스크를 생성 > 파드에서 볼륨 생성(생성된 디스크를 참조)하고 사용
  • 방법 2 : 퍼시스턴트 볼륨(들)을 생성 > 퍼시스턴트볼륨클레임 생성 > 파드에서 볼륨 생성(생성된 퍼시스턴트볼륨클레임 참조)하고 사용
  • 방법 3 : 퍼시스턴트 프로비저너 생성 > 스토리지클래스(들) 생성 > 퍼시스턴트볼륨클레임 생성(생성된 스토리지클래스를 참조) > 파드에서 볼륨 생성(생성된 퍼시스턴트볼륨클레임 참조)하고 사용
    • 동적 프로비저닝 방식

동적 프로비저닝을 위한 CSI Driver 설치


IRSA 설정

  • OIDC identity provider 생성 (참고 : https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)
  • Role 생성
    • Trusted entity type : Web Identity
    • Identity Provider : EKS의 OIDC Provider를 선택
    • Audience : sts.amazonaws.com
    • Permissions policies : AmazonEBSCSIDriverPolicy
    • Trust Relationship 내용 수정
      • ${IDENTITY_PROVIDER_ARN} : 위에서 생성한 EKS OIDC Provider ARN 값을 사용 (예 : arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE)
      • ${IDENTITY_PROVIDER} : EKS의 OIDC Provider 값을 사용 (예 : oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE)
      • ${SERVICE_ACCOUNT_NAME} : 생성할 Service Account 정보를 기입 (예 : system:serviceaccount:kube-system:ebs-csi-controller)
      trust-relationship
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Federated": "${IDENTITY_PROVIDER_ARN}"            },
                  "Action": "sts:AssumeRoleWithWebIdentity",
                  "Condition": {
                      "StringEquals": {
                          "${IDENTITY_PROVIDER}:aud": "sts.amazonaws.com",                    "${IDENTITY_PROVIDER}:sub": "${SERVICE_ACCOUNT_NAME}",                }
                  }
              }
          ]
      }
  • Service Account 생성
    • ${IAM_ROLE_ARN} : 위에서 생성한 Role ARN (예 : arn:aws:iam::111122223333:role/eks-ebs-csi-driver-role)
    service-account.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: ebs-csi-controller  annotations:
        eks.amazonaws.com/role-arn: ${IAM_ROLE_ARN}
      namespace: kube-system

EBS CSI Driver 설치

Driver 설치할 때 위에서 생성한 service account를 사용하도록 설정한다.

helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver
helm repo update

helm upgrade --install aws-ebs-csi-driver --namespace kube-system aws-ebs-csi-driver/aws-ebs-csi-driver \  --set controller.serviceAccount.create=false \  --set controller.serviceAccount.name=ebs-csi-controller

StorageClass 확인 및 생성

  • EKS 서비스를 띄우면 한 개의 StorageClass가 이미 생성되어 있다.
$ kubectl get sc
NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
gp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false                  40d
  • 다른 유형의 스토리지가 필요하다면 추가로 생성한다.
storageclass-example
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
#  annotations:
#    storageclass.kubernetes.io/is-default-class: "true"
  name: gp3
parameters:
  fsType: ext4
  type: gp3
provisioner: kubernetes.io/aws-ebs
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

퍼시스턴트볼륨클레임 생성과 사용하기


퍼시스턴트볼륨클레임

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: playground-storage-pvc
  namespace: playground
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: gp2

파드

apiVersion: v1
kind: Pod
metadata:
  name: foo-app
  namespace: playground
spec:
  containers:
  - image: registry.k8s.io/test-webserver
    name: playground-app-container
    volumeMounts:
    - mountPath: /data
      name: playground-storage
  volumes:
  - name: playground-storage
    persistentVolumeClaim:
      claimName: playground-storage-pvc

참고


※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

유리아쥬 제모스 스틱 레브르 립밤 4g x 10개, 12개, 무향솔가 어드밴스드 칼슘 컴플렉스 타블렛, 120개입, 1개커세어 코리아 정품 DARK CORE PRO 무선 충전 RGB 게이밍 마우스 / 다용도 에코백 사은품 증정, 혼합색상, RGP0076