1. Kubernetes에서 AWS EFS(공유볼륨) 구성
1. EFS 생성
- 서비스 EFS 검색 => 파일시스템 생성
확인 :
또는 명령어로 확인
aws efs describe-file-systems --query " FileSystems [*]. FileSystemId "
[
"fs-959160f5"
]
2. EFS 보안그룹 설정
2.1 EKS Worker Node에 할당된 Security Group 확인 및 복사
- 서비스 EC2 검색 => EC2 선택 => NODE선택 => 보안그룹 복사
2.2 EFS 보안그룹 추가
- 서비스 EFS 검색 => 생성한 파일시스템 선택 => 네트워크 선택 => 관리
- 가용영역별 EKS Worker Node에 할당된 Security Group 선택
EFS 파일 시스템 준비 완료.
1안. aws efs csi 드라이버 이용
- 원문 : https://github.com/kubernetes-sigs/aws-efs-csi-driver
3.1 helm 설치
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
- 확인 :
helm version
version.BuildInfo{Version:"v3.5.2", GitCommit:"167aac70832d3a384f65f9745335e9fb40169dc2", GitTreeState:"dirty", GoVersion:"go1.15.7"}
3.2 aws efs csi 드라이버 설치
helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/
helm repo update
helm upgrade --install aws-efs-csi-driver aws-efs-csi-driver/aws-efs-csi-driver
2안.EFS Provisioner 이용
- 원문 : https://www.44bits.io/ko/post/amazon-efs-on-kubernetes-by-using-efs-provisioner
2. EFS Provisioner 배포
2.1 서비스 어카운트 yaml 배포
cat > service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
namespace: default
name: efs-provisioner
kubectl apply -f service-account.yaml
2.2 RBAC yaml 배포
cat > 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
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
namespace: default
roleRef:
kind: Role
name: leader-locking-efs-provisioner
apiGroup: rbac.authorization.k8s.io
kubectl apply -f rbac.yaml
2.3 Deployment 배포
cat > Deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
namespace: default
name: efs-provisioner
spec:
selector:
matchLabels:
app: efs-provisioner
replicas: 2
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-a0ba4cc0"
- name: AWS_REGION
value: "ap-northeast-2"
- name: PROVISIONER_NAME
value: "provisioner-1"
volumeMounts:
- name: pv-volume
mountPath: /persistentvolumes
volumes:
- name: pv-volume
nfs:
server: "fs-a0ba4cc0.efs.ap-northeast-2.amazonaws.com"
path: /