Menggunakan sistem file EFS

GKE di AWS versi 1.6 dan yang lebih baru mendukung Elastic File System (EFS) AWS melalui EFS CSI Driver. Topik ini menjelaskan cara memasang sistem file EFS yang ada sebagai PersistentVolume pada cluster pengguna Anda.

Sebelum memulai

Untuk melakukan langkah-langkah dalam topik ini, Anda memerlukan hal berikut:

  • Sistem file EFS yang sudah ada di VPC AWS yang sama dengan penginstalan GKE di AWS Anda.
  • Setidaknya satu target pemasangan EFS di VPC AWS yang sama dengan GKE pada penginstalan AWS.
  • Semua target pemasangan EFS harus termasuk dalam kategori berikut:
    • Subnet pribadi untuk GKE pada penginstalan AWS. Secara default, GKE di AWS membuat subnet bernama gke-CLUSTER_ID-private-AWS_ZONE, dengan CLUSTER_ID sebagai ID cluster pengguna Anda dan AWS_ZONE adalah zona ketersediaan AWS.
    • Grup keamanan kumpulan node. Secara default, GKE di AWS membuat node pool dengan nama gke-CLUSTER_ID-nodepool, dengan CLUSTER_ID sebagai ID cluster pengguna Anda.
  • Dari direktori anthos-aws, gunakan anthos-gke untuk mengalihkan konteks ke cluster pengguna.
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Ganti CLUSTER_NAME dengan nama cluster pengguna Anda.

Menggunakan PersistentVolume EFS

Untuk menggunakan sistem file EFS sebagai PersistentVolume dengan cluster pengguna, pertama-tama buat PersistentVolume, lalu buat PersistentVolumeClaim yang Anda rujuk dalam workload Anda.

Membuat PersistentVolume

Untuk membuat PersistentVolume dengan driver EFS CSI, lakukan langkah-langkah berikut.

  1. Dari direktori anthos-aws, gunakan anthos-gke untuk mengalihkan konteks ke cluster pengguna.

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Ganti CLUSTER_NAME dengan nama cluster pengguna Anda.

  2. Konfigurasi PersistentVolume yang Anda gunakan bergantung pada apakah Anda terhubung langsung ke Elastic File System atau melalui titik akses. Pilih apakah Anda terhubung ke Elastic File System secara langsung 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_FILE_SYSTEM_ID
    

    Ganti kode berikut:

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

    Titik akses

    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_FILE_SYSTEM_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_FILE_SYSTEM_ID dengan ID sistem file EFS Anda. Misalnya, fs-12345678a.
    • ACCESS_POINT_ID dengan ID titik akses Anda. Misalnya, fsap-1234567890abcde.
  3. Terapkan YAML ke cluster pengguna Anda.

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

    Output-nya mengonfirmasi pembuatan PersistentVolume.

    persistentvolume/VOLUME_NAME created
    

Membuat PersistentVolumeClaim

Untuk menggunakan sistem file EFS dengan workload, buat PersistentVolumeClaim.

  1. Untuk membuat PersistentVolumeClaim, salin manifes YAML berikut ke dalam file bernama efs-claim.yaml.

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

    Ganti CLAIM_NAME dengan nama untuk PersistentVolumeClaim. Contoh, efs-claim1.

  2. Terapkan YAML ke cluster pengguna Anda.

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

    Output-nya mengonfirmasi pembuatan PersistentVolumeClaim.

    persistentvolumeclaim/CLAIM_NAME created
    

Membuat StatefulSet

Setelah membuat PersistentVolumeClaim, Anda dapat menggunakannya dalam beban kerja. Langkah-langkah di bagian ini akan membuat contoh StatefulSet dengan terpasangnya sistem file EFS Anda. Anda juga dapat menggunakan PersistentVolumeClaim dengan jenis beban kerja lainnya seperti Pod dan Deployment dengan mereferensikan klaim di spec.volumes.

Untuk membuat StatefulSet yang memasang sistem file EFS yang dirujuk dalam PersistentVolumeClaim, lakukan langkah-langkah berikut.

  1. Salin manifes YAML berikut ke dalam file bernama efs-statefulset.yaml. Manifes contoh ini meluncurkan container Linux Ubuntu yang memasang sistem file EFS di /efs-data. Container menulis setiap lima detik ke file di sistem file EFS Anda yang bernama 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
    

    Ganti kode berikut:

    • CLAIM_NAME dengan nama PersistentVolumeClaim yang Anda tentukan sebelumnya. Contoh, efs-claim1.
  2. Terapkan YAML ke cluster pengguna Anda.

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

    Output-nya mengonfirmasi pembuatan StatefulSet.

    statefulset.apps/efs-shell created
    

    StatefulSet mungkin memerlukan waktu beberapa menit untuk mendownload dan meluncurkan image container.

  3. Pastikan Pod StatefulSet memiliki status Running dengan kubectl get pods.

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

    Output mencakup nama Pod dan statusnya. Dalam respons berikut, nama Pod adalah efs-shell-0.

    NAME          READY   STATUS    RESTARTS   AGE
    efs-shell-0   1/1     Running   0          1m
    
  4. Setelah Pod dalam status Running, gunakan kubectl exec untuk terhubung ke Pod yang menghosting StatefulSet.

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

    Perintah kubectl meluncurkan shell pada Pod.

  5. Untuk memastikan bahwa sistem file EFS Anda sudah terpasang, periksa isi file out.txt dengan perintah tail.

    tail /efs-data/out.txt
    

    Output berisi waktu terbaru dalam UTC.

  6. Putuskan koneksi dari Pod dengan perintah exit.

    exit
    

    Shell akan kembali ke komputer lokal Anda.

  7. Untuk menghapus StatefulSet, gunakan kubectl delete.

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

Pembersihan

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

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

Langkah selanjutnya