Amazon EFS 파일 시스템을 EKS 클러스터의 영구 볼륨으로 사용
5480 단어 kubernetesaws
소개
저는 몇 달 동안 EKS/Kubernetes와 씨름했습니다.
애플리케이션이 컨테이너화되는 한 컨테이너는 최대한 적게 유지하고 상태를 데이터베이스나 오브젝트 스토리지에 저장하는 것이 모범 사례이지만 파일 시스템에 파일을 저장하려는 경우가 있을 수 있습니다.
이러한 경우 Kubernetes의 영구 볼륨 기능을 사용하여 포드에 비휘발성 파일 시스템을 마운트할 수 있습니다.
그러나 마운트할 파일 시스템을 직접 준비해야 합니다.
마운트 대상을 여러 개 선택할 수 있지만 동시에 여러 포드에서 읽고 해당 상태를 공유할 수 있도록 NFS 파일 시스템을 마운트하는 것이 더 나은 것 같습니다.
따라서 EKS 클러스터의 영구 볼륨을 위한 관리형 NFS 파일 시스템인 Amazon EFS 파일 시스템을 사용해 보았습니다.
EKS와 EFS는 둘 다 AWS 관리 서비스이고 쉬울 것이라고 생각했습니다. 그러나 나는 이것을 달성하기 위해 하루 종일을 소비해야 했습니다. 그래서 이 글을 쓰게 되었는데, 이 글이 도움이 되었으면 합니다.
단계
EFS 파일 시스템 생성
AWS 콘솔에서 EFS 파일 시스템을 생성합니다.
이때 EKS 작업자 노드가 존재하는 모든 서브넷을 탑재 대상에 추가하고 EKS 작업자 노드에 대한 보안 그룹을 설정합니다.
https://aws.amazon.com/jp/about-aws/whats-new/2019/02/deploy-a-kubernetes-cluster-using-amazon-eks-with-new-quick-start/
이 빠른 시작을 사용한 경우 xxx-NodeSecurityGroup-yyy보안 그룹이 있습니다.
영어가 아니라서 죄송합니다
작업자 노드 IAM 역할
EKS 작업자 노드의 역할에 1에서 생성한 EFS 볼륨에 대한 정책을 추가합니다. "빠른 시작"xxx-NodeInstanceRole-yyy라고도 합니다.
이 역할에 이전에 생성된 EFS 파일 시스템에 대한 "나열, 읽기, 쓰기"권한이 부여되면 괜찮습니다.
efs 프로비저닝 설정
EFS를 Kubernetes 영구 볼륨으로 사용하려면 efs-provisioner를 사용해야 합니다.
https://github.com/kubernetes-retired/external-storage/tree/master/aws/efs
그러나 README를 따라하면 작동하지 않는 함정이 있습니다.
리포지토리의 샘플 매니페스트가 올바르지 않기 때문입니다. . 😡
나는 이 문제에서 해결책을 찾았다.
https://github.com/kubernetes-incubator/external-storage/issues/1209
포드용 EFS 파일 시스템만 마운트하려는 경우 2개의 yaml 파일을 적용해야 합니다.
https://github.com/kubernetes-incubator/external-storage/blob/master/aws/efs/deploy/rbac.yaml
그리고
https://github.com/kubernetes-incubator/external-storage/blob/master/aws/efs/deploy/manifest.yaml
둘 다 고쳐야 합니다.
우선 rbac.yaml에 Role과 ClusterRole에 대한 정의가 있는데 ClusterRole로 통합하겠습니다. 서비스 역할에 대한 설명도 추가해야 합니다.
---
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: ["list", "watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-efs-provisioner
subjects:
- kind: ServiceAccount
name: efs-provisioner
namespace: development # Set namespace
roleRef:
kind: ClusterRole
name: efs-provisioner-runner
apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ServiceAccount
metadata:
namespace: development # Set namespace
name: efs-provisioner
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
namespace: development # Set namespace
name: efs-provisioner
spec:
serviceAccount: efs-provisioner
containers:
- name: efs-provisioner
image: quay.io/external_storage/efs-provisioner:latest
EFS 파일 시스템 마운트
그런 다음 포드에서 EFS 파일 시스템을 사용할 수 있습니다.
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: gcr.io/google_containers/busybox:1.24
command:
- "/bin/sh"
args:
- "-c"
- "touch /mnt/SUCCESS && exit 0 || exit 1"
volumeMounts:
- name: efs-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: efs-pvc
persistentVolumeClaim:
claimName: efs
디렉토리 분할
보시다시피 적절한 EC2 인스턴스를 생성하고 EFS 파일 시스템을 마운트하면 각 PersistentVolumeClaim에 대한 디렉터리가 잘리고 각 포드는 그 내부만 볼 수 있습니다.
따라서 여러 포드에 대해 하나의 EFS 파일 시스템을 사용하려는 경우 하나의 StorageClass 를 공유하는 여러 PersistentVolumeClaim을 정의할 수 있습니다.
결론
이제 EFS 파일 시스템을 EKS 클러스터에서 실행되는 Pod의 영구 볼륨으로 사용할 수 있습니다.
EKS와 EFS는 둘 다 AWS 제품이라 둘을 합치는 것이 일반적인 유스케이스인 줄 알았습니다. 그런데 의외로 좋은 정보를 찾지 못했는데 도움이 되었으면 합니다.
Reference
이 문제에 관하여(Amazon EFS 파일 시스템을 EKS 클러스터의 영구 볼륨으로 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/k5trismegistus/using-amazon-efs-file-system-as-a-permanent-volume-for-eks-cluster-m0h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)