

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 部署具狀態工作負載範例至 EKS 自動模式
<a name="sample-storage-workload"></a>

這項教學課程將引導您部署具狀態範例應用程式至 EKS 自動模式叢集。應用程式可將時間戳記寫入持續性磁碟區，從而示範 EKS 自動模式的自動 EBS 磁碟區佈建與持續保留功能。

## 先決條件
<a name="_prerequisites"></a>
+ EKS 自動模式叢集
+ 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`。您必須建立 `StorageClass` 參考 `ebs.csi.eks.amazonaws.com`，以使用 EKS 自動模式的儲存功能。

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 自動模式
+  `volumeBindingMode: WaitForFirstConsumer` - 延遲建立磁碟區，直至 Pod 需要磁碟區
+  `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` - 請求 8 GiB 磁碟區
+  `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 
+ 請求 1 個 CPU 核心
+ 針對 EKS 受管節點使用節點選擇器

## 步驟 5：驗證設定
<a name="_step_5_verify_the_setup"></a>

1. 檢查 Pod 是否在執行中：

   ```
   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. 排程 Pod 時：

   1. EKS 自動模式可佈建 EBS 磁碟區

   1. 建立 PersistentVolume

   1. 連接磁碟區至節點

1. Pod 會掛載磁碟區及開始撰寫時間戳記

## 快照控制器
<a name="_snapshot_controller"></a>

EKS 自動模式與 Kubernetes CSI 快照器相容，亦稱為快照控制器。然而，EKS 自動模式不包括快照控制器。您將負責安裝及設定快照控制器。如需詳細資訊，請參閱 [啟用 CSI 磁碟區的快照功能](csi-snapshot-controller.md)。

請檢閱下列參考 EKS 自動模式儲存功能的 `VolumeSnapshotClass`。

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

 [了解 Kubernetes CSI 快照器的相關詳細資訊。](https://github.com/kubernetes-csi/external-snapshotter/blob/master/README.md#usage)