Utilizzo di file system EFS

GKE su AWS 1.6 e versioni successive supportano AWS Elastic File System (EFS) tramite il driver CSI EFS. Questo argomento spiega come montare un file system EFS esistente come Volume permanente nei cluster utente.

Prima di iniziare

Per eseguire i passaggi descritti in questo argomento, devi disporre di quanto segue:

  • Un file system EFS esistente nella stessa VPC AWS dell'installazione di GKE su AWS.
  • Almeno un target di montaggio EFS nella stessa VPC AWS dell'installazione GKE su AWS.
  • Tutti i target di montaggio EFS devono appartenere a quanto segue:
    • Le subnet private per l'installazione di GKE su AWS. Per impostazione predefinita, GKE su AWS crea subnet denominate gke-CLUSTER_ID-private-AWS_ZONE, dove CLUSTER_ID è l'ID cluster utente e AWS_ZONE è la zona di disponibilità AWS.
    • Il gruppo di sicurezza del node pool. Per impostazione predefinita, GKE on AWS crea pool di nodi denominati gke-CLUSTER_ID-nodepool, dove CLUSTER_ID è l'ID del cluster utente.
  • Dalla directory anthos-aws, utilizza anthos-gke per cambiare contesto e passare al cluster di utenti.
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Sostituisci CLUSTER_NAME con il nome del cluster di utenti.

Utilizzo di un volume permanente EFS

Per utilizzare un file system EFS come PersistentVolume con i tuoi cluster di utenti, innanzitutto crea un PersistentVolume e poi un PersistentVolumeClaim a cui fare riferimento nel tuo carico di lavoro.

Creazione di un PersistentVolume

Per creare un volume persistente con il driver CSI EFS, svolgi i seguenti passaggi.

  1. Dalla directory anthos-aws, utilizza anthos-gke per cambiare contesto e passare al cluster di utenti.

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Sostituisci CLUSTER_NAME con il nome del cluster di utenti.

  2. La configurazione di PersistentVolume che utilizzi dipende dal fatto che ti colleghi direttamente all'Elastic File System o tramite un punto di accesso. Seleziona se ti connetti direttamente a Elastic File System o tramite un punto di accesso.

    Connettiti direttamente

    Copia il seguente manifest YAML in un file denominato efs-volume.yaml. Il manifest fa riferimento alla classe di archiviazione EFS creata in precedenza.

    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_FILE_SYSTEM_ID
    

    Sostituisci quanto segue:

    • VOLUME_NAME con un nome per il volume permanente.
    • CLAIM_NAME con il nome che vuoi utilizzare per il PersistentVolumeClaim.
    • EFS_FILE_SYSTEM_ID con l'ID file system EFS. Ad esempio, fs-12345678a.

    Punto di accesso

    Copia il seguente manifest YAML in un file denominato efs-volume.yaml. Il manifest fa riferimento alla classe di archiviazione EFS creata in precedenza.

    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_FILE_SYSTEM_ID::ACCESS_POINT_ID
    

    Sostituisci quanto segue:

    • VOLUME_NAME con un nome per il volume permanente.
    • CLAIM_NAME con il nome che vuoi utilizzare per il PersistentVolumeClaim.
    • EFS_FILE_SYSTEM_ID con l'ID file system EFS. Ad esempio, fs-12345678a.
    • ACCESS_POINT_ID con l'ID del tuo punto di accesso. Ad esempio, fsap-1234567890abcde.
  3. Applica il file YAML al cluster utente.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f efs-volume.yaml
    

    L'output conferma la creazione del PersistentVolume.

    persistentvolume/VOLUME_NAME created
    

Creazione di un PersistentVolumeClaim

Per utilizzare il file system EFS con i tuoi carichi di lavoro, devi creare un PersistentVolumeClaim.

  1. Per creare il PersistentVolumeClaim, copia il seguente manifest YAML in un file denominato efs-claim.yaml.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: CLAIM_NAME
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: ""
      resources:
        requests:
          storage: 5Gi
    

    Sostituisci CLAIM_NAME con un nome per il tuo PersistentVolumeClaim. Ad esempio, efs-claim1.

  2. Applica il file YAML al cluster utente.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f efs-claim.yaml
    

    L'output conferma la creazione del PersistentVolumeClaim.

    persistentvolumeclaim/CLAIM_NAME created
    

Crea un oggetto StatefulSet

Dopo aver creato un PersistentVolumeClaim, puoi utilizzarlo in un carico di lavoro. I passaggi in questa sezione creano un StatefulSet di esempio con il sistema di file EFS montato. Puoi anche utilizzare un oggetto PersistentVolumeClaim con altri tipi di carichi di lavoro come pod e deployment facendo riferimento al claim in spec.volumes.

Per creare uno StatefulSet che monta il file system EFS a cui fai riferimento nel claim volume permanente, svolgi i seguenti passaggi.

  1. Copia il seguente manifest YAML in un file denominato efs-statefulset.yaml. Questo manifest di esempio avvia un container Ubuntu Linux che monta il file system EFS in /efs-data. Il contenitore scrive ogni cinque secondi in un file sul file system EFS denominato out.txt.

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: efs-shell
    spec:
      selector:
        matchLabels:
          app: test-efs
      serviceName: efs-app
      replicas: 1
      template:
        metadata:
          labels:
            app: test-efs
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: linux
            image: ubuntu:bionic
            command: ["/bin/sh"]
            args: ["-c", "while true; do echo $(date -u) >> /efs-data/out.txt; sleep 5; done"]
            volumeMounts:
            - name: efs-volume
              mountPath: /efs-data
          volumes:
          - name: efs-volume
            persistentVolumeClaim:
              claimName: CLAIM_NAME
    

    Sostituisci quanto segue:

    • CLAIM_NAME con il nome del PersistentVolumeClaim specificato in precedenza. Ad esempio, efs-claim1.
  2. Applica il file YAML al cluster utente.

    env HTTPS_PROXY=http://localhost:8118 \
     kubectl apply -f efs-statefulset.yaml
    

    L'output conferma la creazione del StatefulSet.

    statefulset.apps/efs-shell created
    

    Il StatefulSet potrebbe richiedere diversi minuti per scaricare l'immagine del contenitore e avviarsi.

  3. Verifica che il pod dello StatefulSet sia in stato Running con kubectl get pods.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get pods -l app=test-efs
    

    L'output include il nome del pod e il relativo stato. Nella risposta che segue, il nome del pod è efs-shell-0.

    NAME          READY   STATUS    RESTARTS   AGE
    efs-shell-0   1/1     Running   0          1m
    
  4. Una volta che il pod è in stato Running, utilizza kubectl exec per connetterti al pod che ospita il StatefulSet.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl exec -it efs-shell-0 -- bash
    

    Il comando kubectl avvia una shell sul pod.

  5. Per verificare che il file system EFS sia montato, controlla i contenuti del file out.txt con il comando tail.

    tail /efs-data/out.txt
    

    L'output contiene orari recenti in UTC.

  6. Disconnetti dal pod con il comando exit.

    exit
    

    La shell torna alla tua macchina locale.

  7. Per rimuovere lo StatefulSet, utilizza kubectl delete.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl delete -f efs-statefulset.yaml
    

Pulizia

Per rimuovere le risorse create nelle sezioni precedenti, esegui i seguenti comandi:

env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-statefulset.yaml
env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-claim.yaml
env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-volume.yaml

Passaggi successivi