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.yamlapiVersion: 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
참고
- https://kubernetes-csi.github.io/docs/introduction.html
- https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html
- https://docs.aws.amazon.com/eks/latest/userguide/csi-iam-role.html
- https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/install.md
- https://aws.amazon.com/premiumsupport/knowledge-center/eks-persistent-storage/?nc1=h_ls