Amazon-EBS-CSI-Treiber - Amazon EKS

Amazon-EBS-CSI-Treiber

Amazon Elastic Block Store (Amazon EBS) Container-Storage-Interface-Treiber (CSI) bietet eine CSI-Schnittstelle, mit der Amazon-Elastic Kubernetes-Service-Cluster (Amazon EKS) den Lebenszyklus von Amazon EBS-Volumes für persistente Volumes verwalten können.

In diesem Thema erfahren Sie, wie Sie den Amazon-EBS-CSI-Treiber für Ihren Amazon-EKS-Cluster bereitstellen und überprüfen, ob er funktioniert.

Anmerkung

Der Treiber wird auf Fargate nicht unterstützt. Alpha-Funktionen des Amazon-EBS-CSI-Treibers werden auf Amazon-EKS-Clustern nicht unterstützt.

Detaillierte Beschreibungen der verfügbaren Parameter und vollständige Beispiele, die die Funktionen des Treibers demonstrieren, finden Sie im Projekt Amazon-EBS-Container-Storage-Interface-Treiber (CSI) auf GitHub.

Prerequisites

So stellen Sie den Amazon-EBS-CSI-Treiber für einen Amazon-EKS-Cluster bereit

  1. Erstellen Sie eine IAM-Richtlinie, mit welcher das Service-Konto des CSI-Treibers in Ihrem Namen Aufrufe an AWS-APIs tätigen kann. Sie können das Richtliniendokument auf GitHub anzeigen.

    1. Laden Sie das IAM-Richtliniendokument von GitHub herunter.

      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. Erstellen Sie die Richtlinie. Sie können AmazonEKS_EBS_CSI_Driver_Policy in einen anderen Namen ändern, aber wenn Sie dies tun, stellen Sie sicher, dass Sie ihn auch in späteren Schritten ändern.

      aws iam create-policy \ --policy-name AmazonEKS_EBS_CSI_Driver_Policy \ --policy-document file://example-iam-policy.json
  2. Erstellen Sie eine IAM-Rolle und fügen Sie ihr die IAM-Richtlinie an. Sie können entweder eksctl oder AWS CLI verwenden.

    eksctl

    Ersetzen Sie my-cluster durch den Namen Ihres Clusters und 111122223333 durch Ihre Konto-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

    Rufen Sie den ARN der erstellten Rolle ab und notieren Sie den zurückgegebenen Wert zur Verwendung in einem späteren Schritt.

    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

    Ausgabe

    arn:aws:iam::111122223333:role/eksctl-my-cluster-addon-iamserviceaccount-kube-sy-Role1-1J7XB63IN3L6T
    AWS CLI
    1. Zeigen Sie die OIDC-Anbieter-URL Ihres Clusters an. Ersetzen Sie cluster_name durch Ihren Clusternamen. Wenn die Ausgabe des Befehls None ist, überprüfen Sie die Voraussetzungen.

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

      Ausgabe

      https://oidc.eks.us-west-2.amazonaws.com/id/XXXXXXXXXX45D83924220DC4815XXXXX
    2. Erstellen Sie die IAM-Rolle.

      1. Kopieren Sie den folgenden Inhalt in eine Datei namens trust-policy.json. Ersetzen Sie 111122223333 durch Ihre Konto-ID, REGION mit Ihrer Region und XXXXXXXXXX45D83924220DC4815XXXXX mit dem Wert, der im vorherigen Schritt zurückgegeben wurde.

        { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.REGION.amazonaws.com/id/XXXXXXXXXX45D83924220DC4815XXXXX" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.REGION.amazonaws.com/id/XXXXXXXXXX45D83924220DC4815XXXXX:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa" } } } ] }
      2. Erstellen Sie die Rolle. Sie können AmazonEKS_EBS_CSI_DriverRole in einen anderen Namen ändern, aber wenn Sie dies tun, stellen Sie sicher, dass Sie ihn auch in späteren Schritten ändern.

        aws iam create-role \ --role-name AmazonEKS_EBS_CSI_DriverRole \ --assume-role-policy-document file://"trust-policy.json"
    3. Fügen Sie die IAM-Richtlinie an die Rolle an.

      aws iam attach-role-policy \ --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/AmazonEKS_EBS_CSI_Driver_Policy \ --role-name AmazonEKS_EBS_CSI_DriverRole
  3. Sie können den Treiber mit Helm oder einem Manifest bereitstellen.

    Helm

    Installieren Sie den Amazon-EBS-CSI-Treiber mit Helm V3 oder höher. Informationen zum Installieren oder Aktualisieren von Helm finden Sie unter Verwendung von Helm mit Amazon EKS.

    1. Fügen Sie das aws-ebs-csi-driver-Helm-Repository hinzu:

      helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver helm repo update
    2. Installieren Sie eine Version des Treibers mithilfe des Helm-Charts. Wenn sich Ihr Cluster nicht in der Region us-west-2 befindet, wechseln Sie 602401143452.dkr.ecr.us-west-2.amazonaws.com zur Container-Image-Adresse Ihrer Region.

      Wenn Sie in Schritt 2 eksctl verwendet haben:

      helm upgrade -install aws-ebs-csi-driver aws-ebs-csi-driver/aws-ebs-csi-driver \ --namespace kube-system \ --set image.repository=602401143452.dkr.ecr.us-west-2.amazonaws.com/eks/aws-ebs-csi-driver \ --set enableVolumeResizing=true \ --set enableVolumeSnapshot=true \ --set controller.serviceAccount.create=false \ --set controller.serviceAccount.name=ebs-csi-controller-sa

      Wenn Sie in Schritt 2 AWS CLI verwendet haben, legen Sie controller.serviceAccount.create=true und controller.serviceAccount.annotations mit dem richtigen Rollen-ARN fest, den Sie erstellt haben:

      helm upgrade -install aws-ebs-csi-driver aws-ebs-csi-driver/aws-ebs-csi-driver \ --namespace kube-system \ --set image.repository=602401143452.dkr.ecr.us-west-2.amazonaws.com/eks/aws-ebs-csi-driver \ --set enableVolumeResizing=true \ --set enableVolumeSnapshot=true \ --set controller.serviceAccount.create=true \ --set controller.serviceAccount.name=ebs-csi-controller-sa \ --set controller.serviceAccount.annotations."eks\.amazonaws\.com/role-arn"="arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole"
    Manifest

    Sie können den Treiber bereitstellen, um Volumes mit oder ohne Tags zu erstellen.

    • Mit Tags – Stellen Sie den Treiber so bereit, dass er alle Amazon-EBS-Volumes kennzeichnet, die er mit von Ihnen angegebenen Tags erstellt.

      1. Klonen Sie das GitHub-Repository Amazon-EBS-Container-Storage-Interface-Treiber (CSI) auf Ihren Computer.

        git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
      2. Navigieren Sie zum base-Beispielordner.

        cd aws-ebs-csi-driver/deploy/kubernetes/base/
      3. Bearbeiten Sie die controller.yaml-Datei. Suchen Sie den Abschnitt der Datei mit dem folgenden Text und fügen Sie --extra-tags hinzu. Der folgende Text zeigt den Abschnitt der Datei mit dem vorhandenen und hinzugefügten Text. In diesem Beispiel fügt der Controller allen Volumes, die er erstellt, department- und environment-Tags hinzu.

        ... 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. Navigieren Sie zum Verzeichnis ecr.

        cd ../overlays/stable/ecr
        Anmerkung

        Wenn sich Ihr Cluster nicht in der Region us-west-2 befindet, ändern Sie 602401143452.dkr.ecr.us-west-2.amazonaws.com auf die Container-Image-Adresse Ihrer Region in der kustomization.yaml-Datei.

      5. Wenden Sie das geänderte Manifest auf Ihren Cluster an.

        kubectl apply -k ../ecr
      6. Fügen Sie dem ebs-csi-controller-sa-Kubernetes-Servicekonto den ARN der IAM-Rolle hinzu, die Sie zuvor erstellt haben. Verwenden Sie den Befehl, der dem Werkzeug entspricht, mit dem Sie die Rolle in einem vorherigen Schritt erstellt haben. Ersetzen Sie 111122223333 durch Ihre Konto-ID.

        • Rolle erstellt mit 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
        • Rolle erstellt mit der AWS 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
      7. Löschen Sie die Treiber-Pods. Sie werden automatisch mit den IAM-Berechtigungen aus der der Rolle zugewiesenen IAM-Richtlinie erneut bereitgestellt.

        kubectl delete pods \ -n kube-system \ -l=app=ebs-csi-controller
    • Ohne Tags – Stellt den Treiber so bereit, dass er die von ihm erstellten Amazon-EBS-Volumes nicht kennzeichnet. Um die kustomization.yaml-Datei manuell anzuzeigen oder herunterzuladen, sehen Sie sich die Datei auf GitHub an.

      Anmerkung

      Wenn sich Ihr Cluster nicht in der Region us-west-2 befindet, müssen Sie 602401143452.dkr.ecr.us-west-2.amazonaws.com auf die Container-Image-Adresse Ihrer Region in der kustomization.yaml-Datei ändern und das Manifest lokal anwenden.

      1. Das Manifest anwenden

        kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/ecr/?ref=master"
      2. Fügen Sie dem ebs-csi-controller-sa-Kubernetes-Servicekonto den ARN der IAM-Rolle hinzu, die Sie zuvor erstellt haben. Verwenden Sie den Befehl, der dem Werkzeug entspricht, mit dem Sie die Rolle in einem vorherigen Schritt erstellt haben. Ersetzen Sie 111122223333 durch Ihre Konto-ID.

        • Rolle erstellt mit 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
        • Rolle erstellt mit der AWS 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. Löschen Sie die Treiber-Pods. Sie werden automatisch mit den IAM-Berechtigungen aus der der Rolle zugewiesenen IAM-Richtlinie erneut bereitgestellt.

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

So stellen Sie eine Beispielanwendung bereit und überprüfen, ob der CSI-Treiber funktioniert

In diesem Verfahren wird das Beispiel Dynamische Volume-Bereitstellung aus dem GitHub-Repository Amazon-EBS-Container-Storage-Interface-Treiber (CSI) verwendet, um ein dynamisch bereitgestelltes Amazon-EBS-Volume zu verwenden. Sie können Beispielanwendungen bereitstellen, die Volume-Snapshots oder Volume-Größenänderung verwenden, indem Sie den Anweisungen auf GitHub folgen.

  1. Klonen Sie das GitHub-Repository Amazon-EBS-Container-Storage-Interface-Treiber (CSI) auf Ihr lokales System.

    git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
  2. Navigieren Sie zum dynamic-provisioning-Beispielverzeichnis.

    cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/
  3. Stellen Sie die Speicherklasse ebs-sc, den persistenten Volume-Anspruch ebs-claim und die Beispielanwendung app aus dem specs-Verzeichnis bereit.

    kubectl apply -f specs/
  4. Beschreiben Sie die ebs-sc-Speicherklasse.

    kubectl describe storageclass ebs-sc

    Ausgabe:

    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>

    Beachten Sie, dass die Speicherklasse den WaitForFirstConsumer-Volume-Bindungsmodus verwendet. Das bedeutet, dass Volumes erst dann dynamisch bereitgestellt werden, wenn ein Pod einen persistenten Volume-Anspruch stellt. Weitere Informationen finden Sie unter Volume-Bindungsmodus in der Kubernetes-Dokumentation.

  5. Beobachten Sie die Pods im Standard-Namespace und warten Sie, bis der Status des app-Pods Running wird.

    kubectl get pods --watch

    Geben Sie Ctrl+C ein, um zu einer Shell-Eingabeaufforderung zurückzukehren.

  6. Listen Sie die persistenten Volumes im Standard-Namespace auf. Suchen Sie nach einem persistenten Volume mit dem default/ebs-claim-Anspruch.

    kubectl get pv

    Ausgabe:

    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. Beschreiben Sie das persistente Volume und ersetzen Sie pvc-37717cd6-d0dc-11e9-b17f-06fad4858a5a durch den Wert aus der Ausgabe im vorherigen Schritt.

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

    Ausgabe:

    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 [us-west-2d] 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>

    Die Amazon EBS-Volume-ID ist der Wert für VolumeHandle in der vorherigen Ausgabe.

  8. Überprüfen Sie, ob der Pod erfolgreich Daten auf das Volume schreibt.

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

    Ausgabe:

    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. Wenn Sie das Experimentieren abgeschlossen haben, löschen Sie die Ressourcen für diese Beispielanwendung, um sie zu bereinigen.

    kubectl delete -f specs/