管理 Amazon EBS CSI 自行管理的附加组件 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

管理 Amazon EBS CSI 自行管理的附加组件

本主题介绍如何将 Amazon EBS CSI 驱动程序作为自我管理的附加组件部署到您的 Amazon EKS 集群,并检验是否正常工作。

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

先决条件

  • 现有 1.17 版或更高版本的集群。如果没有集群,请参阅 开始使用 Amazon EKS 创建一个。

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

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

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

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

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

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

      curl -o example-iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/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

    请将 my-cluster 替换为您的集群名称,并将 111122223333 替换为您的账户 ID。

    eksctl create iamserviceaccount \ --name ebs-csi-controller-sa \ --namespace kube-system \ --cluster my-cluster \ --attach-policy-arn arn:aws: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。将 my-cluster 替换为您的集群名称。如果命令的输出为 None,请查看先决条件

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

      输出如下所示。

      https://oidc.eks.region-code.amazonaws.com.cn/id/oidc-id
    2. 创建 IAM 角色。

      1. 将以下内容复制到名为 trust-policy.json 的文件中。将 111122223333 替换为您的账户 ID,将 region-code 替换为您的 Amazon Web Services 区域,并将 oidc-id 替换为上一步骤中返回的值。

        { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/oidc-id" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com.cn/id/oidc-id: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 策略。将 111122223333 替换为您的账户 ID。

      aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_EBS_CSI_Driver_Policy \ --role-name AmazonEKS_EBS_CSI_DriverRole
  3. 您可以使用 Helm 或清单部署驱动程序。有关使用 Helm 的驱动程序兼容性,请参阅 Github 上的 Kubernetes 版本兼容性列表。如果要安装较旧版本的 Amazon EBS CSI 驱动程序,请使用清单。

    Helm

    使用 Helm V3 或更高版本安装 Amazon EBS CSI 驱动程序。要安装或更新 Helm,请参阅 将 Helm 与 Amazon EKS 结合使用

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

      helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver helm repo update
    2. 使用 Helm Chart 安装驱动程序的版本。将存储库地址替换为集群的容器镜像地址。使用与上一步骤中用于创建角色的工具相匹配的命令。

      • 如果使用 eksctl 创建角色,请使用以下命令。

        helm upgrade -install aws-ebs-csi-driver aws-ebs-csi-driver/aws-ebs-csi-driver \ --namespace kube-system \ --set image.repository=123456789012.dkr.ecr.region-code.amazonaws.com.cn/eks/aws-ebs-csi-driver \ --set controller.serviceAccount.create=false \ --set controller.serviceAccount.name=ebs-csi-controller-sa \ --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
      • 如果使用 Amazon CLI 创建角色,请使用下面的命令和创建的正确角色 ARN。

        helm upgrade -install aws-ebs-csi-driver aws-ebs-csi-driver/aws-ebs-csi-driver \ --namespace kube-system \ --set image.repository=123456789012.dkr.ecr.region-code.amazonaws.com.cn/eks/aws-ebs-csi-driver \ --set controller.serviceAccount.create=true \ --set controller.serviceAccount.name=ebs-csi-controller-sa \ --set controller.serviceAccount.annotations."eks\.amazonaws\.com\.cn/role-arn"="arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole"
    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. 导航到 ecr 文件夹。

        cd ../overlays/stable/ecr
        注意

        如果集群不在 us-west-2 Amazon Web Services 区域,请将 kustomization.yaml 文件中的 602401143452.dkr.ecr.us-west-2.amazonaws.com 更改为集群的容器镜像地址

      5. 将修改后的清单应用于集群。

        kubectl apply -k ../ecr
      6. 使用您以前创建的 IAM 角色的 ARN 对 ebs-csi-controller-sa Kubernetes 服务账户添加注释。使用与上一步骤中用于创建角色的工具相匹配的命令。将 111122223333 替换为您的账户 ID。

        • 如果您之前是使用 eksctl 创建的角色,请使用此命令。

          kubectl annotate serviceaccount ebs-csi-controller-sa \ -n kube-system \ eks.amazonaws.com.cn/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.cn/role-arn=arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole
      7. 重新启动 ebs-csi-controller 部署。

        kubectl rollout restart \ deployment ebs-csi-controller \ -n kube-system
    • 不带标签 – 部署驱动程序,使其不会对它所创建的 Amazon EBS 卷添加标签。要查看或下载 kustomization.yaml 文件,请参阅 GitHub 上的文件

      注意

      如果集群不在 us-west-2 Amazon Web Services 区域,请将 kustomization.yaml 文件中的 602401143452.dkr.ecr.us-west-2.amazonaws.com 更改为集群的容器镜像地址。然后,在本地应用清单。

      1. 运用该清单。

        kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable-cn/ecr/?ref=master"
      2. 使用您以前创建的 IAM 角色的 ARN 对 ebs-csi-controller-sa Kubernetes 服务账户添加注释。使用与上一步骤中用于创建角色的工具相匹配的命令。将 111122223333 替换为您的账户 ID。

        • 如果您之前是使用 eksctl 创建的角色,请使用此命令。

          kubectl annotate serviceaccount ebs-csi-controller-sa \ -n kube-system \ eks.amazonaws.com.cn/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.cn/role-arn=arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole
      3. 删除驱动程序 Pod。将使用分配给角色的 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. ebs-sc 目录部署 ebs-claim 存储类、app 持久性卷声明和 specs 示例应用程序。

    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(一组容器)的状态变为 Running

    kubectl get pods --watch

    输入 Ctrl+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 [region-code] 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 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/