AWS EFS로 Kubernetes Persistent Volumes 구성하기

2021. 11. 10. 16:13IT/Kubernetes

728x90

 PV는 볼륨 자체를 의미하며 클러스터 안에서 리소스로 다루며 PVC는 PV에 하는 요청(용량, 읽기/쓰기 모드 등)이다.

 

 PV를 만드는 단계는 Static, Dynamic으로 구분할 수 있다. Static Provisioning은 미리 PV를 생성하고, 요청 시 기 생성된 PV를 할당한다. Dynamic Provisioning 는 PVC를 통하여 PV를 요청 시 PV를 생성하여 할당한다.

 

1. Amazon EFS 생성

 생성한 VPC를 지정하여 EFS를 생성하고, ID 및 리전을 확인한다.

 

2. Persistent Volume 사용 설정

 아래와 같이 필요한 RBAC을 정의한다. (rbac.yaml)

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: efs-provisioner-runner
rules:
 - apiGroups: [""]
 resources: ["persistentvolumes"]
 verbs: ["get", "list", "watch", "create", "delete"]
 - apiGroups: [""]
 resources: ["persistentvolumeclaims"]
 verbs: ["get", "list", "watch", "update"]
 - apiGroups: ["storage.k8s.io"]
 resources: ["storageclasses"]
 verbs: ["get", "list", "watch"]
 - apiGroups: [""]
 resources: ["events"]
 verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: run-efs-provisioner
subjects:
 - kind: ServiceAccount
 name: efs-provisioner
 # replace with namespace where provisioner is deployed
 namespace: default
roleRef:
 kind: ClusterRole
 name: efs-provisioner-runner
 apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: leader-locking-efs-provisioner
rules:
 - apiGroups: [""]
 resources: ["endpoints"]
 verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: leader-locking-efs-provisioner
subjects:
 - kind: ServiceAccount
 name: efs-provisioner
 # replace with namespace where provisioner is deployed
 namespace: default
roleRef:
 kind: Role
 name: leader-locking-efs-provisioner
 apiGroup: rbac.authorization.k8s.io

 

 환경변수들(FILE_SYSTEM_ID, AWS_REGION, PROVISIONER_NAME)를 지정하여 Deployment를 정의한다. (manifest.yaml)

apiVersion: apps/v1
metadata:
 namespace: default
 name: efs-provisioner
spec:
 selector:
 matchLabels:
 app: efs-provisioner
 replicas: 1
 strategy:
 type: Recreate
 template:
 metadata:
 labels:
 app: efs-provisioner
 spec:
 serviceAccount: efs-provisioner
 containers:
 - name: efs-provisioner
 image: quay.io/external_storage/efs-provisioner:v2.4.0
 env:
 - name: FILE_SYSTEM_ID
 value: fs-0000000
 - name: AWS_REGION
 value: ap-northeast-2
 - name: PROVISIONER_NAME
 value: efs-provisioner
 volumeMounts:
 - name: pvcs
 mountPath: /pvcs
 volumes:
 - name: pvcs
 nfs:
 server: fs-0000000.efs.ap-northeast-2.amazonaws.com
 path: /

 

 Storage Class를 정의한다. (class.yml)

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
 namespace: default
 name: efs-provisioner
provisioner: efs-provisioner

 

 작성된 yml 파일을 적용하고, kubectl을 통해 배포를 확인한다.

kubectl apply -f .
kubectl get pod
kubectl get storageclass

 

 On-Premise에서 Cluster를 구성하고 EFS로 PV를 사용하기! 어렵지 않다.😁

300x250