Menggunakan Cloud Storage FUSE dengan tutorial Cloud Run


Tutorial ini menunjukkan cara memasang Cloud Storage sebagai sistem file jaringan ke dalam layanan Cloud Run. Pendekatan yang sama dapat digunakan untuk tugas Cloud Run.

Tutorial ini menggunakan adaptor open source FUSE untuk berbagi data antara beberapa container dan layanan.

Layanan Anda harus menggunakan lingkungan eksekusi generasi kedua Cloud Run untuk memasang sistem file. Secara otomatis, tugas Cloud Run menggunakan lingkungan generasi kedua.

Lingkungan eksekusi generasi kedua memungkinkan sistem file jaringan untuk dipasang ke dalam direktori container. Memasang sistem file memungkinkan untuk berbagi resource antara sistem host dan instance serta mempertahankan resource setelah instance dalam pembersihan sampah memori.

Menggunakan sistem file jaringan dengan Cloud Run memerlukan pengetahuan Docker tingkat lanjut karena container Anda harus menjalankan beberapa proses, termasuk pemasangan sistem file dan proses aplikasi. Tutorial ini menjelaskan konsep yang diperlukan beserta contoh kerja; akan tetapi, saat Anda mengadaptasikan tutorial ini ke aplikasi Anda sendiri, pastikan Anda memahami implikasi dari perubahan apa pun yang mungkin Anda buat.

Ringkasan Desain

sistem file-berbasis cloud

Diagram ini menunjukkan layanan Cloud Run yang terhubung ke bucket Cloud Storage melalui gcsfuse FUSE FUSE. Layanan Cloud Run dan bucket Cloud Storage terletak dalam region yang sama untuk menghapus biaya jaringan dan untuk mendapatkan performa terbaik.

Batasan

  • Tutorial ini tidak menjelaskan cara memilih sistem file, serta tidak membahas kesiapan produksi. Tinjau perbedaan Utama dari sistem file POSIX dan semantik Cloud Storage FUSE lainnya.

  • Tutorial ini tidak menunjukkan cara kerja dengan sistem file atau membahas pola akses file.

Tujuan

  • Buat bucket Cloud Storage untuk menyajikan fitur berbagi file.

  • Bangun Dockerfile dengan paket sistem dan proses init untuk mengelola proses pemasangan aplikasi.

  • Deploy ke Cloud Run dan verifikasi akses ke sistem file di layanan.

Biaya

Tutorial ini menggunakan komponen Google Cloud yang dapat ditagih, termasuk:

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  5. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  6. Enable the Cloud Run, Cloud Storage, Artifact Registry, and Cloud Build APIs.

    Enable the APIs

  7. Instal dan lakukan inisialisasi gcloud CLI.

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan tutorial dengan serangkaian peran minimum, silakan tanya administrator Anda untuk memberi Anda peran IAM berikut di project Anda:

Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Menyiapkan default gcloud

Untuk mengonfigurasi gcloud dengan setelan default untuk layanan Cloud Run Anda:

  1. Setel project default Anda:

    gcloud config set project PROJECT_ID

    Ganti PROJECT_ID dengan nama project yang Anda buat untuk tutorial ini.

  2. Konfigurasi gcloud untuk region yang Anda pilih:

    gcloud config set run/region REGION

    Ganti REGION dengan region Cloud Run pilihan Anda yang didukung.

Lokasi Cloud Run

Cloud Run bersifat regional, berarti infrastruktur yang menjalankan layanan Cloud Run Anda terletak di region tertentu dan dikelola oleh Google agar tersedia secara redundan di semua zona dalam region tersebut.

Memenuhi persyaratan latensi, ketersediaan, atau ketahanan adalah faktor utama untuk memilih region tempat layanan Cloud Run dijalankan. Pada umumnya, Anda dapat memilih region yang paling dekat dengan pengguna Anda, tetapi Anda harus mempertimbangkan lokasi dari produk Google Cloud lain yang digunakan oleh layanan Cloud Run Anda. Menggunakan produk Google Cloud secara bersamaan di beberapa lokasi dapat memengaruhi latensi serta biaya layanan Anda.

Cloud Run tersedia di region berikut:

Tergantung harga Tingkat 1

  • asia-east1 (Taiwan)
  • asia-northeast1 (Tokyo)
  • asia-northeast2 (Osaka)
  • europe-north1 (Finlandia) ikon daun CO2 Rendah
  • europe-southwest1 (Madrid)
  • europe-west1 (Belgia) ikon daun CO2 Rendah
  • europe-west4 (Belanda)
  • europe-west8 (Milan)
  • europe-west9 (Paris) ikon daun CO2 Rendah
  • me-west1 (Tel Aviv)
  • us-central1 (Iowa) ikon daun CO2 rendah
  • us-east1 (South Carolina)
  • us-east4 (North Virginia)
  • us-east5 (Columbus)
  • us-south1 (Dallas)
  • us-west1 (Oregon) ikon daun CO2 Rendah

Tergantung harga Tingkat 2

  • asia-east2 (Hong Kong)
  • asia-northeast3 (Seoul, Korea Selatan)
  • asia-southeast1 (Singapura)
  • asia-southeast2 (Jakarta)
  • asia-south1 (Mumbai, India)
  • asia-south2 (Delhi, India)
  • australia-southeast1 (Sydney)
  • australia-southeast2 (Melbourne)
  • europe-central2 (Warsawa, Polandia)
  • europe-west10 (Berlin)
  • europe-west12 (Turin)
  • europe-west2 (London, Inggris Raya) ikon daun CO2 Rendah
  • europe-west3 (Frankfurt, Jerman) ikon daun CO2 Rendah
  • europe-west6 (Zurich, Swiss) ikon daun CO2 Rendah
  • me-central1 (Doha)
  • me-central2 (Dammam)
  • northamerica-northeast1 (Montreal) ikon daun CO2 Rendah
  • northamerica-northeast2 (Toronto) ikon daun CO2 Rendah
  • southamerica-east1 (Sao Paulo, Brasil) ikon daun CO2 Rendah
  • southamerica-west1 (Santiago, Cile) ikon daun CO2 Rendah
  • us-west2 (Los Angeles)
  • us-west3 (Salt Lake City)
  • us-west4 (Las Vegas)

Jika sudah membuat layanan Cloud Run, Anda dapat melihat region di dasbor Cloud Run di Konsol Google Cloud.

Mengambil contoh kode

Untuk mengambil contoh kode agar dapat digunakan:

  1. Clone repositori aplikasi contoh ke komputer lokal Anda:

    Node.js

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

    Atau, Anda dapat mendownload contoh sebagai file ZIP dan mengekstraknya.

    Python

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

    Atau, Anda dapat mendownload contoh sebagai file ZIP dan mengekstraknya.

    Java

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git

    Atau, Anda dapat mendownload contoh sebagai file ZIP dan mengekstraknya.

  2. Ubah ke direktori yang memuat kode contoh Cloud Run:

    Node.js

    cd nodejs-docs-samples/run/filesystem/

    Python

    cd python-docs-samples/run/filesystem/

    Java

    cd java-docs-samples/run/filesystem/

Memahami kode

Biasanya, Anda harus menjalankan satu proses atau aplikasi dalam sebuah container. Menjalankan satu proses per container akan mengurangi kerumitan dalam pengelolaan siklus proses dari beberapa proses: mengelola mulai ulang, menghentikan container jika ada proses yang gagal, dan tanggung jawab PID 1 seperti penerusan sinyal dan turunan zombie menuai. Namun, menggunakan sistem file jaringan di Cloud Run mengharuskan Anda menggunakan container multi-proses untuk menjalankan baik itu proses pemasangan sistem file dan aplikasi. Tutorial ini menunjukkan cara menghentikan container jika terjadi kegagalan proses dan mengelola tanggung jawab PID 1. Perintah pemasangan memiliki fungsionalitas bawaan untuk menangani percobaan ulang.

Anda dapat menggunakan pengelola proses untuk menjalankan dan mengelola beberapa proses sebagai titik masuk container. Tutorial ini menggunakan tini, pengganti init yang membersihkan proses zombie dan melakukan penerusan sinyal. Secara khusus, proses init ini memungkinkan sinyal SIGTERM saat shutdown untuk disebarkan ke aplikasi. Sinyal SIGTERM dapat ditangkap untuk penghentian aplikasi yang lancar. Pelajari lebih lanjut tentang siklus proses container pada Cloud Run.

Menentukan konfigurasi lingkungan Anda dengan Dockerfile

Layanan Cloud Run ini memerlukan satu atau beberapa paket sistem tambahan yang tidak tersedia dalam default. Petunjuk RUN ini akan menginstal tini sesuai dengan proses init dan gcsfuse, adaptor FUSE kami. Baca selengkapnya tentang cara kerja dengan paket sistem di layanan Cloud Run Anda dalamTutorial menggunakan paket sistem.

Rangkaian petunjuk berikutnya membuat direktori kerja, menyalin kode sumber, dan menginstal dependensi aplikasi.

ENTRYPOINT menentukan biner proses-init yang ditambahkan ke petunjuk CMD, dalam hal ini adalah skrip startup. Tindakan ini meluncurkan satu proses kecil dan kemudian melakukan proxy semua sinyal yang diterima ke sesi yang di-root pada proses turunan tersebut.

Petunjuk CMD menetapkan perintah yang akan dieksekusi saat menjalankan image, skrip startup. Hal ini juga menyediakan argumen default untuk ENTRYPOINT. Pahami cara CMD dan ENTRYPOINT berinteraksi.

Node.js


# Use the official Node.js image.
# https://hub.docker.com/_/node
FROM node:20-slim

# Install system dependencies
RUN apt-get update && apt-get install -y \
    curl \
    gnupg \
    lsb-release \
    tini && \
    gcsFuseRepo=gcsfuse-`lsb_release -c -s` && \
    echo "deb https://packages.cloud.google.com/apt $gcsFuseRepo main" | \
    tee /etc/apt/sources.list.d/gcsfuse.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
    apt-key add - && \
    apt-get update && \
    apt-get install -y gcsfuse && \
    apt-get clean

# Set fallback mount directory
ENV MNT_DIR /mnt/gcs

# Copy local code to the container image.
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Ensure the script is executable
RUN chmod +x /app/gcsfuse_run.sh

# Use tini to manage zombie processes and signal forwarding
# https://github.com/krallin/tini
ENTRYPOINT ["/usr/bin/tini", "--"]

# Pass the wrapper script as arguments to tini
CMD ["/app/gcsfuse_run.sh"]

Python

# Use the official lightweight Python image.
# https://hub.docker.com/_/python
FROM python:3.11-buster

# Install system dependencies
RUN set -e; \
    apt-get update -y && apt-get install -y \
    tini \
    lsb-release; \
    gcsFuseRepo=gcsfuse-`lsb_release -c -s`; \
    echo "deb https://packages.cloud.google.com/apt $gcsFuseRepo main" | \
    tee /etc/apt/sources.list.d/gcsfuse.list; \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
    apt-key add -; \
    apt-get update; \
    apt-get install -y gcsfuse \
    && apt-get clean

# Set fallback mount directory
ENV MNT_DIR /mnt/gcs

# Copy local code to the container image.
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./

# Install production dependencies.
RUN pip install -r requirements.txt

# Ensure the script is executable
RUN chmod +x /app/gcsfuse_run.sh

# Use tini to manage zombie processes and signal forwarding
# https://github.com/krallin/tini
ENTRYPOINT ["/usr/bin/tini", "--"]

# Pass the startup script as arguments to Tini
CMD ["/app/gcsfuse_run.sh"]

Java

# Use the official maven/Java 11 image to create a build artifact.
# https://hub.docker.com/_/maven
FROM maven:3-eclipse-temurin-17-alpine as builder

# Copy local code to the container image.
WORKDIR /app
COPY pom.xml .
COPY src ./src

# Build a release artifact.
RUN mvn package -DskipTests

# Use Eclipse Temurin for base image.
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM eclipse-temurin:18-jdk-focal

# Install system dependencies
RUN set -e; \
    apt-get update -y && apt-get install -y \
    gnupg2 \
    tini \
    lsb-release; \
    gcsFuseRepo=gcsfuse-`lsb_release -c -s`; \
    echo "deb https://packages.cloud.google.com/apt $gcsFuseRepo main" | \
    tee /etc/apt/sources.list.d/gcsfuse.list; \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
    apt-key add -; \
    apt-get update; \
    apt-get install -y gcsfuse && apt-get clean

# Set fallback mount directory
ENV MNT_DIR /mnt/gcs

# Copy the jar to the production image from the builder stage.
COPY --from=builder /app/target/filesystem-*.jar /filesystem.jar

# Copy the statup script
COPY gcsfuse_run.sh ./gcsfuse_run.sh
RUN chmod +x ./gcsfuse_run.sh

# Use tini to manage zombie processes and signal forwarding
# https://github.com/krallin/tini
ENTRYPOINT ["/usr/bin/tini", "--"]

# Run the web service on container startup.
CMD ["/gcsfuse_run.sh"]

Mendefinisikan proses skrip startup Anda

Skrip startup membuat direktorimount point, tempat bucket Cloud Storage akan diakses. Berikutnya skrip akan melampirkan bucket Cloud Storage pada layanan mount point menggunakan gcsfuse perintah, kemudian memulai layanan aplikasi. Perintah gcsfuse memiliki fungsi percobaan ulang bawaan; sehingga pembuatan skrip bash lebih lanjut tidak diperlukan. Terakhir, perintah wait digunakan untuk memproses beberapa proses latar belakang untuk keluar lalu keluar dari skrip.

Node.js

#!/usr/bin/env bash
set -eo pipefail

# Create mount directory for service
mkdir -p $MNT_DIR

echo "Mounting GCS Fuse."
gcsfuse --debug_gcs --debug_fuse $BUCKET $MNT_DIR
echo "Mounting completed."

# Start the application
node index.js &

# Exit immediately when one of the background processes terminate.
wait -n

Python

#!/usr/bin/env bash
set -eo pipefail

# Create mount directory for service
mkdir -p $MNT_DIR

echo "Mounting GCS Fuse."
gcsfuse --debug_gcs --debug_fuse $BUCKET $MNT_DIR
echo "Mounting completed."

# Run the web service on container startup. Here we use the gunicorn
# webserver, with one worker process and 8 threads.
# For environments with multiple CPU cores, increase the number of workers
# to be equal to the cores available.
# Timeout is set to 0 to disable the timeouts of the workers to allow Cloud Run to handle instance scaling.
exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

Java

#!/usr/bin/env bash
set -eo pipefail

# Create mount directory for service
mkdir -p $MNT_DIR

echo "Mounting GCS Fuse."
gcsfuse --debug_gcs --debug_fuse $BUCKET $MNT_DIR
echo "Mounting completed."

# Start the application
java -jar filesystem.jar

# Exit immediately when one of the background processes terminate.
wait -n

Bekerja dengan file

Node.js

Lihat index.js untuk berinteraksi dengan sistem file.

Python

Lihat main.py untuk berinteraksi dengan sistem file.

Java

Lihat FilesystemApplication.java untuk berinteraksi dengan sistem file.

Mengirimkan layanan

  1. Buat bucket Cloud Storage atau gunakan kembali bucket yang ada:

    gsutil mb -l REGION gs://BUCKET_NAME
    

    Ganti BUCKET_NAME dengan nama bucket Cloud Storage, misalnya my-fuse-bucket. Nama bucket Cloud Storage harus unik secara global dan harus tunduk kepada persyaratan penamaan.

    Tetapkan -l untuk menentukan lokasi bucket Anda. Contoh, us-central1. Untuk mendapatkan performa terbaik dan untuk menghindari biaya jaringan lintas-regional, pastikan bahwa bucket Cloud Storage terletak di region yang sama dengan layanan Cloud Run yang perlu mengaksesnya.

  2. Buat akun layanan untuk melayani sebagai identitas layanan:

    gcloud iam service-accounts create fs-identity
  3. Berikan akses akun layanan ke bucket Cloud Storage

    gcloud projects add-iam-policy-binding PROJECT_ID \
         --member "serviceAccount:fs-identity@PROJECT_ID.iam.gserviceaccount.com" \
         --role "roles/storage.objectAdmin"
    
  4. Untuk men-deploy dari sumber, hapus Dockerfile tambahan dan ganti nama Dockerfile tutorial:

    rm Dockerfile
    cp gcsfuse.Dockerfile Dockerfile
    
  5. Build dan deploy image container ke Cloud Run:

    gcloud run deploy filesystem-app --source . \
        --execution-environment gen2 \
        --allow-unauthenticated \
        --service-account fs-identity \
        --update-env-vars BUCKET=BUCKET_NAME
    

    Perintah ini membangun dan men-deploy layanan Cloud Run, serta menentukan lingkungan eksekusi generasi kedua Men-deploy dari sumber akan membangun image berdasarkan Dockerfile dan mengirim image ke repositori Artifact Registry: cloud-run-source-deploy.

    Pelajari lebih lanjut cara Men-deploy dari kode sumber.

Proses Debug

Jika deployment tidak berhasil, periksa Cloud logging untuk mengetahui detail lebih lanjut.

Jika Anda ingin semua log dari proses pemasangan, gunakan --foreground flag yang dikombinasikan dengan perintah pemasangan di skrip startup, gcsfuse_run.sh:

  gcsfuse --foreground --debug_gcs --debug_fuse GCSFUSE_BUCKET MNT_DIRECTORY &
  

  • Tambahkan --debug_http untuk output debug permintaan/respons HTTP.
  • Tambahkan --debug_fuse untuk mengaktifkan output proses debug terkait fuse.
  • Tambahkan --debug_gcs untuk mencetak informasi permintaan dan pengaturan waktu GCS.

Temukan tips lebih lanjut di Panduan pemecahan masalah.

Melakukan Percobaan

Untuk mencoba layanan lengkap:

  1. Buka browser Anda ke URL yang disediakan pada langkah deployment di atas.
  2. Anda akan melihat file yang baru dibuat di bucket Cloud Storage Anda.
  3. Klik pada file untuk melihat konten

Jika Anda memilih untuk terus mengembangkan layanan ini, perlu diingat bahwa layanan tersebut telah membatasi akses Identity and Access Management (IAM) ke bagian lain dari Google Cloud dan akan memerlukan untuk diberikan peran IAM tambahan guna mengakses banyak layanan lainnya.

Diskusi biaya

Harga Cloud Storage sangat bergantung pada penyimpanan data, jumlah data yang disimpan oleh kelas penyimpanan dan lokasi bucket Anda, serta penggunaan jaringan, jumlah data yang dibaca dari atau dipindahkan antar bucket Anda Pelajari lebih lanjut tentang Biaya yang dikenakan oleh Cloud Storage FUSE.

Harga Cloud Run dihitung berdasarkan penggunaan resource, yang dibulatkan ke 100 md terdekat, untuk memori, CPU, jumlah permintaan, dan jaringan. Sehingga biaya akan bervariasi berdasarkan setelan layanan, jumlah permintaan dan waktu eksekusi.

Misalnya, 1 TiB data yang disimpan dalam bucket standard storage dihosting di Iowa (us-central1) seharga $0.02 per bulan per GiB, yaitu sekitar 1024 GiB * $0.02 = $20.48. Perkiraan ini tergantung pada layanan Cloud Run dan bucket Cloud Storage yang dihosting di region yang sama untuk menegasikan biaya traffic keluar.

Kunjungi setiap halaman harga untuk mendapatkan harga yang terbaru atau jelajahi perkiraan di Kalkulator Harga Google Cloud.

Pembersihan

Jika Anda membuat project baru untuk tutorial ini, hapus project tersebut. Jika Anda menggunakan project yang ada dan ingin mempertahankannya tanpa ada perubahan yang ditambahkan dalam tutorial ini, hapus resource yang dibuat untuk tutorial.

Menghapus project

Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.

Untuk menghapus project:

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus resource tutorial

  1. Hapus layanan Cloud Run yang Anda deploy dalam tutorial ini:

    gcloud run services delete SERVICE-NAME

    Dengan SERVICE-NAME adalah nama layanan pilihan Anda.

    Anda juga dapat menghapus layanan Cloud Run dari Konsol Google Cloud.

  2. Hapus konfigurasi region default gcloud yang Anda tambahkan selama penyiapan tutorial:

     gcloud config unset run/region
    
  3. Hapus konfigurasi project:

     gcloud config unset project
    
  4. Menghapus resource Google Cloud lain yang dibuat dalam tutorial ini:

Langkah berikutnya