Memasang bucket Cloud Storage sebagai volume efemeral CSI

Panduan ini menunjukkan cara menggunakan volume efemeral CSI yang didukung oleh bucket Cloud Storage untuk mengelola resource penyimpanan secara otomatis untuk Pod atau Tugas Kubernetes di Google Kubernetes Engine (GKE). Volume efemeral CSI terikat dengan siklus proses Pod atau Tugas, dan Anda tidak perlu menangani objek PersistentVolume dan PersistentVolumeClaim secara manual.

Panduan ini ditujukan untuk admin dan operator Platform yang ingin menyederhanakan pengelolaan penyimpanan untuk aplikasi GKE mereka.

Sebelum membaca halaman ini, pastikan Anda memahami volume efemeral CSI, Pod dan Tugas Kubernetes, serta bucket Cloud Storage.

Jika Anda sudah memahami PersistentVolume dan menginginkan konsistensi dengan deployment yang ada yang mengandalkan jenis resource ini, lihat Memasang bucket Cloud Storage sebagai volume persisten.

Sebelum memulai

Pastikan Anda telah menyelesaikan prasyarat berikut:

Cara kerja penyimpanan efemeral CSI untuk bucket Cloud Storage

Volume efemeral CSI menyederhanakan pengelolaan penyimpanan untuk aplikasi Anda di GKE. Anda menentukan volume efemeral CSI langsung dalam spesifikasi Pod atau Tugas. Penggunaan volume efemeral CSI menghilangkan kebutuhan akan objek PersistentVolume dan PersistentVolumeClaim terpisah.

Penggunaan volume efemeral CSI melibatkan operasi berikut:

  1. Definisi penyimpanan: Anda menentukan penyimpanan dalam file YAML Pod atau Tugas, termasuk driver CSI yang akan digunakan dan parameter yang diperlukan. Untuk driver CSI Cloud Storage FUSE, Anda menentukan nama bucket dan detail relevan lainnya.

    Secara opsional, Anda dapat menyesuaikan performa driver CSI menggunakan fitur caching file. Caching file dapat meningkatkan performa aplikasi GKE dengan menyimpan file Cloud Storage yang sering diakses dalam cache pada disk yang lebih cepat.

    Selain itu, Anda dapat menggunakan fitur download paralel untuk mempercepat pembacaan file besar dari Cloud Storage untuk download multi-thread. Anda dapat menggunakan fitur ini untuk meningkatkan waktu pemuatan model, terutama untuk pembacaan berukuran lebih dari 1 GB.

  2. Pemanggilan driver: Saat Anda membuat Pod atau Tugas, GKE akan mendeteksi permintaan volume efemeral dan memanggil driver CSI Cloud Storage FUSE.

  3. Pemasangan dan lampiran volume: Driver CSI memasang volume efemeral CSI (yang mengarah ke bucket Cloud Storage yang mendasarinya) dan membuatnya tersedia untuk Pod atau Tugas, sehingga dapat diakses oleh aplikasi Anda. Untuk menyesuaikan cara bucket dipasang dalam sistem file, Anda dapat menggunakan opsi pemasangan. Anda juga dapat menggunakan atribut volume untuk mengonfigurasi perilaku tertentu dari driver CSI Cloud Storage FUSE.

  4. Pengelolaan siklus proses: Volume efemeral ada selama masa aktif Pod atau Tugas. Saat Pod dihapus atau Tugas selesai, driver CSI akan otomatis menangani pembersihan dan melepas volume.

Melampirkan volume efemeral CSI

Ikuti petunjuk ini, bergantung pada apakah Anda ingin melampirkan volume efemeral CSI ke Pod atau Tugas.

Pod

Untuk melampirkan volume efemeral CSI di Pod, ikuti langkah-langkah berikut:

  1. Buat manifes YAML Pod dengan spesifikasi berikut:

    apiVersion: v1
    kind: Pod
    metadata:
      name: gcs-fuse-csi-example-ephemeral 
      namespace: NAMESPACE
      annotations:
        gke-gcsfuse/volumes: "true" 
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - image: busybox
        name: busybox
        command: ["sleep"]
        args: ["infinity"] 
        volumeMounts:
        - name: gcs-fuse-csi-ephemeral
          mountPath: /data
          readOnly: true
      serviceAccountName: KSA_NAME
      volumes:
      - name: gcs-fuse-csi-ephemeral
        csi:
          driver: gcsfuse.csi.storage.gke.io
          readOnly: true
          volumeAttributes:
            bucketName: BUCKET_NAME
            mountOptions: "implicit-dirs" 
    

    Ganti nilai berikut:

    • NAMESPACE: namespace Kubernetes tempat Anda ingin men-deploy Pod.
    • KSA_NAME: nama Kubernetes ServiceAccount yang Anda tentukan saat mengonfigurasi akses ke bucket Cloud Storage.
    • BUCKET_NAME: nama bucket Cloud Storage yang Anda tentukan saat mengonfigurasi akses ke bucket Cloud Storage. Anda dapat menentukan garis bawah (_) untuk memasang semua bucket yang dapat diakses oleh Kubernetes ServiceAccount. Untuk mempelajari lebih lanjut, lihat Pemasangan dinamis dalam dokumentasi Cloud Storage FUSE.

    Manifes contoh menunjukkan setelan yang diperlukan ini:

    • metadata.annotations: anotasi gke-gcsfuse/volumes: "true" diperlukan. Lihat Mengonfigurasi container sidecar untuk anotasi opsional.
    • spec.volumes[n].csi.driver: gunakan gcsfuse.csi.storage.gke.io sebagai nama driver CSI.

    Secara opsional, Anda dapat menyesuaikan variabel ini:

    • spec.terminationGracePeriodSeconds: Secara default, nilai ini ditetapkan ke 30. Jika Anda perlu menulis file besar ke bucket Cloud Storage, tingkatkan nilai ini untuk memastikan Cloud Storage FUSE memiliki cukup waktu untuk mengosongkan data setelah aplikasi Anda keluar. Untuk mempelajari lebih lanjut, lihat Praktik terbaik Kubernetes: berhenti berlangganan dengan masa tenggang.
    • spec.volumes[n].csi.volumeAttributes.mountOptions: Teruskan opsi pemasangan ke Cloud Storage FUSE. Tentukan flag dalam satu string yang dipisahkan dengan koma, tanpa spasi.
    • spec.volumes[n].csi.volumeAttributes: Teruskan atribut volume tambahan ke Cloud Storage FUSE.
    • spec.volumes[n].csi.readOnly: Tentukan benar (true) jika semua volume yang terpasang bersifat hanya baca.
    • spec.containers[n].volumeMounts[m].readOnly: Tentukan benar (true) jika hanya volume tertentu yang bersifat hanya baca.
  2. Jalankan perintah berikut untuk menerapkan manifes ke cluster Anda:

    kubectl apply -f FILE_PATH
    

    Ganti FILE_PATH dengan jalur ke file YAML Anda.

Pod (caching file)

Untuk melampirkan volume efemeral CSI dengan caching file di Pod, ikuti langkah-langkah berikut:

  1. Buat cluster atau node pool dengan penyimpanan efemeral yang didukung SSD Lokal, dengan mengikuti langkah-langkah di Membuat cluster atau node pool dengan penyimpanan efemeral yang didukung SSD Lokal.

  2. Buat manifes YAML Pod dengan spesifikasi berikut:

    apiVersion: v1
    kind: Pod
    metadata:
      name: gcs-fuse-csi-file-cache-example 
      namespace: NAMESPACE
      annotations:
        gke-gcsfuse/volumes: "true"
        gke-gcsfuse/ephemeral-storage-limit: "50Gi" 
    spec:
      nodeSelector:
        cloud.google.com/gke-ephemeral-storage-local-ssd: "true"
      restartPolicy: Never
      initContainers:
      - name: data-loader
        image: gcr.io/google.com/cloudsdktool/google-cloud-cli:slim
        resources:
          limits:
            cpu: 500m
            memory: 1Gi
          requests:
            cpu: 500m
            memory: 1Gi
        command:
          - "/bin/sh"
          - "-c"
          - |
            mkdir -p /test_files
            for i in $(seq 1 1000); do dd if=/dev/zero of=/test_files/file_$i.txt bs=1024 count=64; done
            gcloud storage cp /test_files gs://BUCKET_NAME --recursive
      containers:
      - name: data-validator
        image: busybox
        resources:
          limits:
            cpu: 500m
            memory: 512Mi
          requests:
            cpu: 500m
            memory: 512Mi
        command:
          - "/bin/sh"
          - "-c"
          - |
            echo "first read with cache miss"
            time cat /data/test_files/file_* > /dev/null
    
            echo "second read from local cache"
            time cat /data/test_files/file_* > /dev/null 
        volumeMounts:
        - name: gcs-fuse-csi-ephemeral
          mountPath: /data
      serviceAccountName: KSA_NAME
      volumes:
      - name: gcs-fuse-csi-ephemeral
        csi:
          driver: gcsfuse.csi.storage.gke.io
          volumeAttributes:
            bucketName: BUCKET_NAME
            mountOptions: "implicit-dirs,file-cache:max-size-mb:-1"
    

    Ganti nilai berikut:

    • NAMESPACE: namespace Kubernetes tempat Anda ingin men-deploy Pod.
    • KSA_NAME: nama Kubernetes ServiceAccount yang Anda tentukan saat mengonfigurasi akses ke bucket Cloud Storage.
    • BUCKET_NAME: nama bucket Cloud Storage yang Anda tentukan saat mengonfigurasi akses ke bucket Cloud Storage. Anda dapat menentukan garis bawah (_) untuk memasang semua bucket yang dapat diakses oleh Kubernetes ServiceAccount. Untuk mempelajari lebih lanjut, lihat Pemasangan dinamis dalam dokumentasi Cloud Storage FUSE.

      Dalam manifes contoh, pemuat data container init menghasilkan 1.000 file dengan ukuran 64 KiB, dan mengupload file ke bucket Cloud Storage. Container utama data-validator membaca semua file dari bucket dua kali, dan mencatat durasinya.

  3. Jalankan perintah berikut untuk menerapkan manifes ke cluster Anda:

    kubectl apply -f FILE_PATH
    

    Ganti FILE_PATH dengan jalur ke file YAML Anda.

  4. Untuk melihat output log, jalankan perintah berikut:

    kubectl logs -n NAMESPACE gcs-fuse-csi-file-cache-example -c data-validator
    

    Ganti NAMESPACE dengan namespace workload Anda.

    Output-nya akan terlihat seperti berikut:

    first read with cache miss
    real    0m 54.68s
    ...
    second read from local cache
    real    0m 0.38s
    ...
    

    Output menunjukkan bahwa pembacaan kedua dengan cache lokal jauh lebih cepat daripada pembacaan pertama dengan cache yang tidak ditemukan.

Pod (download paralel)

Untuk melampirkan volume efemeral CSI dengan download paralel di Pod, ikuti langkah-langkah berikut:

  1. Buat manifes YAML Pod dengan spesifikasi berikut:

    apiVersion: v1
    kind: Pod
    metadata:
      name: gcs-fuse-csi-example-ephemeral 
      namespace: NAMESPACE
      annotations:
        gke-gcsfuse/volumes: "true"
        gke-gcsfuse/ephemeral-storage-limit: "50Gi" 
    spec:
      containers:
      ...
      volumes:
      - name: gcs-fuse-csi-ephemeral 
        csi:
          driver: gcsfuse.csi.storage.gke.io
          volumeAttributes:
            bucketName: BUCKET_NAME
            mountOptions: "implicit-dirs,file-cache:enable-parallel-downloads:true,file-cache:max-size-mb:-1"
            fileCacheCapacity: "-1"
    

    Ganti nilai berikut:

    • NAMESPACE: namespace Kubernetes tempat Anda ingin men-deploy Pod.
    • BUCKET_NAME: nama bucket Cloud Storage yang Anda tentukan saat mengonfigurasi akses ke bucket Cloud Storage. Anda dapat menentukan garis bawah (_) untuk memasang semua bucket yang dapat diakses oleh Kubernetes ServiceAccount. Untuk mempelajari lebih lanjut, lihat Pemasangan dinamis dalam dokumentasi Cloud Storage FUSE.
  2. Jalankan perintah berikut untuk menerapkan manifes ke cluster Anda:

    kubectl apply -f FILE_PATH
    

    Ganti FILE_PATH dengan jalur ke file YAML Anda.

Tugas

Untuk melampirkan volume efemeral CSI di Tugas, ikuti langkah-langkah berikut:

  1. Buat manifes YAML Tugas dengan spesifikasi berikut:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: gcs-fuse-csi-job-example 
      namespace: NAMESPACE 
    spec:
      template:
        metadata: 
          annotations:
            gke-gcsfuse/volumes: "true"
        spec:
          serviceAccountName: KSA_NAME 
          containers:
          - name: writer
            image: busybox
            command:
              - "/bin/sh"
              - "-c"
              - touch /data/test && echo $(date) >> /data/test && sleep 10
            volumeMounts:
            - name: gcs-fuse-csi-ephemeral
              mountPath: /data
          - name: reader
            image: busybox
            command:
              - "/bin/sh"
              - "-c"
              - sleep 10 && cat /data/test 
            volumeMounts:
            - name: gcs-fuse-csi-ephemeral
              mountPath: /data
              readOnly: true
          volumes:
          - name: gcs-fuse-csi-ephemeral
            csi:
              driver: gcsfuse.csi.storage.gke.io
              volumeAttributes:
                bucketName: BUCKET_NAME
          restartPolicy: Never 
      backoffLimit: 1
    

    Ganti nilai berikut:

    • NAMESPACE: namespace Kubernetes tempat Anda men-deploy Pod.
    • KSA_NAME: nama Kubernetes ServiceAccount yang Anda tentukan saat mengonfigurasi akses ke bucket Cloud Storage.
    • BUCKET_NAME: nama bucket Cloud Storage yang Anda tentukan saat mengonfigurasi akses ke bucket Cloud Storage. Anda dapat menentukan garis bawah (_) untuk memasang semua bucket yang dapat diakses oleh Kubernetes ServiceAccount. Untuk mempelajari lebih lanjut, lihat Pemasangan dinamis dalam dokumentasi Cloud Storage FUSE.

    Manifes contoh menunjukkan setelan yang diperlukan ini:

    • metadata.annotations: anotasi gke-gcsfuse/volumes: "true" diperlukan. Lihat Mengonfigurasi container sidecar untuk anotasi opsional.
    • spec.volumes[n].csi.driver: gunakan gcsfuse.csi.storage.gke.io sebagai nama driver CSI.

    Secara opsional, Anda dapat menyesuaikan variabel ini:

    • spec.volumes[n].csi.volumeAttributes.mountOptions: Teruskan opsi pemasangan ke Cloud Storage FUSE. Tentukan flag dalam satu string yang dipisahkan dengan koma, tanpa spasi.
    • spec.volumes[n].csi.volumeAttributes: Teruskan atribut volume tambahan ke Cloud Storage FUSE.
    • spec.volumes[n].csi.readOnly: Tentukan benar (true) jika semua volume yang terpasang bersifat hanya baca.
    • spec.containers[n].volumeMounts[m].readOnly: Tentukan benar (true) jika hanya volume tertentu yang bersifat hanya baca.
  2. Jalankan perintah berikut untuk menerapkan manifes ke cluster Anda:

    kubectl apply -f FILE_PATH
    

    Ganti FILE_PATH dengan jalur ke file YAML Anda.

Memasang bucket Cloud Storage yang sama dengan volume efemeral CSI yang berbeda

Anda dapat menggunakan beberapa volume efemeral CSI yang didukung oleh bucket Cloud Storage yang sama. Untuk melakukannya, lampirkan dua atau beberapa volume yang mereferensikan nama bucket yang sama di jalur pemasangan yang berbeda. Contoh kasus penggunaan adalah memasang volume efemeral CSI yang berbeda dengan opsi pemasangan yang berbeda ke Pod yang sama, dengan setiap volume efemeral merujuk ke bucket Cloud Storage yang sama. Berikut adalah contoh manifes Pod yang menggunakan fitur ini:

apiVersion: batch/v1
kind: Job
metadata:
  name: gcs-fuse-csi-job-example
  namespace: NAMESPACE
spec:
  template:
    metadata:
      annotations:
        gke-gcsfuse/volumes: "true"
    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: writer
        image: busybox
        command:
          - "/bin/sh"
          - "-c"
          - touch /data/test && echo $(date) >> /data/test && sleep 10
        volumeMounts: 
        - name: gcs-fuse-csi-ephemeral
          mountPath: /data
        volumeMounts:
        - name: gcs-fuse-csi-ephemeral-with-mo
          mountPath: /data2
      volumes:
      - name: gcs-fuse-csi-ephemeral
        csi:
          driver: gcsfuse.csi.storage.gke.io
          volumeAttributes:
            bucketName: BUCKET_NAME
      - name: gcs-fuse-csi-ephemeral-with-mo
        csi:
          driver: gcsfuse.csi.storage.gke.io
          volumeAttributes:
            bucketName: BUCKET_NAME
            mountOptions: "implicit-dirs"
      restartPolicy: Never
  backoffLimit: 1

Memecahkan masalah

Untuk mengetahui informasi selengkapnya tentang cara memecahkan masalah driver CSI Cloud Storage FUSE, lihat panduan pemecahan masalah dalam dokumentasi project GitHub.

Langkah berikutnya