Amazon EBS CSI 驱动程序 - Amazon EKS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon EBS CSI 驱动程序

Amazon EBS Container Storage Interface (CSI) 驱动程序 提供了一个 CSI 接口,允许 Amazon EKS 集群管理持久性卷的 Amazon EBS 卷的生命周期。

本主题介绍了如何部署 Amazon EBS CSI 驱动程序到 Amazon EKS 集群,并验证它是否正常工作。我们建议使用驱动程序版本 v0.8.0。

注意

驱动程序在 Fargate 上不受支持。Amazon EKS 集群上不支持 Amazon EBS CSI 驱动程序的 Alpha 功能。驱动程序处于 Beta 版本。它经过了很好的测试且 Amazon EKS 支持将它用于生产。不会删除对此驱动程序的支持,尽管详细信息可能会发生变化。如果驱动程序的架构或原理图发生变化,则将提供迁移到下一版本的说明。

有关可用参数的详细说明以及演示驱动程序功能的完整示例,请参阅 上的 Amazon EBS Container Storage Interface (CSI) 驱动程序项目。GitHub

将 Amazon EBS CSI 驱动程序部署到 Amazon EKS 集群

  1. 为节点实例配置文件创建一个名为 IAM 的 Amazon_EBS_CSI_Driver 策略,该策略允许 Amazon EBS CSI 驱动程序代表您调用 AWS APIs。使用以下 AWS CLI 命令在 AWS 账户中创建 IAM 策略。您可以在 上GitHub查看策略文档。

    1. 从 GitHub 下载策略文档。

      curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/v0.8.0/docs/example-iam-policy.json
    2. 创建策略。

      aws iam create-policy --policy-name Amazon_EBS_CSI_Driver \ --policy-document file://example-iam-policy.json

    记下返回的策略 ARN。

  2. 获取节点的 IAM 角色名称。可使用以下命令打印 aws-auth configmap。

    kubectl -n kube-system describe configmap aws-auth

    输出:

    Name: aws-auth Namespace: kube-system Labels: <none> Annotations: <none> Data ==== mapRoles: ---- - groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-XXXXXXXXXXXX username: system:node:{{EC2PrivateDNSName}}

    记录已向其分配 system:nodes 组的任何 rolearn 值的角色名称。在前面的示例输出中,角色名称为 eksctl-my-cluster-my-nodegroup-NodeInstanceRole-XXXXXXXXXXXX。 集群中的每个节点组应具有一个值。

  3. 使用以下命令将新的 Amazon_EBS_CSI_Driver IAM 策略附加到您之前标识的每个节点 IAM 角色,同时将红色文本替换为您自己的 AWS 账号和节点 IAM 角色名称。

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::<111122223333>:policy/Amazon_EBS_CSI_Driver \ --role-name <eksctl-my-cluster-my-nodegroup-NodeInstanceRole-XXXXXXXXXXXX>
  4. 如果您希望驱动程序使用相同的标签标记 Amazon EBS CSI 驱动程序创建的所有 Amazon EBS 卷,请完成以下步骤。如果您不希望驱动程序标记其创建的卷,请跳至步骤 5。

    1. Amazon EBS Container Storage Interface (CSI) 驱动程序 GitHub 存储库克隆到您的计算机。

      git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
    2. 导航到 base 示例文件夹。

      cd aws-ebs-csi-driver/deploy/kubernetes/base/
    3. 编辑 controller.yaml 文件。查找包含以下文本的文件部分,并将 --extra-tags 添加到其中。以下文本显示文件中具有现有文本和已添加文本的部分。此示例将促使控制器将 departmentenvironment 标签添加到它创建的所有卷。

      ... containers: - name: ebs-plugin image: amazon/aws-ebs-csi-driver:latest imagePullPolicy: IfNotPresent args: # - {all,controller,node} # specify the driver mode - --endpoint=$(CSI_ENDPOINT) - --logtostderr - --v=5 - --extra-tags=department=accounting,environment=dev ...
    4. 将修改后的清单应用于集群。

      kubectl apply -k ../base
  5. 如果您已完成步骤 4,请跳过此步骤。使用与集群所在的区域对应的命令部署 Amazon EBS CSI 驱动程序。

    注意

    此命令要求使用版本 1.14 或更高版本的 kubectl。 您可以使用以下命令查看您的 kubectl 版本。要安装或升级 kubectl 版本,请参阅 安装kubectl

    kubectl version --client --short
    • 区域之外的所有区域。中国

      kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/?ref=master"
    • 北京和宁夏 中国区域。

      kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable-cn/?ref=master"

部署一个示例应用程序并验证 CSI 驱动程序是否正常运行

此过程使用 https://github.com/kubernetes-sigs/aws-ebs-csi-driver/tree/master/examples/kubernetes/dynamic-provisioning Container Storage Interface (CSI) 驱动程序 存储库中的Amazon EBS动态卷预配置示例来使用动态预配置的 GitHub 卷。Amazon EBS

  1. Amazon EBS Container Storage Interface (CSI) 驱动程序 存储库克隆到本地系统。GitHub

    git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
  2. 导航到 dynamic-provisioning 示例目录。

    cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/
  3. specs 目录部署 ebs-sc 存储类、ebs-claim 持久性卷声明和 app 示例应用程序。

    kubectl apply -f specs/
  4. 描述 ebs-sc 存储类。

    kubectl describe storageclass ebs-sc

    输出:

    Name: ebs-sc IsDefaultClass: No Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"ebs-sc"},"provisioner":"ebs.csi.aws.com","volumeBindingMode":"WaitForFirstConsumer"} Provisioner: ebs.csi.aws.com Parameters: <none> AllowVolumeExpansion: <unset> MountOptions: <none> ReclaimPolicy: Delete VolumeBindingMode: WaitForFirstConsumer Events: <none>

    请注意,存储类使用 WaitForFirstConsumer 卷绑定模式。这意味着,在 Pod 进行持久性卷声明之前,不会动态预配置卷。有关更多信息,请参阅 Kubernetes 文档中的 卷绑定模式

  5. 查看默认命名空间中的 Pod 并等待 app Pod 进入就绪状态。

    kubectl get pods --watch
  6. 列出默认命名空间中的持久性卷。查找具有 default/ebs-claim 声明的持久性卷。

    kubectl get pv

    输出:

    NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-37717cd6-d0dc-11e9-b17f-06fad4858a5a 4Gi RWO Delete Bound default/ebs-claim ebs-sc 30s
  7. 描述持久性卷。

    kubectl describe pv <pvc-37717cd6-d0dc-11e9-b17f-06fad4858a5a>

    输出:

    Name: pvc-37717cd6-d0dc-11e9-b17f-06fad4858a5a Labels: <none> Annotations: pv.kubernetes.io/provisioned-by: ebs.csi.aws.com Finalizers: [kubernetes.io/pv-protection external-attacher/ebs-csi-aws-com] StorageClass: ebs-sc Status: Bound Claim: default/ebs-claim Reclaim Policy: Delete Access Modes: RWO VolumeMode: Filesystem Capacity: 4Gi Node Affinity: Required Terms: Term 0: topology.ebs.csi.aws.com/zone in [<regiona>] Message: Source: Type: CSI (a Container Storage Interface (CSI) volume source) Driver: ebs.csi.aws.com VolumeHandle: <vol-0d651e157c6d93445> ReadOnly: false VolumeAttributes: storage.kubernetes.io/csiProvisionerIdentity=1567792483192-8081-ebs.csi.aws.com Events: <none>

    Amazon EBS 卷 ID 作为 VolumeHandle 列出。

  8. 验证 Pod 成功将数据写入卷。

    kubectl exec -it app cat /data/out.txt

    输出:

    Wed Jul 8 13:52:09 UTC 2020 Wed Jul 8 13:52:14 UTC 2020 Wed Jul 8 13:52:19 UTC 2020 Wed Jul 8 13:52:24 UTC 2020 Wed Jul 8 13:52:29 UTC 2020 Wed Jul 8 13:52:34 UTC 2020
  9. 完成试验时,请删除此示例应用程序来清除资源。

    kubectl delete -f specs/