

 **帮助改进此页面** 

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

# 创建存储类
<a name="create-storage-class"></a>

Amazon EKS 自动模式中的 `StorageClass` 定义了应用程序请求持久性存储时如何自动预置 Amazon EBS 卷。本页介绍如何创建和配置可与 Amazon EKS 自动模式配合使用的 `StorageClass`，从而预置 EBS 卷。

通过配置 `StorageClass`，您可以指定 EBS 卷的默认设置，包括卷类型、加密、IOPS 和其他存储参数。您还可以将 `StorageClass` 配置为使用 AWS KMS 密钥进行加密管理。

EKS 自动模式不会为您创建 `StorageClass`。您必须创建引用 `ebs.csi.eks.amazonaws.com` 的 `StorageClass`，才能使用 EKS 自动模式的存储功能。

首先创建一个名为 `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 自动模式
+  `allowedTopologies`：指定与 `eks.amazonaws.com/compute-type:auto` 匹配的 `matchLabelExpressions` 将确保，如果容器组（pod）需要使用自动模式自动预置卷，则不会在非自动节点上调度容器组（pod）。
+  `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 自动模式自动预置的 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. 更新 `StorageClass` 以在 `parameters.kmsKeyId` 字段中引用该 KMS 密钥 ID。

### 自主管理型 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。请使用下表来查看可用的选项。


| Parameters | 值 | 默认值 | 说明 | 
| --- | --- | --- | --- | 
|  "csi.storage.k8s.io/fstype"  |  xfs、ext2、ext3、ext4  |  ext4  |  将在创建卷时进行格式化的文件系统类型。此参数区分大小写！  | 
|  "type"  |  io1、io2、gp2、gp3、sc1、st1、标准、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` 值太小。不过这可能会带来额外的成本，因为此类卷的 IOPS 高于 `iopsPerGB` 中请求的值。  | 
|  "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 节点和文件系统类型 `ext2`、`ext3`、`ext4` 或 `xfs`。  | 
|  "inodeSize"  |  |  |  格式化底层文件系统时要使用的索引节点大小。仅支持 linux 节点和文件系统类型 `ext2`、`ext3`、`ext4` 或 `xfs`。  | 
|  "bytesPerInode"  |  |  |  格式化底层文件系统时要使用的 `bytes-per-inode`。仅支持 linux 节点和文件系统类型 `ext2`、`ext3` 或 `ext4`。  | 
|  "numberOfInodes"  |  |  |  格式化底层文件系统时要使用的 `number-of-inodes`。仅支持 linux 节点和文件系统类型 `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 自动模式节点上](associate-workload.md)。

EKS 自动模式的块存储功能与 EBS CSI 驱动程序不同。
+ 静态预置
  + 要将外部创建的 EBS 卷与 EKS 自动模式结合使用，需要手动添加键为 `eks:eks-cluster-name`，值为集群名称的 AWS 标签。
+ 节点启动污点
  + 在存储容量准备就绪之前，不能使用节点启动污点功能来阻止容器组调度
+ 动态预置卷上的自定义标签
  + 不能使用 extra-tag CLI 标志在动态预置 EBS 卷上配置自定义标签
  + 可以使用 `StorageClass` 标记功能来添加自定义标签。EKS 自动模式将为关联的 AWS 资源添加标签。您需要更新自定义标签的集群 IAM 角色。有关更多信息，请参阅 [EKS 自动模式资源的自定义 AWS 标签](auto-learn-iam.md#tag-prop)。
+ EBS 详细性能指标
  + 您无法访问 Prometheus 指标来了解 EBS 的详细性能

## 安装 CSI 快照控制器附加组件
<a name="_install_csi_snapshot_controller_add_on"></a>

EKS 自动模式与 CSI 快照控制器 Amazon EKS 附加组件兼容。

 AWS 建议将此附加组件配置为在内置的 `system` 节点池上运行。

有关更多信息，请参阅：
+  [在专用实例上运行关键附加组件](critical-workload.md) 
+  [启用或禁用内置节点池](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. 检查附加组件配置，然后选择**创建** 