Menyediakan Volume Persisten dengan EFS

Halaman ini menjelaskan cara menyiapkan PersistentVolume berbasis EFS untuk digunakan dalam GKE pada AWS menggunakan Driver EFS CSI. Elastic File System (EFS) adalah mekanisme AWS dasar yang menyediakan sistem file jaringan ke cluster Anda. PersistentVolume berbasis EFS adalah resource cluster yang menyediakan penyimpanan untuk workload Anda melalui titik akses EFS, dan memastikan bahwa penyimpanan tetap ada meskipun tidak ada beban kerja yang terhubung ke penyimpanan tersebut.

GKE di AWS mendukung penyediaan PersistentVolumes statis dan dinamis. Penyediaan dinamis menggunakan penyiapan yang sedikit berbeda, tetapi setelahnya hanya membutuhkan upaya administratif.

Sebelum memulai

Untuk melakukan langkah-langkah di halaman ini, pertama-tama selesaikan langkah-langkah berikut:

Ringkasan penyediaan statis

Membuat Sistem File Elastic (EFS) dan menyediakannya untuk beban kerja di cluster melalui penyediaan statis memiliki empat langkah:

  • Buat resource EFS
  • Mengonfigurasi jaringan Anda
  • Membuat target pemasangan
  • Membuat PersistentVolume

Langkah terakhir adalah dengan beban kerja: untuk meminta penyimpanan persisten dengan mengeluarkan PersistentVolumeClaim.

Ringkasan penyediaan dinamis

Membuat resource EFS dan menyediakannya melalui penyediaan dinamis juga memiliki empat langkah:

  • Buat resource EFS
  • Mengonfigurasi jaringan Anda
  • Membuat target pemasangan
  • Membuat StorageClass

Pembuatan StorageClass adalah operasi satu kali. Setelah kelas penyimpanan dengan karakteristik tertentu ditentukan, beban kerja dapat mengeluarkan PersistentVolumeClaim, atau meminta penyimpanan persisten. Semua PersistentVolumeClaims untuk penyimpanan dengan karakteristik tersebut dapat meminta StorageClass yang sama.

Langkah umum

Baik menggunakan penyediaan statis maupun dinamis di cluster, Anda harus memulai dengan langkah-langkah penyiapan yang tercantum di sini, lalu melanjutkan dengan langkah penyediaan statis atau dinamis yang sesuai. Setelah Anda membuat EFS dan dapat diakses, beban kerja harus mengambil langkah terakhir untuk mengaksesnya. Langkah-langkah untuk melakukannya dijelaskan dalam Menggunakan penyimpanan EFS.

Membuat Resource AWS EFS

Resource EFS diperlukan baik Anda menggunakan penyediaan statis maupun dinamis. Jika cluster menggunakan keduanya, Anda dapat membuat resource EFS terpisah untuk keduanya, atau menggunakan resource yang sama untuk keduanya. Lihat Membuat sistem file Amazon EFS untuk membaca selengkapnya tentang cara membuat resource EFS.

Anda juga dapat menggunakan kembali EFS yang ada. Dalam hal ini, Anda dapat melewati bagian ini dan melanjutkan ke Membuat target pemasangan.

  1. Dapatkan region AWS tempat cluster Anda dijalankan.

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

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster AWS.
    • LOCATION: lokasi Google Cloud cluster AWS
  2. Buat sistem resource EFS di region AWS yang sama dengan perintah berikut.

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

    Ganti kode berikut:

    • AWS_REGION: region AWS tempat cluster dijalankan

Outputnya mencakup ID sistem file. Simpan nilai ini. Anda nanti akan membutuhkannya.

Membuat target pemasangan

Driver CSI untuk EFS mengakses sistem file melalui target pemasangan EFS. Target pemasangan adalah alamat IP pribadi yang menggunakan grup keamanan AWS untuk mengontrol akses ke EFS yang mendasarinya.

Jika kumpulan node dalam cluster Anda berjalan di subnet yang berbeda, Anda harus membuat target pemasangan yang terpisah di setiap subnet kumpulan node.

Dalam contoh ini, akses ke setiap target pemasangan dilindungi oleh satu grup keamanan yang mencakup target pemasangan dan mesin kumpulan node. Bergantung pada konfigurasi VPC dan persyaratan keamanan, Anda dapat memilih untuk membagi konfigurasi ini menjadi dua grup keamanan atau lebih—misalnya, satu untuk target pemasangan dan satu lagi untuk node pekerja kumpulan node.

  1. Buat grup keamanan khusus untuk mengontrol akses ke EFS

    Dapatkan ID VPC AWS tempat cluster dijalankan.

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

    Ganti kode berikut:

    • CLUSTER_NAME
    • LOCATION

    Outputnya mencakup ID VPC Anda. Simpan nilai ini. Anda nanti akan membutuhkannya.

  2. Buat grup keamanan untuk mengontrol akses ke target pemasangan EFS Anda.

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

    Ganti VPC_ID dengan ID VPC AWS tempat cluster berjalan.

    Outputnya mencakup ID grup keamanan baru. Simpan nilai ini. Anda nanti akan membutuhkannya.

  3. Secara default, AWS membuat grup keamanan dengan aturan default yang mengizinkan semua traffic keluar. Hapus aturan keluar default.

    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"}]}]'
    

    Ganti SECURITY_GROUP_ID dengan ID grup keamanan AWS.

  4. Mengizinkan traffic masuk dan keluar untuk 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. Buat target pemasangan EFS di setiap subnet kumpulan node.

    Mencantumkan subnet yang terkait dengan semua kumpulan node.

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

    Ganti kode berikut:

    • CLUSTER_NAME
    • LOCATION

    Output-nya adalah daftar ID subnet. Simpan nilai ini. Anda nanti akan membutuhkannya.

  6. Untuk setiap subnet, buat target pemasangan EFS terkait dengan grup keamanan yang diterapkan.

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

    Ganti kode berikut:

    • EFS_ID: ID resource EFS Anda.
    • SUBNET_ID: ID subnet kumpulan node.
    • SECURITY_GROUP_ID
  7. Tambahkan grup keamanan EFS ke semua kumpulan node cluster.

    Dapatkan daftar semua kumpulan node Anda.

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

    Ganti kode berikut:

    • CLUSTER_NAME
    • LOCATION

    Outputnya menyertakan nama-nama kumpulan node cluster Anda. Simpan nilai ini. Anda nanti akan membutuhkannya.

  8. Perbarui setiap kumpulan node untuk menyertakan grup keamanan EFS baru.

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

    Ganti kode berikut:

    • NODE_POOL_NAME: nama node pool.
    • CLUSTER_NAME: nama cluster Anda.
    • LOCATION
    • SECURITY_GROUP_IDS daftar ID grup keamanan untuk node pekerja.

Membuat PersistentVolume (statis) atau StorageClass (dinamis)

Jika Anda menggunakan penyediaan statis, langkah berikutnya adalah membuat PersistentVolume. Jika Anda menggunakan penyediaan dinamis, driver EFS akan melakukannya untuk Anda. Sebagai gantinya, Anda akan menentukan StorageClass untuk ditetapkan dalam PersistentVolumeClaim. Pilih tab yang cocok dengan metode penyediaan yang Anda pilih.

Penyediaan statis

Jika Anda menggunakan penyediaan statis, langkah berikutnya adalah membuat PersistentVolume yang memasang berbagi EFS.

  1. Pilih tab yang sesuai, tergantung apakah Anda terhubung langsung ke berbagi EFS atau melalui titik akses.

    Terhubung secara langsung

    Salin manifes YAML berikut ke dalam file bernama efs-volume.yaml. Manifes merujuk ke kelas penyimpanan EFS yang Anda buat sebelumnya.

    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
    

    Ganti kode berikut:

    • VOLUME_NAME yang diberi nama untuk volume persisten.
    • CLAIM_NAME dengan nama yang ingin Anda gunakan untuk PersistentVolumeClaim.
    • EFS_ID dengan ID resource EFS Anda. Misalnya, fs-12345678a.

    Titik akses

    Untuk membuat volume berbasis titik akses, Anda perlu menyediakannya secara manual. Lihat Bekerja dengan titik akses EFS untuk mengetahui informasi selengkapnya.

    Salin manifes YAML berikut ke dalam file bernama efs-volume.yaml. Manifes merujuk ke kelas penyimpanan EFS yang Anda buat sebelumnya.

    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](/kubernetes-engine/multi-cloud/docs/aws/how-to/use-efs)
      storageClassName: ""
      claimRef:
        name: CLAIM_NAME
        namespace: default
      csi:
        driver: efs.csi.aws.com
        volumeHandle: EFS_ID::ACCESS_POINT_ID
    

    Ganti kode berikut:

    • VOLUME_NAME yang diberi nama untuk volume persisten.
    • CLAIM_NAME dengan nama yang ingin Anda gunakan untuk PersistentVolumeClaim.
    • EFS_ID dengan ID resource EFS Anda. Misalnya, fs-12345678a.
    • ACCESS_POINT_ID dengan ID titik akses Anda. Misalnya, fsap-1234567890abcde.
  2. Terapkan YAML ke cluster Anda.

    kubectl apply -f efs-volume.yaml
    

    Output-nya mengonfirmasi pembuatan PersistentVolume.

    persistentvolume/VOLUME_NAME created
    
    

Penyediaan dinamis

Bagian ini menjelaskan cara membuat StorageClass yang mereferensikan resource EFS yang Anda buat sebelumnya. Setelah hal ini dilakukan, developer dapat mengakses resource EFS dengan mengikuti langkah-langkah yang dijelaskan dalam Menggunakan resource EFS.

  1. Buat StorageClass yang merujuk ke ID resource EFS.

    Salin fragmen yaml berikut ke file baru bernama efs-storage-class.yaml. Untuk mempelajari lebih lanjut cara menyesuaikan karakteristik StorageClass yang dijelaskan oleh file ini, lihat dokumentasi tentang parameter EFS StorageClass.

    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"
    
    

    Ganti:

    • EFS_STORAGE_CLASS_NAME dengan nama yang Anda pilih untuk StorageClass.
    • EFS_ID dengan ID resource EFS Anda - misalnya, fs-12345678a.
  2. Terapkan YAML ke cluster Anda.

    kubectl apply -f efs-storage-class.yaml
    

    Jika berhasil, output perintah ini akan berisi baris yang mirip dengan berikut:

    storageclass/EFS_STORAGE_CLASS_NAME created

Pembersihan

Untuk menghapus resource yang Anda buat di bagian sebelumnya, jalankan perintah berikut:

  1. Gunakan kubectl untuk menghapus resource klaim EFS dari cluster Anda:

    kubectl delete -f efs-claim.yaml
    
  2. Jika menggunakan penyediaan statis, gunakan kubectl untuk menghapus resource terkait dari cluster Anda:

    kubectl delete -f efs-volume.yaml
    
  3. Jika menggunakan penyediaan dinamis, gunakan kubectl untuk menghapus resource terkait dari cluster Anda:

    kubectl delete -f efs-storage-class.yaml
    
  4. Temukan ID target pemasangan Anda:

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

    Ganti kode berikut:

    • EFS_ID: ID resource EFS Anda
    • AWS_REGION: region AWS tempat cluster dijalankan

    Output-nya mencakup ID target pemasangan. Simpan nilai ini. Anda nanti akan membutuhkannya.

  5. Hapus target pemasangan EFS Anda:

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

    Ganti kode berikut:

    • MOUNT_TARGET_ID: ID target pemasangan EFS
    • AWS_REGION: region AWS dari target pemasangan Anda
  6. Hapus semua grup keamanan yang Anda buat.

  7. Menghapus sistem file menggunakan perintah CLI {i>delete-file-system<i}. Anda dapat memperoleh daftar sistem file menggunakan perintah CLI jelaskan-file-systems. ID sistem file ada dalam respons.

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

    Ganti kode berikut:

    • EFS_ID
    • AWS_REGION

Langkah selanjutnya