Menggunakan sistem file EFS

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

Sebelum memulai

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

  • Sistem file EFS yang ada di AWS VPC yang sama dengan penginstalan GKE di AWS Anda.
  • Setidaknya satu target pemasangan EFS di AWS VPC yang sama dengan penginstalan GKE di AWS.
  • Semua target pemasangan EFS Anda harus termasuk dalam:
    • Subnet pribadi untuk penginstalan GKE di AWS. Secara default, GKE di AWS membuat subnet bernama gke-CLUSTER_ID-private-AWS_ZONE, dengan CLUSTER_ID adalah ID cluster pengguna dan AWS_ZONE adalah zona ketersediaan AWS.
    • Grup keamanan node pool. Secara default, GKE di AWS membuat node pool bernama gke-CLUSTER_ID-nodepool, dengan CLUSTER_ID adalah ID cluster pengguna Anda.
  • Dari direktori anthos-aws, gunakan anthos-gke untuk beralih konteks ke cluster pengguna Anda.
    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, Anda harus membuat PersistentVolume terlebih dahulu, lalu membuat PersistentVolumeClaim yang Anda referensikan di workload.

Membuat PersistentVolume

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

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

    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 jika Anda terhubung ke Elastic File System secara langsung atau melalui titik akses.

    Terhubung langsung

    Salin manifes YAML berikut ke dalam file bernama efs-volume.yaml. Manifes mereferensikan class 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 dengan nama untuk volume persisten.
    • CLAIM_NAME dengan nama yang ingin Anda gunakan untuk PersistentVolumeClaim.
    • EFS_FILE_SYSTEM_ID dengan ID sistem file EFS Anda. Contoh, fs-12345678a.

    Titik akses

    Salin manifes YAML berikut ke dalam file bernama efs-volume.yaml. Manifes mereferensikan class 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 dengan nama untuk volume persisten.
    • CLAIM_NAME dengan nama yang ingin Anda gunakan untuk PersistentVolumeClaim.
    • EFS_FILE_SYSTEM_ID dengan ID sistem file EFS Anda. Contoh, fs-12345678a.
    • ACCESS_POINT_ID dengan ID titik akses Anda. Contoh, fsap-1234567890abcde.
  3. Terapkan YAML ke cluster pengguna Anda.

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

    Output mengonfirmasi pembuatan PersistentVolume.

    persistentvolume/VOLUME_NAME created
    

Membuat PersistentVolumeClaim

Untuk menggunakan sistem file EFS dengan beban kerja, Anda membuat 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 Anda. Contoh, efs-claim1.

  2. Terapkan YAML ke cluster pengguna Anda.

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

    Output mengonfirmasi pembuatan PersistentVolumeClaim.

    persistentvolumeclaim/CLAIM_NAME created
    

Buat StatefulSet

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

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

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

    statefulset.apps/efs-shell created
    

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

  3. Konfirmasi bahwa Pod StatefulSet berstatus Running dengan kubectl get pods.

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

    Output menyertakan 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 berstatus Berjalan, 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 di Pod.

  5. Untuk mengonfirmasi bahwa sistem file EFS Anda telah dipasang, periksa konten 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 Anda 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 berikutnya