AWS

[ 7 ] - EKS Storage Monitoring

zhuxiclover 2024. 9. 26. 15:02

1.  eks 스토리지

 

 ➜  Kubernetes 리소스 중 가장 기본단위인 Pod는 언제든 죽을 수 있는 Stateless 리소스

    ✅  따라서 Pod 내부에 저장되어 있는 데이터들은 파드가 죽게되면 모두 소실이 되므로 이러한 데이터 유실 방지를 위해 k8s에서는 PV, PVC 방식으로 Storage 사용

 

 

2.  Storage 종류
 ➜ 
임시 파일 시스템 (컨테이너와 같은 생명주기)

 

 ➜  임시 볼륨 (emptydir, 파드와 같은 생명주기)

    ✅  말 그대로 비어있는 디렉토리를 Volume으로 사용하는데, Pod가 사라지면 데이터도 같이 사라지는 특징

    ✅  emptyDir이 배포가 되면, 기본적으로는 클러스터의 환경에 따라 노드의 Disk, SSD, Network Storage 등에 데이터가 저장

    ✅  sizeLimit 을 설정할 수 도 있고, emptyDir.medium: Memory를 통해 노드의 tmpfs(RAM based filesystem)에 할당하여 속도를 빠르게 만들기도 가능

 

 ➜  hostpath (파드, 컨테이너와 생명주기 무관) : 노드

    ✅  Pod의 Volume을 Node에 매핑시키는 방식

    ✅  Pod가 죽고 다시 살아나면 데이터가 유실되지 않고 남아있게 되는데, 원래 Pod가 존재하던 Node에 생성되어야지 의미가 있음

 

 ➜  AWS EBS CSI driver

 ➜  AWS EFS CSI driver

 

 

            AWS EFS <-->  AWS EFS CSI driver  <-->  EKS cluster

 

 

3.  AWS EFS

 ➜  EFS는 aws에서 제공하는 파일 스토리지

 ➜  스토리지 용량을 탄력적으로 구성하는 서버리스 파일 스토리지이며 aws 관리형 서비스이므로 별도의 스토리지 용량과 성능을 프로비저닝하지 않음

 ➜  EFS는 다수의 가용영역에 걸처 데이터를 저장하고 다수의 자원이 접근 가능한 공유 스토리지

 

 

4.  AWS EFS CSI driver

 ➜  AWS EFS CSI driver가 EKS 클러스터와 EFS 파일 시스템에 연결되어 관리

 ➜  AWS EFS CSI driver를 설치하면 EFS-CSI-controller와  EFS-CSI-NODE가 생성

 ➜  EFS는 EBS와 다르게 대상 컨테이너가 필요하지 않음

 ➜  PV와 PVC의 access mode 설정은 아무것이나 (once, many 무관),  다수의 가용영역에 위치해서 파드가 어느 가용영역이든 상관없음

 

 

5.  EKS cluster

 ➜  aws eks클러스터에 영구 볼륨 환경인 PV를 구성할 수 있고, 대상 스토리지를 EFS 파일시스템에 연결 가능

 

 

6.  실습

 ➜  아래 코드 실패 시 스택에서 롤백상태 확인하고 삭제 후 재실행

aws eks describe-addon-versions \
    --addon-name aws-efs-csi-driver \
    --kubernetes-version 1.27 \
    --output text

eksctl create iamserviceaccount \
    --name efs-csi-controller-sa \
    --namespace kube-system \
    --cluster myeks \
    --role-name AmazonEKS_EFS_CSI_DriverRole23 \
    --role-only \
    --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
    --approve

 

 

 ➜  IRSA 생성 확인

    ✅  eksctl get iamserviceaccount --cluster myeks

 

eksctl create addon --name aws-efs-csi-driver\
 --cluster ${CLUSTER_NAME}\
 --service-account-role-arn arn:aws:iam::${ACCOUNT_ID}:role/AmazonEKS_EFS_CSI_DriverRole\
 --force

 

 

 ➜  클러스터 확인

    ✅  eksctl get addon --cluster ${CLUSTER_NAME}

 

 

 ➜  PVC와 POD 생성

    ✅  nano efs_dp_pvc_pod.yaml

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: efs-dp-claim
spec:
  accessModes:
    - ReadWriteMany     #####  다수가 공유 스토리지로 사용할 수 있다 
  storageClassName: efs-dp-sc
  resources:
    requests:
      storage: 5Gi
---

apiVersion: v1
kind: Pod
metadata:
  name: efs-dp-app
spec:
  containers:
    - name: app
      image: centos
      command: ["/bin/sh"]
      args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 10; done"]
      volumeMounts:
        - name: persistent-storage
          mountPath: /data
  volumes:
    - name: persistent-storage
      persistentVolumeClaim:
        claimName: efs-dp-claim    ### volume영역에서 참조할 pvc는 efs-dp-claim

 

    ✅  kubectl apply -f efs_dp_pvc_pod.yaml

 

    ✅  nano efs_dp_sc.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-dp-sc
provisioner: efs.csi.aws.com
parameters:
  provisioningMode: efs-ap
  fileSystemId: fs-0686c59d89f9b95aa
  directoryPerms: "700"

 

    ✅  kubectl apply -f efs_dp_sc.yaml

 

    ✅  kubectl get pv,pvc,sc

 

 

 ➜  ECR

    ✅  버지니아 북부에서 인증받기 : aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws

 

    ✅   aws ecr-public describe-registries --region us-east-1

 

 

 ➜  위의 것이 퍼블릭 리포지토리에 반영이 안돼서 강제로 생성

    ✅  NICKNAME=juhee17

    ✅  aws ecr-public create-repository --repository-name $NICKNAME/nginx --region us-east-1

 

    ✅  확인

 

    ✅  docker pull nginx:alpine

    ✅  docker tag nginx:alpine public.ecr.aws/n0h2y7b3/juhee17/nginx

    ✅  docker images

    ✅  kubectl get pod

 

 

 ➜  올라간 image, repo 지우기

ws ecr-public batch-delete-image \
      --repository-name $NICKNAME/nginx \
      --image-ids imageTag=latest \
      --region us-east-1

aws ecr-public delete-repository \
      --repository-name $NICKNAME/nginx \
      --force \
      --region us-east-1

 

 

 

** 참고 **

1. https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/efs-csi.html

 

Amazon EFS를 사용한 탄력적 파일 시스템 저장 - Amazon EKS

AWS Fargate에는 이 단계가 필요하지 않습니다. Fargate에서 실행되는 Pod은(는) Amazon EFS 파일 시스템을 자동으로 탑재합니다.

docs.aws.amazon.com

 

2. https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/public/public-repositories.html

 

Amazon ECR public repositories - Amazon ECR Public

Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.

docs.aws.amazon.com

 

3. https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/public/getting-started-cli.html

 

Moving an image through its lifecycle in Amazon ECR Public - Amazon ECR Public

Moving an image through its lifecycle in Amazon ECR Public This quick start guide walks you through the steps needed to create a Docker image, publish the image to a public repository, pull the image down from the Amazon ECR Public Gallery, and then clean

docs.aws.amazon.com

 

'AWS' 카테고리의 다른 글

[ 9 ] - 모니터링  (0) 2024.09.30
[ 8 ] - External DNS  (0) 2024.09.27
[ 6 ] - EKS Storage : Snapshot Controller  (0) 2024.09.25
[ 5 ] - pv, pvc 관련 실습  (0) 2024.09.25
[ 4 ]  (0) 2024.09.13