

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

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

# 스토리지 클래스 생성
<a name="create-storage-class"></a>

Amazon EKS 자동 모드의 `StorageClass`는 애플리케이션이 영구 스토리지를 요청할 때 Amazon EBS 볼륨이 자동으로 프로비저닝되는 방식을 정의합니다. 이 페이지에서는 Amazon EKS 자동 모드와 함께 작동하여 EBS 볼륨을 프로비저닝하는 `StorageClass`를 생성하고 구성하는 방법을 설명합니다.

`StorageClass`를 구성하여 볼륨 유형, 암호화, IOPS 및 기타 스토리지 파라미터를 포함하여 EBS 볼륨에 대한 기본 설정을 지정할 수 있습니다. 암호화 관리에 AWS KMS 키를 사용하도록 `StorageClass`를 구성할 수도 있습니다.

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

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

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

둘째, 클러스터에 스토리지 클래스를 적용합니다.

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

 **핵심 구성 요소:** 
+  `provisioner: ebs.csi.eks.amazonaws.com`-EKS Auto Mode를 사용합니다.
+  `allowedTopologies` - `eks.amazonaws.com/compute-type:auto`에서 일치하도록 `matchLabelExpressions`를 지정하면 포드가 자동 모드를 사용하여 볼륨을 자동으로 프로비저닝해야 하는 경우 포드가 자동 모드가 아닌 노드에서 예약되지 않습니다.
+  `volumeBindingMode: WaitForFirstConsumer`-포드에 필요할 때까지 볼륨 생성을 지연합니다.
+  `type: gp3`-EBS 볼륨 유형을 지정합니다.
+  `encrypted: "true"` - EBS는 `StorageClass`를 사용하여 생성된 모든 볼륨을 암호화합니다. EBS는 기본 `aws/ebs` 키 별칭을 사용합니다. 자세한 내용은 Amazon EBS 사용 설명서의 [How Amazon EBS encryption works](https://docs.aws.amazon.com/ebs/latest/userguide/how-ebs-encryption-works.html)을 참조하세요. 이 값은 선택 사항이지만 권장됩니다.
+  `storageclass.kubernetes.io/is-default-class: "true"`-영구 볼륨 클레임에서 다른 볼륨 클래스를 지정하지 않는 한 Kubernetes는 기본적으로 이 스토리지 클래스를 사용합니다. 이 값은 선택 사항입니다. 다른 스토리지 컨트롤러에서 마이그레이션하는 경우 이 값을 설정할 때 주의하세요.

## 자체 관리형 KMS 키를 사용하여 EBS 볼륨 암호화
<a name="_use_self_managed_kms_key_to_encrypt_ebs_volumes"></a>

자체 관리형 KMS 키를 사용하여 EKS Auto Mode로 자동화된 EBS 볼륨을 암호화하려면 다음을 수행해야 합니다.

1. 자체 관리형 KMS 키를 생성합니다.
   + 자세한 내용은 KMS 사용 설명서의 [Create a symmetric encryption KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/create-symmetric-cmk.html) 또는 [How Amazon Elastic Block Store (Amazon EBS) uses KMS](https://docs.aws.amazon.com/kms/latest/developerguide/services-ebs.html)을 참조하세요.

1. KMS 키에 대한 액세스를 허용하는 새 정책을 생성합니다.
   + 아래의 샘플 IAM 정책을 사용하여 정책을 생성합니다. 새 자체 관리형 KMS 키의 ARN을 삽입합니다. 자세한 내용은 AWS IAM 사용 설명서의 [Creating roles and attaching policies (console)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions_create-policies.html)을 참조하세요.

1. 정책을 EKS 클러스터 역할에 연결합니다.
   + AWS 콘솔을 사용하여 EKS 클러스터 역할의 ARN을 찾습니다. 역할 정보는 **개요** 섹션에 표시됩니다. 자세한 내용은 [Amazon EKS 클러스터 IAM 역할](cluster-iam-role.md) 섹션을 참조하세요.

1. `parameters.kmsKeyId` 필드에서 KMS 키 ID를 참조하도록 `StorageClass`를 업데이트합니다.

### 샘플 자체 관리형 KMS IAM 정책
<a name="_sample_self_managed_kms_iam_policy"></a>

아래 정책에서 다음 값을 업데이트합니다.
+  `<account-id>` - AWS 계정 ID(예: `111122223333`) 
+  `<aws-region>` - 클러스터의 AWS 리전(예: `us-west-2`) 

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "key-auto-policy-3",
  "Statement": [
      {
          "Sid": "Enable IAM User Permissions",
          "Effect": "Allow",
          "Principal": {
              "AWS": "arn:aws:iam::123456789012:root"
          },
          "Action": "kms:*",
          "Resource": "*"
      },
      {
        "Sid": "Allow access through EBS for all principals in the account that are authorized to use EBS",
        "Effect": "Allow",
        "Principal": {
            "AWS": "*"
        },
        "Action": [
            "kms:Encrypt",
            "kms:Decrypt",
            "kms:ReEncrypt*",
            "kms:GenerateDataKey*",
            "kms:CreateGrant",
            "kms:DescribeKey"
        ],
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "kms:CallerAccount": "123456789012",
                "kms:ViaService": "ec2.us-east-1.amazonaws.com"
            }
        }
    }
  ]
}
```

### 샘플 자체 관리형 KMS `StorageClass`
<a name="_sample_self_managed_kms_storageclass"></a>

```
parameters:
  type: gp3
  encrypted: "true"
  kmsKeyId: <custom-key-arn>
```

## `StorageClass` 파라미터 참조
<a name="_storageclass_parameters_reference"></a>

Kubernetes `StorageClass` 리소스에 대한 일반적인 내용은 Kubernetes 설명서의 [Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/)를 참조하세요.

`StorageClass` 리소스의 `parameters` 섹션은 AWS와 관련이 있습니다. 다음 표를 이용하여 사용 가능한 옵션을 검토하세요.


| Parameters | 값 | 기본값 | 설명 | 
| --- | --- | --- | --- | 
|  "csi.storage.k8s.io/fstype"  |  xfs, ext2, ext3, ext4  |  ext4  |  볼륨 생성 중에 형식을 지정할 파일 시스템 유형입니다. 이 파라미터는 대소문자를 구분합니다.  | 
|  "type"  |  io1, io2, gp2, gp3, sc1, st1, standard, sbp1, sbg1  |  gp3  |  EBS 볼륨 유형.  | 
|  "iopsPerGB"  |  |  |  GiB당 초당 I/O 작업. IO1, IO2, GP3 볼륨에 대해 지정할 수 있습니다.  | 
|  "allowAutoIOPSPerGBIncrease"  |  true, false  |  false  |  `"true"`인 경우, CSI 드라이버는 `iopsPerGB * <volume size>`가 너무 낮아 AWS에서 지원하는 IOPS 범위에 맞지 않는 경우 볼륨에 대해 IOPS를 늘립니다. 이렇게 하면 사용자가 너무 작은 PVC 용량 또는 `iopsPerGB` 값을 지정하는 경우에도 동적 프로비저닝이 항상 성공할 수 있습니다. 반면, 이러한 볼륨은 `iopsPerGB`에서 요청된 것보다 IOPS가 높기 때문에 추가 비용이 발생할 수 있습니다.  | 
|  "iops"  |  |  |  초당 I/O 작업. IO1, IO2, GP3 볼륨에 대해 지정할 수 있습니다.  | 
|  "throughput"  |  |  125  |  처리량 단위는 MiB/s입니다. gp3 볼륨 유형이 지정된 경우에만 유효합니다.  | 
|  "encrypted"  |  true, false  |  false  |  볼륨이 암호화되어야 하는지 여부입니다. 유효한 값은 "true" 또는 "false"입니다.  | 
|  "blockExpress"  |  true, false  |  false  |  io2 Block Express 볼륨 생성을 활성화합니다.  | 
|  "kmsKeyId"  |  |  |  볼륨을 암호화할 때 사용할 키의 전체 ARN입니다. 지정하지 않으면 AWS는 볼륨이 있는 리전에 기본 KMS 키를 사용합니다. 변경하지 않으면 `/aws/ebs`라는 자동 생성된 키가 됩니다.  | 
|  "blockSize"  |  |  |  기본 파일 시스템을 포맷할 때 사용할 블록 크기입니다. Linux 노드와 fstype `ext2`, `ext3`, `ext4` 또는 `xfs`에서만 지원됩니다.  | 
|  "inodeSize"  |  |  |  기본 파일 시스템을 포맷할 때 사용할 inode 크기입니다. Linux 노드와 fstype `ext2`, `ext3`, `ext4` 또는 `xfs`에서만 지원됩니다.  | 
|  "bytesPerInode"  |  |  |  기본 파일 시스템을 포맷할 때 사용할 `bytes-per-inode`입니다. linux 노드와 fstype `ext2`, `ext3`, `ext4`에서만 지원됩니다.  | 
|  "numberOfInodes"  |  |  |  기본 파일 시스템을 포맷할 때 사용할 `number-of-inodes`입니다. linux 노드와 fstype `ext2`, `ext3`, `ext4`에서만 지원됩니다.  | 
|  "ext4BigAlloc"  |  true, false  |  false  |  `bigalloc` 형식 지정 옵션을 활성화하여 클러스터링된 블록 할당을 사용하도록 `ext4` 파일 시스템을 변경합니다. 경고: `bigalloc`가 노드의 Linux 커널에서 완전히 지원되지 않을 수 있습니다.  | 
|  "ext4ClusterSize"  |  |  |  `bigalloc` 기능이 활성화된 경우 `ext4` 파일 시스템을 포맷할 때 사용할 클러스터 크기입니다. 참고: `ext4BigAlloc` 파라미터를 true로 설정해야 합니다.  | 

자세한 내용은 GitHub의 [AWS EFS CSI 드라이버](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/parameters.md)를 참조하세요.

## 고려 사항
<a name="_considerations"></a>

**참고**  
EKS Auto Mode 노드의 EKS Auto Mode StorageClasses에 따라 워크로드만 배포할 수 있습니다. 노드 유형이 혼합된 클러스터가 있는 경우 EKS Auto Mode 노드에서만 실행되도록 워크로드를 구성해야 합니다. 자세한 내용은 [EKS Auto Mode 노드에 워크로드 배포 여부 제어](associate-workload.md) 섹션을 참조하세요.

EKS Auto Mode의 블록 스토리지 기능은 EBS CSI 드라이버와 다릅니다.
+ 정적 프로비저닝
  + EKS Auto Mode에서 외부에서 생성된 EBS 볼륨을 사용하려면 키 `eks:eks-cluster-name`와 클러스터 이름의 값이 포함된 AWS 태그를 수동으로 추가해야 합니다.
+ 노드 시작 테인트
  + 노드 시작 테인트 기능을 사용하여 스토리지 기능 준비 전에 포드 예약을 방지할 수 없습니다.
+ 동적으로 프로비저닝된 볼륨의 사용자 지정 태그
  + 추가 태그 CLI 플래그를 사용하여 동적으로 프로비저닝된 EBS 볼륨에 사용자 지정 태그를 구성할 수 없습니다.
  + `StorageClass` 태깅을 사용하여 사용자 지정 태그를 추가할 수 있습니다. EKS Auto Mode는 연결된 AWS 리소스에 태그를 추가합니다. 사용자 지정 태그에 대한 클러스터 IAM 역할을 업데이트해야 합니다. 자세한 내용은 [EKS Auto 리소스에 대한 사용자 지정 AWS 태그](auto-learn-iam.md#tag-prop) 섹션을 참조하세요.
+ EBS 세부 성능 지표
  + EBS 세부 성능에 대한 Prometheus 지표에 액세스할 수 없습니다.

## CSI 스냅샷 컨트롤러 추가 기능 설치
<a name="_install_csi_snapshot_controller_add_on"></a>

EKS Auto Mode는 CSI 스냅샷 컨트롤러 Amazon EKS 추가 기능과 호환됩니다.

 AWS에서는 이 추가 기능을 내장 `system` 노드 풀에서 실행하도록 구성할 것을 제안합니다.

자세한 내용은 다음을 참조하세요.
+  [전용 인스턴스에서 핵심 추가 기능 실행](critical-workload.md) 
+  [내장 NodePools 활성화 또는 비활성화](set-builtin-node-pools.md) 
+  [CSI 볼륨의 스냅샷 기능 활성화](csi-snapshot-controller.md) 

### 시스템 노드 풀에 스냅샷 컨트롤러를 설치하려면
<a name="auto-install-snapshot-controller"></a>

1. AWS 콘솔에서 EKS 클러스터 열기

1. **추가 기능** 탭에서 **추가 기능 더 가져오기**를 선택합니다.

1. **CSI 스냅샷 컨트롤러**와 **다음**을 차례로 선택합니다.

1. **선택한 추가 기능 설정 구성** 페이지에서 **선택적 구성 설정**을 선택하여 **추가 기능 구성 스키마**를 확인합니다.

   1. 스냅샷 컨트롤러를 `system` 노드 풀과 연결하려면 다음 yaml을 삽입합니다. 스냅샷 컨트롤러에는 `CriticalAddonsOnly` 테인트에 대한 허용치가 포함됩니다.

      ```
      {
              "nodeSelector": {
                  "karpenter.sh/nodepool": "system"
              }
      }
      ```

   1. **다음**을 선택합니다.

1. 추가 기능 구성을 검토한 다음 **생성**을 선택합니다.