

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

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

# ステートフルワークロードのサンプルを EKS Auto Mode にデプロイする
<a name="sample-storage-workload"></a>

このチュートリアルでは、EKS Auto Mode クラスターにステートフルアプリケーションのサンプルをデプロイする方法について説明します。このアプリケーションは永続ボリュームにタイムスタンプを書き込み、EBS 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`は、EBS ボリュームを EKS Auto Mode でプロビジョニングする方法を定義します。

EKS Auto Mode では、お客様用の `StorageClass` は作成されません。EKS Auto Mode のストレージ機能を使用するには、`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. SCP を適用します:

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

 **主要コンポーネント:** 
+  `accessModes: ReadWriteOnce` - ボリュームは一度に 1 つのノードからマウントすることができます
+  `storage: 8Gi` - 8 GiB ボリュームをリクエストします
+  `storageClassName: auto-ebs-sc` - 作成した`StorageClass`を参照します

## ステップ 4: アプリケーションのデプロイ
<a name="_step_4_deploy_the_application"></a>

Deployment は、永続的ボリュームにタイムスタンプを書き込むコンテナを実行します。

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 コンテナ
+ PVC を `/data` にマウントします 
+ 1 CPU コアをリクエストします
+ 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. ポッドはボリュームをマウントし、タイムスタンプの書き込みを開始します

## Snapshot Controller
<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)