Nichtflüchtiges Volume mit EFS bereitstellen

Auf dieser Seite wird beschrieben, wie Sie ein EFS-basiertes nichtflüchtiges Volume für die Verwendung in GKE on AWS mit dem EFS-CSI-Treiber einrichten. Das Elastic File System (EFS) ist der zugrunde liegende AWS-Mechanismus, der Netzwerkdateisysteme für Ihren Cluster bereitstellt. Ein EFS-basiertes nichtflüchtiges Volume ist eine Clusterressource, die Ihren Arbeitslasten über einen EFS-Zugangspunkt Speicher zur Verfügung stellt und dafür sorgt, dass der Speicher auch dann erhalten bleibt, wenn keine Arbeitslasten damit verbunden sind.

GKE on AWS unterstützt sowohl die statische als auch die dynamische Bereitstellung von nichtflüchtigem Speicher. Die dynamische Bereitstellung verwendet eine etwas andere Einrichtung, erfordert danach aber weniger Verwaltungsaufwand.

Hinweise

Führen Sie zuerst die folgende Aufgaben aus, um die Schritte auf dieser Seite auszuführen:

Statische Bereitstellung – Übersicht

Das Erstellen eines Elastic File System (EFS) und dessen Bereitstellung für Arbeitslasten in Ihrem Cluster durch statische Bereitstellung umfasst vier Schritte:

  • EFS-Ressource erstellen
  • Netzwerk konfigurieren
  • Bereitstellungsziel erstellen
  • PersistentVolume erstellen

Der letzte Schritt besteht darin, durch die Arbeitslast nichtflüchtigen Speicher anzufordern. Dazu wird ein PersistentVolumeClaim ausgegeben.

Dynamische Bereitstellung – Übersicht

Das Erstellen einer EFS-Ressource und ihrer Bereitstellung über die dynamische Bereitstellung umfasst ebenfalls vier Schritte:

  • EFS-Ressource erstellen
  • Netzwerk konfigurieren
  • Bereitstellungsziel erstellen
  • StorageClass erstellen

Das Erstellen des StorageClass ist ein einmaliger Vorgang. Sobald eine Speicherklasse mit bestimmten Merkmalen definiert wurde, kann die Arbeitslast einen nichtflüchtiger Speicher ausstellen oder nichtflüchtigen Speicher anfordern. Alle PersistentVolumeClaims für Speicher mit diesen Eigenschaften können dieselbe StorageClass anfordern.

Häufige Schritte

Unabhängig davon, ob Sie in Ihrem Cluster die statische oder dynamische Bereitstellung verwenden, müssen Sie mit den hier aufgeführten Einrichtungsschritten beginnen und dann die entsprechenden Schritte zur statischen oder dynamischen Bereitstellung ausführen. Nachdem Sie die EFS erstellt und zugänglich gemacht haben, muss die Arbeitslast die letzten Schritte für den Zugriff darauf ausführen. Die erforderlichen Schritte werden unter EFS-Speicher verwenden beschrieben.

AWS EFS-Ressource erstellen

Eine EFS-Ressource ist erforderlich, unabhängig davon, ob Sie die statische oder die dynamische Bereitstellung verwenden. Wenn Ihr Cluster beide verwendet, können Sie separate EFS-Ressourcen für sie erstellen oder dieselbe für beide verwenden. Weitere Informationen zum Erstellen einer EFS-Ressource finden Sie unter Amazon EFS-Dateisysteme erstellen.

Sie können auch eine vorhandene EFS wiederverwenden. In diesem Fall können Sie diesen Abschnitt überspringen und mit Bereitstellungsziele erstellen fortfahren.

  1. Rufen Sie die AWS-Region ab, in der Ihr Cluster ausgeführt wird.

    gcloud container aws clusters describe CLUSTER_NAME \
      --location=LOCATION \
      --format="value(awsRegion)"
    

    Ersetzen Sie Folgendes:

    • CLUSTER_NAME: der Name des AWS-Clusters
    • LOCATION der Google Cloud-Speicherort des AWS-Clusters
  2. Erstellen Sie mit dem folgenden Befehl ein EFS-Ressourcensystem in derselben AWS-Region.

    aws efs create-file-system \
      --region AWS_REGION \
      --performance-mode generalPurpose \
      --query 'FileSystemId' \
      --output text
    

    Ersetzen Sie Folgendes:

    • AWS_REGION: die AWS-Region, in der der Cluster ausgeführt wird

Die Ausgabe enthält die ID des Dateisystems. Speichern Sie diesen Wert. Sie benötigen diese Informationen später.

Bereitstellungsziele erstellen

Der CSI-Treiber für EFS greift über EFS-Bereitstellungsziele auf Dateisysteme zu. Ein Bereitstellungsziel ist eine private IP-Adresse, die AWS-Sicherheitsgruppen verwendet, um den Zugriff auf die zugrunde liegende EFS zu steuern.

Wenn die Knotenpools in Ihrem Cluster in verschiedenen Subnetzen ausgeführt werden, müssen Sie in jedem Knotenpool-Subnetz ein separates Bereitstellungsziel erstellen.

In diesem Beispiel wird der Zugriff auf jedes Bereitstellungsziel durch eine einzelne Sicherheitsgruppe geschützt, die sowohl die Bereitstellungsziele als auch die Knotenpoolmaschinen enthält. Abhängig von Ihrer VPC-Konfiguration und den Sicherheitsanforderungen können Sie diese Konfiguration in zwei oder mehr Sicherheitsgruppen aufteilen, z. B. eine für Bereitstellungsziele und eine für Knotenpool-Worker-Knoten.

  1. Dedizierte Sicherheitsgruppe erstellen, um den Zugriff auf EFS zu steuern

    Rufen Sie die ID der AWS-VPC ab, in der der Cluster ausgeführt wird.

    gcloud container aws clusters describe CLUSTER_NAME \
      --location=LOCATION \
      --format="value(networking.vpcId)"
    

    Ersetzen Sie Folgendes:

    • CLUSTER_NAME
    • LOCATION

    Die Ausgabe enthält die ID Ihrer VPC. Speichern Sie diesen Wert. Sie benötigen diese Informationen später.

  2. Erstellen Sie eine Sicherheitsgruppe, um den Zugriff auf Ihr EFS-Bereitstellungsziel zu steuern.

    aws ec2 create-security-group \
      --group-name gke-efs-security-group \
      --description "EFS security group" \
      --vpc-id VPC_ID \
      --output text
    

    Ersetzen Sie VPC_ID durch die ID der AWS-VPC, in der der Cluster ausgeführt wird.

    Die Ausgabe enthält die ID der neuen Sicherheitsgruppe. Speichern Sie diesen Wert. Sie benötigen diese Informationen später.

  3. AWS erstellt standardmäßig Sicherheitsgruppen mit einer Standardregel, die den gesamten ausgehenden Traffic zulässt. Entfernen Sie die Standardregel für ausgehenden Traffic.

    aws ec2 revoke-security-group-egress \
      --group-id SECURITY_GROUP_ID
      --ip-permissions '[{"IpProtocol":"-1","FromPort":-1,"ToPort":-1,"IpRanges":[{"CidrIp":"0.0.0.0/0"}]}]'
    

    Ersetzen Sie SECURITY_GROUP_ID durch die ID der AWS-Sicherheitsgruppe.

  4. Autorisieren Sie den eingehenden und ausgehenden Traffic für EFS (Port 2049).

    aws ec2 authorize-security-group-ingress \
        --group-id SECURITY_GROUP_ID \
        --protocol tcp \
        --port 2049 \
        --source-group SECURITY_GROUP_ID
    
    aws ec2 authorize-security-group-egress \
        --group-id SECURITY_GROUP_ID \
        --protocol tcp \
        --port 2049 \
        --source-group SECURITY_GROUP_ID
    
  5. Erstellen Sie in jedem Knotenpool-Subnetz ein EFS-Bereitstellungsziel.

    Listen Sie Subnetze auf, die allen Knotenpools zugeordnet sind.

    gcloud container aws node-pools list \
      --cluster=CLUSTER_NAME \
      --location=LOCATION \
      --format="value(subnetId)"
    

    Ersetzen Sie Folgendes:

    • CLUSTER_NAME
    • LOCATION

    Die Ausgabe ist eine Liste von Subnetz-IDs. Speichern Sie diesen Wert. Sie benötigen diese Informationen später.

  6. Erstellen Sie für jedes Subnetz ein verknüpftes EFS-Bereitstellungsziel mit der angewendeten Sicherheitsgruppe.

    aws efs create-mount-target \
        --file-system-id EFS_ID \
        --subnet-id SUBNET_ID \
        --security-groups SECURITY_GROUP_ID
    

    Ersetzen Sie Folgendes:

    • EFS_ID: die ID Ihrer EFS-Ressource.
    • SUBNET_ID: die ID des Subnetzes des Knotenpools.
    • SECURITY_GROUP_ID
  7. Fügen Sie die EFS-Sicherheitsgruppe allen Cluster-Knotenpools hinzu.

    Rufen Sie die Liste aller Knotenpools ab.

    gcloud container aws node-pools list \
      --cluster=CLUSTER_NAME \
      --location=LOCATION
    

    Ersetzen Sie Folgendes:

    • CLUSTER_NAME
    • LOCATION

    Die Ausgabe enthält die Namen der Knotenpools Ihres Clusters. Speichern Sie diesen Wert. Sie benötigen diese Informationen später.

  8. Aktualisieren Sie die einzelnen Knotenpools so, dass sie die neue EFS-Sicherheitsgruppe enthalten.

    gcloud container aws node-pools update NODE_POOL_NAME \
      --cluster=CLUSTER_NAME \
      --location=LOCATION  \
      --security-group-ids=SECURITY_GROUP_IDS
    

    Ersetzen Sie Folgendes:

    • NODE_POOL_NAME ist der Name des Knotenpools.
    • CLUSTER_NAME: Der Name Ihres Clusters.
    • LOCATION
    • SECURITY_GROUP_IDS ist die Liste der Sicherheitsgruppen-IDs für Worker-Knoten.

Persistentes (statisches) oder Speicherklasse (dynamisch) erstellen

Wenn Sie eine statische Bereitstellung verwenden, müssen Sie im nächsten Schritt ein nichtflüchtiges Volume erstellen. Wenn Sie die dynamische Bereitstellung verwenden, übernimmt der EFS-Treiber dies für Sie. Stattdessen definieren Sie eine Speicherklasse für Arbeitslasten, die Sie in ihrem VolumeClaim angeben. Wählen Sie den Tab aus, der der ausgewählten Bereitstellungsmethode entspricht.

Statische Bereitstellung

Wenn Sie eine statische Bereitstellung verwenden, müssen Sie im nächsten Schritt ein nichtflüchtiges Volume erstellen, das eine EFS-Freigabe bereitstellt.

  1. Wählen Sie den entsprechenden Tab aus, je nachdem, ob Sie eine direkte Verbindung zur EFS-Freigabe oder eine Verbindung über einen Zugangspunkt herstellen.

    Direkte Verbindung

    Kopieren Sie das folgende YAML-Manifest in eine Datei mit dem Namen efs-volume.yaml. Das Manifest verweist auf die zuvor erstellte EFS-Speicherklasse.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: VOLUME_NAME
    spec:
      capacity:
        # Note: storage capacity is not used by the EFS CSI driver.
        # It is required by the PersistentVolume spec.
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      storageClassName: "" # storageClassName is not required, see note in the following section.
      claimRef:
        name: CLAIM_NAME
        namespace: default
      csi:
        driver: efs.csi.aws.com
        volumeHandle: EFS_ID
    

    Ersetzen Sie Folgendes:

    • VOLUME_NAME durch einen Namen für das nichtflüchtige Volume.
    • CLAIM_NAME durch den Namen, den Sie für den PersistentVolumeClaim verwenden möchten.
    • EFS_ID durch Ihre EFS-Ressourcen-ID. Beispiel: fs-12345678a

    Zugriffspunkt

    Wenn Sie ein Volume erstellen möchten, das auf einem Zugriffspunkt basiert, müssen Sie ihn manuell bereitstellen. Weitere Informationen finden Sie unter Mit EFS-Zugangspunkten arbeiten.

    Kopieren Sie das folgende YAML-Manifest in eine Datei mit dem Namen efs-volume.yaml. Das Manifest verweist auf die zuvor erstellte EFS-Speicherklasse.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: VOLUME_NAME
    spec:
      capacity:
        # Note: storage capacity is not used by the EFS CSI driver.
        # It is required by the PersistentVolume spec.
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      # Set storageClassName to empty string for static provisioning. See [Use an EFS resource](/anthos/clusters/docs/multi-cloud/aws/how-to/use-efs)
      storageClassName: ""
      claimRef:
        name: CLAIM_NAME
        namespace: default
      csi:
        driver: efs.csi.aws.com
        volumeHandle: EFS_ID::ACCESS_POINT_ID
    

    Ersetzen Sie Folgendes:

    • VOLUME_NAME durch einen Namen für das nichtflüchtige Volume.
    • CLAIM_NAME durch den Namen, den Sie für den PersistentVolumeClaim verwenden möchten.
    • EFS_ID durch Ihre EFS-Ressourcen-ID. Beispiel: fs-12345678a
    • ACCESS_POINT_ID durch die ID Ihres Zugangspunkts. Beispiel: fsap-1234567890abcde
  2. Wenden Sie die YAML-Datei auf Ihren Cluster an.

    kubectl apply -f efs-volume.yaml
    

    Die Ausgabe bestätigt die Erstellung des PersistentVolumes.

    persistentvolume/VOLUME_NAME created
    
    

Dynamische Bereitstellung

In diesem Abschnitt wird beschrieben, wie Sie eine Speicherklasse erstellen, die auf die zuvor erstellte EFS-Ressource verweist. Danach können Entwickler auf die EFS-Ressource zugreifen. Folgen Sie dazu der Anleitung unter EFS-Ressource verwenden.

  1. Erstellen Sie eine Speicherklasse, die auf die EFS-Ressourcen-ID verweist.

    Kopieren Sie das folgende YAML-Fragment in eine neue Datei mit dem Namen efs-storage-class.yaml. Weitere Informationen zum Anpassen der in dieser Datei beschriebenen Eigenschaften der Speicherklasse finden Sie in der Dokumentation zu den Parametern der EFS-Speicherklasse.

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: EFS_STORAGE_CLASS_NAME
    provisioner: efs.csi.aws.com
    mountOptions:
      - tls
    parameters:
      provisioningMode: efs-ap
      fileSystemId: EFS_ID
      directoryPerms: "700"
    
    

    Ersetzen Sie:

    • EFS_STORAGE_CLASS_NAME durch den Namen, den Sie für die Speicherklasse ausgewählt haben.
    • EFS_ID durch Ihre EFS-Ressourcen-ID, z. B. fs-12345678a.
  2. Wenden Sie die YAML-Datei auf Ihren Cluster an.

    kubectl apply -f efs-storage-class.yaml
    

    Bei Erfolg enthält die Ausgabe dieses Befehls eine Zeile wie diese:

    storageclass/EFS_STORAGE_CLASS_NAME created

Bereinigen

Führen Sie die folgenden Befehle aus, um die Ressourcen zu entfernen, die Sie in den vorherigen Abschnitten erstellt haben:

  1. Verwenden Sie kubectl, um die EFS-Anforderungsressource aus dem Cluster zu entfernen:

    kubectl delete -f efs-claim.yaml
    
  2. Wenn Sie die statische Bereitstellung verwenden, entfernen Sie mit kubectl die zugehörigen Ressourcen aus dem Cluster:

    kubectl delete -f efs-volume.yaml
    
  3. Wenn Sie die dynamische Bereitstellung verwenden, entfernen Sie mit kubectl die zugehörigen Ressourcen aus dem Cluster:

    kubectl delete -f efs-storage-class.yaml
    
  4. Ermitteln Sie die ID des Bereitstellungsziels:

    aws efs describe-mount-targets \
    --file-system-id EFS_ID \
    --profile adminuser \
    --region AWS_REGION
    

    Ersetzen Sie Folgendes:

    • EFS_ID: die ID Ihrer EFS-Ressource
    • AWS_REGION: die AWS-Region, in der der Cluster ausgeführt wird

    Die Ausgabe enthält die ID des Bereitstellungsziels. Speichern Sie diesen Wert. Sie benötigen diese Informationen später.

  5. Löschen Sie das EFS-Bereitstellungsziel:

    aws efs delete-mount-target \
    --mount-target-id MOUNT_TARGET_ID \
    --profile adminuser \
    --region AWS_REGION
    

    Ersetzen Sie Folgendes:

    • MOUNT_TARGET_ID: die ID Ihres EFS-Bereitstellungsziels
    • AWS_REGION: AWS-Region des Bereitstellungsziels
  6. Löschen Sie alle Sicherheitsgruppen, die Sie erstellt haben.

  7. Löschen Sie das Dateisystem mit dem Befehl "delete-file-system". Mit dem Befehl „describe-file-systems“ in der Befehlszeile können Sie eine Liste Ihrer Dateisysteme abrufen. Die Dateisystem-ID ist in der Antwort enthalten.

    aws efs delete-file-system \
      --file-system-id EFS_ID \
      --profile adminuser \
      --region AWS_REGION
    

    Ersetzen Sie Folgendes:

    • EFS_ID
    • AWS_REGION

Nächste Schritte