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

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

Amazon EBS CSI 驱动程序

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

本主题介绍了如何部署 Amazon EKS CSI 驱动程序到 Amazon EKS 集群,并验证它是否正常工作。

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

Prerequisites

  • 现有 1.17 或更高版本的集群。如果您没有,请参阅Amazon EKS 入门创建一个。

  • 适用于您集群的现有 IAM OpenID Connect (OIDC) 提供商。要确定您是否已经拥有或创建一个,请参阅为您的集群创建 IAM OIDC 提供商

  • Amazon CLI版本 1.19.75 或更高版本或 2.2.5 安装在您的计算机上。要安装或升级Amazon CLI,请参阅安装、更新和卸载Amazon CLI

  • kubectl版本 1.17 或更高版本安装在计算机上。要安装或升级 kubectl,请参阅安装 kubectl

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

  1. 创建允许 CSI 驱动程序服务账户调用Amazon代表您访问的 API。您可以查看 GitHub 上的策略文档

    1. 从 GitHub 下载 IAM 策略文档。

      curl -o example-iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/v1.0.0/docs/example-iam-policy.json
    2. 创建策略。您可以更改AmazonEKS_EBS_CSI_Driver_Policy设置为不同的名称,但如果您这样做,请确保在后面的步骤中更改它。

      aws iam create-policy \ --policy-name AmazonEKS_EBS_CSI_Driver_Policy \ --policy-document file://example-iam-policy.json
  2. 创建 IAM 角色并向其附加此 IAM 策略。您可以使用eksctl或Amazon CLI。

    eksctl

    Replacemy-cluster将替换为您的集群的名称,111122223333使用您的账户 ID。

    eksctl create iamserviceaccount \ --name ebs-csi-controller-sa \ --namespace kube-system \ --cluster my-cluster \ --attach-policy-arn arn:aws-cn:iam::111122223333:policy/AmazonEKS_EBS_CSI_Driver_Policy \ --approve \ --override-existing-serviceaccounts

    检索创建角色的 ARN 并记下返回的值,以便在下一个步骤中使用。

    aws cloudformation describe-stacks \ --stack-name eksctl-my-cluster-addon-iamserviceaccount-kube-system-ebs-csi-controller-sa \ --query='Stacks[].Outputs[?OutputKey==`Role1`].OutputValue' \ --output text

    输出

    arn:aws:iam::111122223333:role/eksctl-my-cluster-addon-iamserviceaccount-kube-sy-Role1-1J7XB63IN3L6T
    Amazon CLI
    1. 查看集群的 OIDC 提供商 URL。Replacecluster_name与您的集群名称一起使用。如果命令的输出是None,请查看先决条件

      aws eks describe-cluster \ --name cluster_name \ --query "cluster.identity.oidc.issuer" \ --output text

      输出

      https://oidc.eks.cn-north-1.amazonaws.com.cn/id/XXXXXXXXXX45D83924220DC4815XXXXX
    2. 创建 IAM 角色。

      1. 将以下内容复制到名为trust-policy.json。Replace111122223333使用您的账户 ID,REGION与您的区域一起使用,并XXXXXXXXXX45D83924220DC4815XXXXX替换为上一步中返回的值。

        { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws-cn:iam::111122223333:oidc-provider/oidc.eks.REGION.amazonaws.com.cn/id/XXXXXXXXXX45D83924220DC4815XXXXX" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.REGION.amazonaws.com.cn/id/XXXXXXXXXX45D83924220DC4815XXXXX:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa" } } } ] }
      2. 创建 角色。您可以更改AmazonEKS_EBS_CSI_DriverRole设置为不同的名称,但如果您这样做,请确保在后面的步骤中更改它。

        aws iam create-role \ --role-name AmazonEKS_EBS_CSI_DriverRole \ --assume-role-policy-document file://"trust-policy.json"
    3. 将 IAM 策略附加到角色。

      region="BJS"aws iam attach-role-policy \ --policy-arn arn:aws-cn:iam::AWS_ACCOUNT_ID:policy/AmazonEKS_EBS_CSI_Driver_Policy \ --role-name AmazonEKS_EBS_CSI_DriverRole
  3. 您可以使用 Helm 或清单部署驱动程序。

    Helm

    使用头盔 V3 或更高版本安装亚马逊 EBS CSI 驱动程序。要安装或更新 Helm,请参阅配合使用 Amazon EKS 配合使用 Helm 与

    1. 添加aws-ebs-csi-driverHelm 存储库:

      helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver helm repo update
    2. 使用 Helm 图表安装驱动程序的版本。

      helm upgrade -install aws-ebs-csi-driver aws-ebs-csi-driver/aws-ebs-csi-driver \ --namespace kube-system \ --set enableVolumeResizing=true \ --set enableVolumeSnapshot=true \ --set serviceAccount.controller.create=false \ --set serviceAccount.controller.name=ebs-csi-controller-sa \ --set image.repository=918309763551.dkr.ecr.cn-north-1.amazonaws.com.cn/eks/aws-ebs-csi-driver \ --set sidecars.provisionerImage.repository=public.ecr.aws/eks-distro/kubernetes-csi/external-provisioner \ --set sidecars.provisionerImage.tag=v2.1.1-eks-1-20-1 \ --set sidecars.attacherImage.repository=public.ecr.aws/eks-distro/kubernetes-csi/external-attacher \ --set sidecars.attacherImage.tag=v3.1.0-eks-1-20-1 \ --set sidecars.snapshotterImage.repository=public.ecr.aws/eks-distro/kubernetes-csi/external-snapshotter/csi-snapshotter \ --set sidecars.snapshotterImage.tag=v3.0.3-eks-1-20-1 \ --set sidecars.livenessProbeImage.repository=public.ecr.aws/eks-distro/kubernetes-csi/livenessprobe \ --set sidecars.livenessProbeImage.tag=v2.2.0-eks-1-20-1 \ --set sidecars.resizerImage.repository=public.ecr.aws/eks-distro/kubernetes-csi/external-resizer \ --set sidecars.resizerImage.tag=v1.1.0-eks-1-20-1 \ --set sidecars.nodeDriverRegistrarImage.repository=public.ecr.aws/eks-distro/kubernetes-csi/node-driver-registrar \ --set sidecars.nodeDriverRegistrarImage.tag=v2.1.0-eks-1-20-1 \ --set snapshotController.repository=public.ecr.aws/eks-distro/kubernetes-csi/external-snapshotter/snapshot-controller \ --set snapshotController.tag=v3.0.3-eks-1-20-1
    Manifest

    您可以部署驱动程序以创建带有或不带标记的卷。

    • 带标签— 部署驱动程序,以便它使用您指定的标签来标记它创建的所有 Amazon EBS 卷。

      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. 注释ebs-csi-controller-saKubernetes 服务账户与您之前创建的 IAM 角色的 ARN。使用与上一步中用于创建角色的工具匹配的命令。Replace111122223333使用您的账户 ID。

        • 使用创建的角色eksctl

          kubectl annotate serviceaccount ebs-csi-controller-sa \ -n kube-system \ eks.amazonaws.com/role-arn=arn:aws-cn:iam::111122223333:role/eksctl-my-cluster-addon-iamserviceaccount-kube-sy-Role1-1J7XB63IN3L6T
        • 使用Amazon CLI。

          kubectl annotate serviceaccount ebs-csi-controller-sa \ -n kube-system \ eks.amazonaws.com/role-arn=arn:aws-cn:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole
      6. 删除驱动程序窗格。它们将使用分配给角色的 IAM 策略中的 IAM 权限自动重新部署。

        kubectl delete pods \ -n kube-system \ -l=app=ebs-csi-controller
    • 不含标签— 部署驱动程序,使其不会标记它创建的 Amazon EBS 卷。要查看或下载kustomization.yaml文件,请参阅file(位于 GitHub 上)。

      1. 应用清单

        kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable-cn/?ref=master"
      2. 注释ebs-csi-controller-saKubernetes 服务账户与您之前创建的 IAM 角色的 ARN。使用与上一步中用于创建角色的工具匹配的命令。Replace111122223333使用您的账户 ID。

        • 使用创建的角色eksctl

          kubectl annotate serviceaccount ebs-csi-controller-sa \ -n kube-system \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/eksctl-my-cluster-addon-iamserviceaccount-kube-sy-Role1-1J7XB63IN3L6T
        • 使用Amazon CLI。

          kubectl annotate serviceaccount ebs-csi-controller-sa \ -n kube-system \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole
      3. 删除驱动程序窗格。它们将使用分配给角色的 IAM 策略中的 IAM 权限自动重新部署。

        kubectl delete pods \ -n kube-system \ -l=app=ebs-csi-controller

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

此过程使用动态卷资源调配示例来自Amazon EBS Container Storage Interface (CSI) 驱动程序GitHub 存储库使用动态配置的 Amazon EBS 卷。您可以部署使用卷快照或者调整卷大小按照 GitHub 上的说明进行操作。

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

    git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/deploy/kubernetes/overlays/stable/ecr/kustomization.yaml
  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. 查看默认命名空间中的 Podds 并等待app窗格的状态将变为Running

    kubectl get pods --watch

    EnterCtrl+C返回到 shell 提示符。

  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. 描述持久性卷,将pvc-37717cd6-d0dc-11e9-b17f-06fad4858a5a使用上一步中输出的值。

    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 [cn-north-1d] 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>

    亚马逊 EBS 卷编号是VolumeHandle在上一个输出中。

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

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

    输出:

    Wed May 5 16:17:03 UTC 2021 Wed May 5 16:17:08 UTC 2021 Wed May 5 16:17:13 UTC 2021 Wed May 5 16:17:18 UTC 2021 ...
  9. 完成试验时,请删除此示例应用程序来清除资源。

    kubectl delete -f specs/