

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# Kubernetes 卷存储的 Amazon EC2 实例存储
<a name="lis-csi"></a>

Amazon EC2 实例存储 CSI 驱动程序是一个容器存储接口（CSI）插件，让 Kubernetes 可以使用 EC2 实例存储卷。实例存储卷可提供通过物理方式附加到主机的临时块级存储。该驱动程序管理这些 NVMe 存储卷的生命周期，并将它们作为 [Kubernetes 持久卷](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)提供。

Amazon EC2 实例存储 CSI 驱动程序通过本地 Linux 操作与后端 NVMe 设备进行交互。不涉及任何 AWS API 调用，因此不需要 IAM 角色。

## 注意事项
<a name="lis-csi-considerations"></a>

**重要**  
安装期间，Amazon EC2 实例存储 CSI 驱动程序将擦除临时磁盘上的所有数据。如果其他 CSI 驱动程序或卷管理系统（例如 LVM、原始文件系统、LUKS 等）正在管理临时磁盘，请在安装 Amazon EC2 实例存储 CSI 驱动程序之前备份您的数据，避免数据丢失。
+ Amazon EC2 实例存储 CSI 驱动程序不适用于 EKS 自动模式。
+ 您无法将 Amazon EC2 实例存储卷挂载到 Fargate 容器组（pod）。
+ Amazon EC2 实例存储 CSI 驱动程序不适用于以下实例类型：C1、C3、C4、C5d、C5ad、C6gd、D2、D3、D3en、DL1、E3、Edge1gd、F1、G2、G3、G4ad、G4dn、H1、HSM1、I2、I3、I3.metal、I3en、M1、M2、M3、M4、M5d、M5ad、M5dn、M6gd、P2、P3、P3dn、P4d、P4de、R3、R4、R5d、R5ad、R5dn、R6gd、T1、T2、X1、X1e、X2gd 和 Z1d。
+ 将为最新的附加组件版本和一个先前版本提供支持。在最新版本中发现的错误或漏洞将在新的次要版本中向后移植到先前的版本。
+ 实例存储是临时存储。节点终止时，数据会丢失。对关键数据实施应用程序级复制或备份。
+ 不支持卷扩展。
+ 所有卷都会默认启用 I/O 节流功能，以确保在工作负载之间公平共享带宽。有关更多信息，请参阅 [I/O 节流](#lis-csi-throttling)。
+ 与同类型的旧实例相比，新启动的实例均已更新了 NVMe identify 命令响应。如果您的工具依赖于特定的 NVMe identify 值，请检查您的逻辑是否兼容。有关更多信息，请参阅 [新启动实例上的 NVMe 命名空间更改](#lis-csi-nvme-namespace)。

## 先决条件
<a name="lis-csi-prereqs"></a>

在开始之前，请确保您具有以下各项：
+ 现有 Amazon EKS 集群。要查看附加组件的所有可用版本，请运行以下 AWS CLI 命令：

  ```
  aws eks describe-addon-versions --addon-name aws-ec2-local-instance-store-csi-driver
  ```

## 安装 Amazon EC2 实例存储 CSI 驱动程序
<a name="managing-lis-csi"></a>

Amazon EC2 实例存储 CSI 驱动程序作为 Amazon EKS 附加组件提供。安装该驱动程序后，您的集群便可将实例存储卷用于容器组（pod）存储。

要安装该驱动程序，请将 Amazon EC2 实例存储 CSI 驱动程序附加组件添加到您的集群中。有关说明，请参阅[创建 Amazon EKS 附加组件](creating-an-add-on.md)。有关 EKS 附加组件的更多信息，请参阅 [Amazon EKS 附加组件](eks-add-ons.md)。

## 部署示例应用程序
<a name="lis-sample-app"></a>

安装驱动程序后，可以部署示例应用程序以验证实例存储卷是否在您的集群中正常运行。可以部署各种示例应用程序并根据需要对其进行修改。

## I/O 节流
<a name="lis-csi-throttling"></a>

Amazon EC2 实例存储 CSI 驱动程序包括内置的 I/O 节流功能，可确保在同一 NVMe 控制器上的工作负载之间公平共享带宽。所有卷都会默认启用节流功能，防止任何单个工作负载过多消耗 I/O 带宽，影响同一节点上的其他工作负载。

### 配置节流
<a name="lis-csi-throttling-config"></a>

您可以在两个层面配置节流：
+  **StorageClass 参数**：将 StorageClass 定义中的 `throttling` 参数设置为 `"true"`（默认）或 `"false"`。
+  **PVC 注释**：在单个 PersistentVolumeClaims 上将 `lis.csi.aws.com/throttling` 注释设置为 `"true"` 或 `"false"`。这会覆盖 StorageClass 设置（如果存在）。

下表显示了 StorageClass 参数和 PVC 注释之间的交互方式：


| PVC 注释 | StorageClass 参数 | 结果 | 
| --- | --- | --- | 
| 未设置 | 未设置 | 节流已启用（默认） | 
| 未设置 |  `"false"`  | 节流已禁用 | 
|  `"false"`  |  `"true"` 或未设置 | 节流已禁用 | 
|  `"true"`  |  `"false"`  | 节流已启用 | 

### 创建不启用节流的 StorageClass
<a name="lis-csi-throttling-unthrottled-sc"></a>

要为 StorageClass 中的所有卷禁用节流，请执行以下操作：

```
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ec2-instance-store-unthrottled
provisioner: lis.csi.aws.com
parameters:
  throttling: "false"
volumeBindingMode: WaitForFirstConsumer
```

### 为单个 PVC 禁用节流
<a name="lis-csi-throttling-disable-pvc"></a>

要在使用已启用节流的 StorageClass 时在单个 PVC 上禁用节流，请执行以下操作：

```
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: high-perf-pvc
  annotations:
    lis.csi.aws.com/throttling: "false"
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: ec2-instance-store-sc
  resources:
    requests:
      storage: 100Gi
```

### 节流注意事项
<a name="lis-csi-throttling-considerations"></a>
+ 系统会默认启用节流，以便为共享 NVMe 控制器的所有工作负载提供可预测的性能。
+ 在一个卷上禁用节流会使其消耗更多的 I/O 带宽，这可能会影响同一控制器上其他启用节流的卷的性能。
+ 可考虑使用专用节点来隔离未启用节流的工作负载。
+ 对于跨多个控制器的 RAID-0 卷，将对所有成员分区执行节流。
+ 节点重启后，节流状态会持续存在。

## 新启动实例上的 NVMe 命名空间更改
<a name="lis-csi-nvme-namespace"></a>

新启动的具有本地实例存储的 EC2 实例已经更新了 NVMe Identify Controller 和 Identify Namespace 命令响应。这些更改支持 EC2 本地实例存储上的 NVMe 命名空间管理。现有正在运行的实例不受影响，并且该值会在任何实例的整个生命周期中保持稳定。

### 更新后的字段值
<a name="_updated_field_values"></a>

与同类型的旧实例相比，新启动实例的以下字段发生了更改：
+ OACS 的第 3 位：从 0 更改为 1
+ OAES 的第 8 位：从 0 更改为 1
+ NN：从 1 更改为一个 <= 256 的值
+ TNVMCAP：从 0 更改为本地存储的实际大小
+ NVMCAP：从 0 更改为本地存储的实际大小
+ NGUID：从全部为零更改为有效的 NGUID

所有更新后的值都符合 NVMe 规范。

### 更改范围
<a name="_scope_of_changes"></a>

这些更改仅适用于 EC2 本地实例存储。Amazon EBS 卷不受影响。要区分 EBS 卷和本地实例存储，请运行以下命令：

```
sudo nvme list
```

在输出中：
+  `Amazon Elastic Block Store` = EBS 卷
+  `Amazon EC2 NVMe Instance Storage` = 本地实例存储

### 检索 NVMe identify 的值
<a name="_retrieving_nvme_identify_values"></a>

要使用 `nvme-cli` 查询这些值，请执行以下操作：

```
# Identify Controller
sudo nvme id-ctrl /dev/nvme1

# Identify Namespace
sudo nvme id-ns /dev/nvme1n1
```

### 所需操作
<a name="_action_required"></a>

无需采取行动。这些更改向后兼容，并且符合 NVMe 规范。但如果您的应用程序或工具需要验证或依赖 NVMe identify 命令中的特定值，请检查您的逻辑以确保与新启动实例上更新后的值兼容。