Amazon EFS 파일 시스템을 EKS 클러스터의 영구 볼륨으로 사용

5480 단어 kubernetesaws
이 게시물은 Medium에서 이동되었습니다. 2019년에 쓴 글이라 내용이 오래되었을 수 있습니다.

소개



저는 몇 달 동안 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 제품이라 둘을 합치는 것이 일반적인 유스케이스인 줄 알았습니다. 그런데 의외로 좋은 정보를 찾지 못했는데 도움이 되었으면 합니다.

좋은 웹페이지 즐겨찾기