

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# EKS Auto Mode에 샘플 상태 저장 워크로드 배포
<a name="sample-storage-workload"></a>

이 자습서에서는 EKS Auto Mode 클러스터에 샘플 상태 저장 애플리케이션을 배포하는 방법을 안내합니다. 애플리케이션은 영구 볼륨에 타임스탬프를 기록하여 EKS Auto Mode의 자동 EBS 볼륨 프로비저닝 및 지속성 기능을 보여줍니다.

## 사전 조건
<a name="_prerequisites"></a>
+ EKS Auto Mode 클러스터
+ 적절한 권한으로 구성된 AWS CLI
+  `kubectl` 설치 및 구성
  + 자세한 내용은 [Amazon EKS를 사용하도록 설정](setting-up.md) 단원을 참조하십시오.

## 1단계: 환경 구성
<a name="_step_1_configure_your_environment"></a>

1. 환경 변수를 설정합니다.

   ```
   export CLUSTER_NAME=my-auto-cluster
   export AWS_REGION="us-west-2"
   ```

1. kubeconfig를 업데이트합니다.

   ```
   aws eks update-kubeconfig --name "${CLUSTER_NAME}"
   ```

## 2단계: 스토리지 클래스 생성
<a name="_step_2_create_the_storage_class"></a>

`StorageClass`는 EKS 자동 모드가 EBS 볼륨을 프로비저닝하는 방법을 정의합니다.

EKS 자동 모드는 `StorageClass`를 생성하지 않습니다. EKS 자동 모드의 스토리지 기능을 사용하려면 `ebs.csi.eks.amazonaws.com`을 참조하는 `StorageClass`를 생성해야 합니다.

1. `storage-class.yaml`라는 이름의 파일을 만듭니다.

   ```
   apiVersion: storage.k8s.io/v1
   kind: StorageClass
   metadata:
     name: auto-ebs-sc
     annotations:
       storageclass.kubernetes.io/is-default-class: "true"
   provisioner: ebs.csi.eks.amazonaws.com
   volumeBindingMode: WaitForFirstConsumer
   parameters:
     type: gp3
     encrypted: "true"
   ```

1. `StorageClass`를 적용합니다.

   ```
   kubectl apply -f storage-class.yaml
   ```

 **핵심 구성 요소:** 
+  `provisioner: ebs.csi.eks.amazonaws.com`-EKS Auto Mode를 사용합니다.
+  `volumeBindingMode: WaitForFirstConsumer`-포드에 필요할 때까지 볼륨 생성을 지연합니다.
+  `type: gp3`-EBS 볼륨 유형을 지정합니다.
+  `encrypted: "true"`-EBS는 기본 `aws/ebs` 키를 사용하여 이 클래스로 생성된 볼륨을 암호화합니다. 이는 선택 사항이며, 권장 사항은 아닙니다.
+  `storageclass.kubernetes.io/is-default-class: "true"`-영구 볼륨 클레임에서 다른 볼륨 클래스를 지정하지 않는 한 Kubernetes는 기본적으로 이 스토리지 클래스를 사용합니다. 다른 스토리지 컨트롤러에서 마이그레이션하는 경우 이 값을 설정할 때 주의하세요. (선택 사항)

## 3단계: 영구 볼륨 클레임 생성
<a name="_step_3_create_the_persistent_volume_claim"></a>

PVC는 `StorageClass`에서 스토리지를 요청합니다.

1. `pvc.yaml`라는 이름의 파일을 만듭니다.

   ```
   apiVersion: v1
   kind: PersistentVolumeClaim
   metadata:
     name: auto-ebs-claim
   spec:
     accessModes:
       - ReadWriteOnce
     storageClassName: auto-ebs-sc
     resources:
       requests:
         storage: 8Gi
   ```

1. PVC를 적용합니다.

   ```
   kubectl apply -f pvc.yaml
   ```

 **핵심 구성 요소:** 
+  `accessModes: ReadWriteOnce`-한 번에 한 노드씩 볼륨 탑재 가능
+  `storage: 8Gi`-8GiB 볼륨 요청
+  `storageClassName: auto-ebs-sc` - 생성한 `StorageClass`를 참조합니다.

## 4단계: 애플리케이션 배포
<a name="_step_4_deploy_the_application"></a>

배포는 영구 볼륨에 타임스탬프를 기록하는 컨테이너를 실행합니다.

1. `deployment.yaml`라는 이름의 파일을 만듭니다.

   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: inflate-stateful
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: inflate-stateful
     template:
       metadata:
         labels:
           app: inflate-stateful
       spec:
         terminationGracePeriodSeconds: 0
         nodeSelector:
           eks.amazonaws.com/compute-type: auto
         containers:
           - name: bash
             image: public.ecr.aws/docker/library/bash:4.4
             command: ["/usr/local/bin/bash"]
             args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 60; done"]
             resources:
               requests:
                 cpu: "1"
             volumeMounts:
               - name: persistent-storage
                 mountPath: /data
         volumes:
           - name: persistent-storage
             persistentVolumeClaim:
               claimName: auto-ebs-claim
   ```

1. 배포를 적용합니다.

   ```
   kubectl apply -f deployment.yaml
   ```

 **핵심 구성 요소:** 
+ 파일에 타임스탬프를 기록하는 단순 Bash 컨테이너
+ `/data`에 PVC 탑재 
+ CPU 코어 1개 요청
+ EKS 관리형 노드에 노드 선택기 사용

## 5단계: 설정 확인
<a name="_step_5_verify_the_setup"></a>

1. 포드가 실행 중인지 확인합니다.

   ```
   kubectl get pods -l app=inflate-stateful
   ```

1. PVC가 바인딩되었는지 확인합니다.

   ```
   kubectl get pvc auto-ebs-claim
   ```

1. EBS 볼륨을 확인합니다.

   ```
   # Get the PV name
   PV_NAME=$(kubectl get pvc auto-ebs-claim -o jsonpath='{.spec.volumeName}')
   # Describe the EBS volume
   aws ec2 describe-volumes \
     --filters Name=tag:CSIVolumeName,Values=${PV_NAME}
   ```

1. 데이터가 작성되고 있는지 확인합니다.

   ```
   kubectl exec "$(kubectl get pods -l app=inflate-stateful \
     -o=jsonpath='{.items[0].metadata.name}')" -- \
     cat /data/out.txt
   ```

## 6단계: 정리
<a name="_step_6_cleanup"></a>

다음 명령을 실행하여 이 자습서에서 만든 리소스를 모두 제거합니다.

```
# Delete all resources in one command
kubectl delete deployment/inflate-stateful pvc/auto-ebs-claim storageclass/auto-ebs-sc
```

## 비하인드 스토리
<a name="_whats_happening_behind_the_scenes"></a>

1. PVC는 `StorageClass`에서 스토리지를 요청합니다.

1. 포드가 예약된 경우:

   1. EKS Auto Mode는 EBS 볼륨을 프로비저닝합니다.

   1. PersistentVolume을 생성합니다.

   1. 노드에 볼륨을 연결합니다.

1. 포드가 볼륨을 탑재하고 타임스탬프 작성을 시작합니다.

## 스냅샷 컨트롤러
<a name="_snapshot_controller"></a>

EKS Auto Mode는 스냅샷 컨트롤러라고도 하는 Kubernetes CSI Snapshotter와 호환됩니다. 그러나 EKS Auto Mode에는 스냅샷 컨트롤러가 포함되지 않습니다. 스냅샷 컨트롤러의 설치와 구성은 사용자의 책임입니다. 자세한 내용은 [CSI 볼륨의 스냅샷 기능 활성화](csi-snapshot-controller.md) 단원을 참조하십시오.

EKS Auto Mode의 스토리지 기능을 참조하는 다음 `VolumeSnapshotClass`를 검토합니다.

```
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: auto-ebs-vsclass
driver: ebs.csi.eks.amazonaws.com
deletionPolicy: Delete
```

 [Kubernetes CSI Snapshotter에 대해 자세히 알아보세요.](https://github.com/kubernetes-csi/external-snapshotter/blob/master/README.md#usage)