Kubernetes

Mountpoint for Amazon S3로 EKS Pod에 S3 mount하기

mokpolar 2025. 2. 18. 23:03
반응형

안녕하세요?
AEWS 스터디 3주차, 스토리지의 과제로 Mountpoint for Amazon S3 CSI 드라이버를 테스트한 내용에 대해서 작성해보겠습니다.

Mountpoint for Amazon S3 CSI 드라이버를 통해 Amazon S3 객체에 액세스 - Amazon EKS 이 공식 문서를 참고 하였습니다.

 

Mountpoint for Amazon S3 CSI 드라이버가 뭔가요?

Mountpoint for Amazon S3 컨테이너 스토리지 인터페이스(CSI) 드라이버를 사용하면 Kubernetes 에서 파일 시스템 인터페이스를 통해 Amazon S3 개체에 액세스할 수 있습니다.

 

그러니까 EKS 클러스터에 배포하는 컨테이너들이 기존에 EBS나 EFS를 마운트하던 것처럼 마치 S3를 파일시스템처럼 마운트할 수 있는 것입니다.

 

권한 생성

IAM Policy 생성

먼저 AWS IAM Policy를 생성해야 합니다.
아래와 같은 JSON 형태의 Policy를 입력합니다.

 

특정 S3 Bucket에 대한 List, Get, Put 등의 권한을 부여해야 합니다.

{
   "Version": "2012-10-17",
   "Statement": [
        {
            "Sid": "MountpointFullBucketAccess",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket1"
            ]
        },
        {
            "Sid": "MountpointFullObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:AbortMultipartUpload",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket1/*"
            ]
        }
   ]
}

아래와 같이 콘솔에서 생성할 수 있습니다.

 

s3-mount-policy라는 이름으로 생성했습니다.

 

IAM Role 생성

아래 처럼 IAM Role 생성화면을 열어 Web Identity를 선택합니다.
Provider에는 대상 클러스터의 OpenID Connect provider URL 을 입력해주면 됩니다.

 

다음 Add Permission 페이지에서는 좀 전에 생성한 Policy를 선택해줍니다.

s3-mount-role이라는 이름으로 생성했습니다.

 

생성된 Role의 Trust Relationships 탭에서 해당 클러스터에 맞게 추가해줍니다.

region과 코드등을 맞춰주면 아래와 비슷한 형태가 됩니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:s3-csi-driver-sa",
          "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}

 

S3 Mount Plugin 설치

이제 대상이 되는 EKS 클러스터로 접근합니다.


콘솔에서 Addon 탭에서 Get more addons를 선택합니다.

아래와 같은 플러그인들이 있습니다.

 

 

Mountpoint for Amazon S3 CSI Driver를 선택하고 다음 화면에서 아까 생성한 Role을 골라줍니다.

완료하면 즉각 s3-csi-node라는 Deamonset이 생성됩니다.

k get ds -A | grep s3-csi-node
kube-system    s3-csi-node              4         4         4       4            4           kubernetes.io/os=linux     43s

 

S3 Mount 구성

PV, PVC를 생성해서 Pod에 마운트하는 방식은 EBS나 EFS와 동일합니다.
샘플 파일은 해당 GitHub를 참고합니다

.
mountpoint-s3-csi-driver/examples/kubernetes/static_provisioning/README.md at main · awslabs/mountpoint-s3-csi-driver · GitHub

 

mountpoint-s3-csi-driver/examples/kubernetes/static_provisioning/README.md at main · awslabs/mountpoint-s3-csi-driver

Built on Mountpoint for Amazon S3, the Mountpoint CSI driver presents an Amazon S3 bucket as a storage volume accessible by containers in your Kubernetes cluster. - awslabs/mountpoint-s3-csi-driver

github.com

 

 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: s3-mountpoint-pv
spec:
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  mountOptions:
    - uid=1000
    - gid=2000
    - allow-other
  csi:
    driver: s3.csi.aws.com
    volumeHandle: s3-csi-driver-volume
    volumeAttributes:
      bucketName: amzn-s3-demo-bucket1
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: s3-mountpoint-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 100Gi
  volumeName: s3-mountpoint-pv
---
apiVersion: v1
kind: Pod
metadata:
  name: s3-mountpoint-pod
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 2000
  containers:
    - name: ubuntu
      image: ubuntu
      command: ["/bin/sh"]
      args: ["-c", "sleep infinity"]
      volumeMounts:
        - name: persistent-storage
          mountPath: /temp
  volumes:
    - name: persistent-storage
      persistentVolumeClaim:
        claimName: s3-mountpoint-pvc

 

위 매니페스트를 가지고 배포합니다.
곧 pod가 배포됩니다.

k get pod| grep s3
s3-mountpoint-pod                                   0/1     ContainerCreating   0          63s

 

테스트를 위해 Pod에 접근해서 파일을 생성하고 내용을 추가해봅니다.

touch test.py

 

S3에 파일이 추가되어 있는 모습을 볼 수 있습니다.

반응형