

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# ストレージクラスを作成する
<a name="create-storage-class"></a>

Amazon EKS Auto Mode の `StorageClass` は、アプリケーションが永続的ストレージをリクエストしたときの Amazon EBS ボリュームを自動的にプロビジョニングする方法を定義します。このページでは、Amazon EKS Auto Mode で動作する `StorageClass` を作成して設定し、EBS ボリュームをプロビジョニングする方法について説明します。

`StorageClass` を設定することで、ボリュームタイプ、暗号化、IOPS、その他のストレージパラメータなど、EBS ボリュームのデフォルト設定を指定できます。暗号化管理に AWS KMS キーを使用するように `StorageClass` を設定することもできます。

EKS Auto Mode では、お客様用の `StorageClass` は作成されません。EKS Auto Mode のストレージ機能を使用するには、`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` - `matchLabelExpressions` を `eks.amazonaws.com/compute-type:auto` に一致するように指定した場合、自動モードを使用してポッドに必要なボリュームを自動的にプロビジョニングするようにすれば、そのポッドは自動以外のノードにスケジュールされなくなります。
+  `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 ユーザーガイド」の「[ロールの作成とポリシーのアタッチ (コンソール)](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 ドキュメントの「[ストレージクラス](https://kubernetes.io/docs/concepts/storage/storage-classes/)」を参照してください。

`StorageClass` リソースの `parameters` セクションは AWS に固有です。次の表を使用して使用可能なオプションを確認してください。


| パラメータ | 値 | デフォルト  | 説明  | 
| --- | --- | --- | --- | 
|  「csi.storage.k8s.io/fstype」  |  xfs、ext2、ext3、ext4  |  ext4  |  ボリュームの作成時にフォーマットされるファイルシステムタイプ。このパラメータは大文字と小文字が区別されます。  | 
|  「type」  |  io1、io2、gp2、gp3、sc1、st1、standard、sbp1、sbg1  |  gp3  |  EBS ボリュームタイプ。  | 
|  「iopsPerGB」  |  |  |  GiB ごとの 1 秒あたりの I/O オペレーション回数秒。IO1、IO2、GP3 ボリュームで指定できます。  | 
|  「allowAutoIOPSPerGBIncrease」  |  true、false  |  false  |  `"true"` であると、`iopsPerGB * <volume size>` が小さすぎて AWS でサポートされている IOPS 範囲に収まらない場合に、CSI ドライバーによりボリュームの IOPS が増加します。この結果、ユーザーが指定する PVC キャパシティーや `iopsPerGB` 値が小さすぎる場合でも、動的プロビジョニングが常に成功します。一方、このようなボリュームの IOPS は `iopsPerGB` でリクエストされた値よりも高くなるため、追加コストが発生する可能性があります。  | 
|  「iops」  |  |  |  1 秒あたりの I/O オペレーション回数。IO1、IO2、GP3 ボリュームで指定できます。  | 
|  「throughput」  |  |  125  |  単位 MiB/秒でのスループット。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` ファイルシステムを変更します。警告: ノードの Linux カーネルでは `bigalloc` が完全にはサポートされない場合があります。  | 
|  「ext4ClusterSize」  |  |  |  `bigalloc` 機能が有効になっている場合に、`ext4` ファイルシステムをフォーマットするときに使用するクラスターサイズ。注: `ext4BigAlloc` パラメータを true に設定する必要があります。  | 

詳細については、GitHub の「[AWS EBS CSI Driver](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/parameters.md)」を参照してください。

## 考慮事項
<a name="_considerations"></a>

**注記**  
EKS オートモードノードの EKS オートモード StorageClasses に依存するワークロードのみをデプロイできます。ノードのタイプが混在するクラスターがある場合は、ワークロードを EKS オートモードノードでのみ実行するように設定する必要があります。詳細については、「[ワークロードが 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) 
+  [組み込み NodePool を有効または無効にする](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. 次の yaml を挿入して、スナップショットコントローラーを `system` ノードプールに関連付けます。スナップショットコントローラーには、`CriticalAddonsOnly` テイントの許容が含まれています。

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

   1. **[次へ]** を選択します 

1. アドオン設定を確認し、**[作成]** を選択します 