Gestione del componente aggiuntivo autogestito CSI per Amazon EBS - Amazon EKS

Gestione del componente aggiuntivo autogestito CSI per Amazon EBS

Questo argomento illustra come implementare il driver CSI per Amazon EBS come componente aggiuntivo autogestito nel cluster Amazon EKS e verificarne il funzionamento.

Nota

Il driver non è supportato su Fargate. Le caratteristiche alfa del driver CSI per Amazon EBS non sono supportate nei cluster Amazon EKS.

Per una descrizione dettagliata dei parametri disponibili ed esempi completi che illustrano le caratteristiche del driver, consultare il progetto Driver Container Storage Interface (CSI) per Amazon EBS su GitHub.

Prerequisiti

Implementazione del driver CSI per Amazon EBS in un cluster Amazon EKS

  1. Creare una policy IAM che consenta all'account di servizio del driver CSI di effettuare chiamate alle API AWS per conto dell'utente. Il documento di policy può essere visualizzato su GitHub.

    1. Eseguire il download del documento di policy IAM da GitHub.

      curl -o example-iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/docs/example-iam-policy.json
    2. Creare la policy. È possibile modificare AmazonEKS_EBS_CSI_Driver_Policy con un nome diverso. Se la modifichi, assicurati di modificarla anche nei passaggi successivi.

      aws iam create-policy \ --policy-name AmazonEKS_EBS_CSI_Driver_Policy \ --policy-document file://example-iam-policy.json
  2. Creare un ruolo IAM e collegarvi la policy IAM. In alternativa, è possibile utilizzare eksctl o la AWS CLI.

    eksctl

    Sostituire my-cluster con il nome del cluster e 111122223333 con l'ID del proprio account.

    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

    Recuperare l'ARN del ruolo creato e annotare il valore restituito per l'utilizzo in un passaggio successivo.

    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

    L'output è il seguente.

    arn:aws:iam::111122223333:role/eksctl-my-cluster-addon-iamserviceaccount-kube-sy-Role1-1J7XB63IN3L6T
    AWS CLI
    1. Visualizzare l'URL del provider OIDC del cluster. Sostituire my-cluster con il nome del cluster. Se l'output dal comando è None, rivedere i Prerequisiti.

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

      L'output è il seguente.

      https://oidc.eks.region-code.amazonaws.com/id/oidc-id
    2. Creare il ruolo IAM.

      1. Copiare i contenuti seguenti in un file denominato trust-policy.json. Sostituisci 111122223333 con l'ID del tuo account, region-code con la tua Regione AWS e oidc-id con il valore restituito nella fase precedente.

        { "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/id/oidc-id:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa" } } } ] }
      2. Creare il ruolo. È possibile modificare AmazonEKS_EBS_CSI_DriverRole con un nome diverso. Se la modifichi, assicurati di modificarla anche nei passaggi successivi.

        aws iam create-role \ --role-name AmazonEKS_EBS_CSI_DriverRole \ --assume-role-policy-document file://"trust-policy.json"
    3. Allegare la policy IAM al ruolo. Sostituire 111122223333 con l'ID del proprio account.

      aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_EBS_CSI_Driver_Policy \ --role-name AmazonEKS_EBS_CSI_DriverRole
  3. È possibile implementare il driver utilizzando Helm o un manifesto. Per la compatibilità del driver con Helm, vedere la Tabella relativa alla compatibilità delle versioni Kubernetes su GitHub. Se si desidera installare una versione precedente del driver CSI per Amazon EBS, utilizzare il manifesto.

    Helm

    Installazione del driver CSI per Amazon EBS utilizzando Helm V3 o versioni successive. Per installare o aggiornare Helm, consultare Utilizzo di Helm con Amazon EKS.

    1. Aggiungere il repository Helm aws-ebs-csi-driver:

      helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver helm repo update
    2. Installare una versione del driver utilizzando il grafico Helm. Sostituire l'indirizzo del repository con l'Indirizzo immagine container del cluster. Utilizzare il comando corrispondente allo strumento utilizzato per creare il ruolo in un passaggio precedente.

      • Se hai usato eksctl per creare il ruolo, utilizzare il seguente comando.

        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/eks/aws-ebs-csi-driver \ --set controller.serviceAccount.create=false \ --set controller.serviceAccount.name=ebs-csi-controller-sa
      • Se hai usato AWS CLI per creare il ruolo, utilizzare il seguente comando con il ruolo ARN corretto creato.

        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/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/role-arn"="arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole"
    Manifest

    È possibile implementare il driver per creare volumi con o senza tag.

    • Con tag – Implementa il driver in modo che tagghi tutti i volumi Amazon EBS creati con i tag specificati.

      1. Clonare il repository GitHub del driver Container Storage Interface (CSI) per Amazon EBS nel computer.

        git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
      2. Accedere alla cartella di esempio base.

        cd aws-ebs-csi-driver/deploy/kubernetes/base/
      3. Modificare il file controller.yaml. Trovare la sezione del file con il testo seguente e aggiungere --extra-tags. Il testo seguente mostra la sezione del file con il testo esistente e aggiunto. Questo esempio fa sì che il controller aggiunga i tag department e environment a tutti i volumi che crea.

        ... 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. Accedere alla cartella ecr.

        cd ../overlays/stable/ecr
        Nota

        Se il cluster non si trova nella us-west-2 Regione AWS, sostituisci 602401143452.dkr.ecr.us-west-2.amazonaws.com con l'indirizzo dell'immagine del container del tuo cluster nel file kustomization.yaml.

      5. Applicare il file manifesto modificato al cluster.

        kubectl apply -k ../ecr
      6. Annotare l'account del servizio Kubernetes ebs-csi-controller-sa con l'ARN del ruolo IAM creato precedentemente. Utilizzare il comando corrispondente allo strumento utilizzato per creare il ruolo in un passaggio precedente. Sostituire 111122223333 con l'ID del proprio account.

        • Se hai usato eksctl per creare il ruolo, utilizzare questo comando.

          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
        • Se hai usato AWS CLI per creare il ruolo, utilizzare questo comando.

          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. Riavviare l'implementazione ebs-csi-controller.

        kubectl rollout restart \ deployment ebs-csi-controller \ -n kube-system
    • Senza tag – Implementa il driver in modo che non tagghi i volumi Amazon EBS da lui creati. Per visualizzare o scaricare il file kustomization.yaml, vedere il file su GitHub.

      Nota

      Se il cluster non si trova nella us-west-2 Regione AWS, sostituisci 602401143452.dkr.ecr.us-west-2.amazonaws.com con l'indirizzo dell'immagine del container del tuo cluster nel file kustomization.yaml. Quindi, applica il file manifesto localmente.

      1. Applicare il file manifesto.

        kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/ecr/?ref=master"
      2. Annotare l'account del servizio Kubernetes ebs-csi-controller-sa con l'ARN del ruolo IAM creato precedentemente. Utilizzare il comando corrispondente allo strumento utilizzato per creare il ruolo in un passaggio precedente. Sostituire 111122223333 con l'ID del proprio account.

        • Se hai usato eksctl per creare il ruolo, utilizzare questo comando.

          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
        • Se hai usato AWS CLI per creare il ruolo, utilizzare questo comando.

          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. Eliminare i pod del driver. Vengono reimplementati automaticamente con le autorizzazioni IAM dalle policy IAM assegnate al ruolo.

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

Per implementare un'applicazione di esempio e verificare il funzionamento del driver CSI

Questa procedura utilizza l'esempio di provisioning di volumi dinamici disponibile nel repository GitHub del driver Container Storage Interface (CSI) per Amazon EBS finalizzato all'uso di un volume Amazon EBS con provisioning dinamico. È possibile implementare applicazioni di esempio che utilizzano snapshot di volume o dimensionamento volume seguendo le istruzioni su GitHub.

  1. Clonare il repository GitHub del driver Container Storage Interface (CSI) per Amazon EBS nel sistema locale.

    git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
  2. Passare alla directory di esempio dynamic-provisioning.

    cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/
  3. Implementare la classe di storage ebs-sc, la dichiarazione di volume persistente ebs-claim e l'applicazione di esempio app dalla directory specs.

    kubectl apply -f specs/
  4. Descrivere la classe di storage ebs-sc.

    kubectl describe storageclass ebs-sc

    L'output è il seguente.

    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>
    Nota

    La classe di storage utilizza la modalità di associazione di volumi WaitForFirstConsumer. Ciò significa che i volumi non vengono assegnati dinamicamente finché un pod non effettua una dichiarazione di volume persistente. Per ulteriori informazioni, consultare la sezione relativa alla modalità di associazione dei volumi nella documentazione Kubernetes.

  5. Controlla i pod nello spazio dei nomi predefinito. Dopo pochi minuti, lo stato del pod app cambia in Running.

    kubectl get pods --watch

    Inserire Ctrl+C per tornare a un prompt della shell.

  6. Elencare i volumi persistenti nello spazio dei nomi predefinito. Cercare un volume persistente con la richiesta default/ebs-claim.

    kubectl get pv

    L'output è il seguente.

    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. Descrivere il volume persistente. Sostituisci pvc-37717cd6-d0dc-11e9-b17f-06fad4858a5a con il valore dell'output del passaggio precedente.

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

    L'output è il seguente.

    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>

    L'ID volume Amazon EBS è il valore per VolumeHandle nell'output precedente.

  8. Verificare che il pod scriva correttamente i dati nel volume.

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

    L'output è il seguente.

    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. Al termine, eliminare le risorse per questa applicazione di esempio.

    kubectl delete -f specs/