Tutorial menggunakan Filestore dengan Cloud Run


Tutorial ini menunjukkan cara memasang Filestore sebagai sistem file jaringan, ke layanan Cloud Run untuk berbagi data di antara beberapa container dan layanan. Tutorial ini menggunakan lingkungan eksekusi generasi kedua Cloud Run.

Lingkungan eksekusi generasi kedua memungkinkan sistem file jaringan untuk dipasang ke direktori dalam 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

Instance Filestore dihosting dalam jaringan Virtual Private Cloud (VPC). Resource dalam jaringan VPC menggunakan rentang alamat IP pribadi untuk dapat berkomunikasi dengan Google API dan layanan Google; oleh karena itu, klien harus berada di jaringan yang sama dengan instance Filestore untuk mengakses file yang tersimpan pada instance tersebut. Konektor Akses VPC Serverless diperlukan agar layanan Cloud Run terhubung ke jaringan VPC untuk berkomunikasi dengan Filestore. Pelajari lebih lanjut tentang Akses VPC Serverless.

arsitektur-sistem file

Diagram ini menunjukkan layanan Cloud Run yang terhubung ke instance Filestore melalui konektor Akses VPC Serverless. Instance dan konektor Filestore berada dalam jaringan VPC yang sama, "default", dan di region/zona yang sama dengan layanan Cloud Run untuk performa terbaik.

Batasan

  • Tutorial ini tidak menjelaskan cara memilih sistem file atau persyaratan siap produksi. Pelajari tentang Filestore dan paket layanan yang tersedia lebih lanjut.

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

Tujuan

  • Buat instance Filestore pada jaringan VPC default untuk berfungsi sebagai fitur berbagi file.

  • Buat konektor Akses VPC Serverless pada jaringan VPC default yang sama untuk terhubung ke layanan Cloud Run.

  • Bangun Dockerfile dengan paket sistem dan proses init untuk mengelola proses pemasangan dan 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. Izin IAM hanya mengontrol akses ke operasi Filestore, seperti membuat instance Filestore. Untuk mengontrol akses ke operasi pada fitur berbagi file, seperti membaca atau mengeksekusi, gunakan izin file POSIX. Pelajari tentang Kontrol akses lebih lanjut.
  7. Enable the Cloud Run, Filestore, Serverless VPC Access, Artifact Registry, and Cloud Build APIs.

    Enable the APIs

  8. Instal dan lakukan inisialisasi gcloud CLI.
  9. Perbarui Google Cloud CLI: gcloud components update

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan tutorial, minta administrator untuk memberikan Anda peran IAM berikut pada 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.

  3. Konfigurasi gcloud untuk Filestore:

    gcloud config set filestore/zone ZONE
    

    Ganti ZONE dengan zona Filestore yang pilihan Anda yang didukung.

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 sampel sebagai file ZIP dan mengekstraknya.

    Python

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

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

    Java

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

    Atau, Anda dapat mendownload sampel 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 secara default. Petunjuk RUN akan menginstal tini sebagai proses-init kami dan nfs-common, yang menyediakan fungsionalitas klien NFS minimal. Baca lebih lanjut tentang cara bekerja dengan paket sistem di layanan Cloud Run Anda dalam Tutorial menggunakan paket sistem.

Rangkaian petunjuk berikutnya buat direktori kerja, salin kode sumber, dan instal 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 -y && apt-get install -y \
    tini \
    nfs-common \
	libtool \
    && apt-get clean

# Set fallback mount directory
ENV MNT_DIR /mnt/nfs/filestore

# 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/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/run.sh"]

Python

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

# Install system dependencies
RUN apt-get update -y && apt-get install -y \
    tini \
    nfs-common \
    && apt-get clean

# Set fallback mount directory
ENV MNT_DIR /mnt/nfs/filestore

# 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/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/run.sh"]

Java


# Use the official maven 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 filesystem dependencies
RUN apt-get update -y && apt-get install -y \
    tini \
    nfs-kernel-server \
    nfs-common \
    && apt-get clean

# Set fallback mount directory
ENV MNT_DIR /mnt/nfs/filestore

# 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 run.sh ./run.sh
RUN chmod +x ./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 ["/run.sh"]

Menentukan proses Anda dalam skrip startup

Skrip startup membuat direktori menjadi titik pemasangan, di tempat instance Filestore akan dibuat agar dapat diakses. Selanjutnya, skrip menggunakan perintah mount untuk melampirkan instance Filestore, dengan menentukan alamat IP instance dan nama fitur berbagi file, ke titik pemasangan layanan, kemudian memulai server aplikasi. Perintah mount memiliki fungsionalitas percobaan ulang bawaan; oleh karena itu, 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 Cloud Filestore."
mount -o nolock $FILESTORE_IP_ADDRESS:/$FILE_SHARE_NAME $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 Cloud Filestore."
mount -o nolock $FILESTORE_IP_ADDRESS:/$FILE_SHARE_NAME $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 Cloud Filestore."
mount -o nolock $FILESTORE_IP_ADDRESS:/$FILE_SHARE_NAME $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 instance Filestore:

    gcloud filestore instances create INSTANCE_ID \
        --tier=basic-hdd \
        --file-share=name=FILE_SHARE_NAME,capacity=1TiB \
        --network=name="default"
    

    Ganti INSTANCE_ID dengan nama instance Filestore, yaitu my-filestore-instance, dan FILE_SHARE_NAME dengan nama direktori yang ditampilkan dari instance Filestore, yaitu vol1. Lihat Memberi nama instance Anda dan Memberi nama file yang dibagikan.

    Klien (layanan Cloud Run) harus berada di jaringan yang sama dengan instance Filestore untuk mengakses file yang tersimpan pada instance tersebut. Perintah ini membuat instance berada di jaringan VPC default dan menetapkan rentang alamat IP gratis. Project baru dimulai dengan jaringan default dan kemungkinan besar tidak perlu untuk membuat jaringan terpisah.

    Pelajari lebih lanjut tentang konfigurasi instance di bagian Membuat instance.

  2. Siapkan konektor Akses VPC Serverless:

    Untuk terhubung ke instance Filestore Anda, layanan Cloud Run Anda memerlukan akses ke jaringan VPC resmi instance Filestore.

    Setiap konektor VPC memerlukan subnet /28 tersendiri untuk menempatkan instance konektor. Rentang IP ini tidak boleh tumpang tindih dengan reservasi alamat IP apa pun yang sudah ada di jaringan VPC Anda. Misalnya, 10.8.0.0 (/28) akan berfungsi di sebagian besar project baru atau Anda dapat" menentukan rentang IP khusus lainnya yang tidak digunakan, seperti 10.9.0.0 (/28). Anda dapat melihat rentang IP manakah yang saat ini dicadangkan di Konsol Google Cloud.

    gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
      --region REGION \
      --range "10.8.0.0/28"
    

    Ganti CONNECTOR_NAME dengan nama untuk konektor Anda.

    Perintah ini membuat konektor di jaringan VPC default, sama seperti instance Filestore, dengan ukuran mesin e2-micro. Meningkatkan ukuran mesin konektor dapat meningkatkan throughput konektor, tetapi juga akan meningkatkan biaya. Konektor juga harus berada di region yang sama dengan layanan Cloud Run. Pelajari lebih lanjut tentang cara Mengonfigurasi Akses VPC Serverless.

  3. Tentukan variabel lingkungan dengan alamat IP untuk instance Filestore:

    export FILESTORE_IP_ADDRESS=$(gcloud filestore instances describe INSTANCE_ID --format "value(networks.ipAddresses[0])")
    
  4. Buat akun layanan untuk dijadikan sebagai identitas layanan. Secara default, opsi ini tidak memiliki hak istimewa selain keanggotaan project.

    gcloud iam service-accounts create fs-identity

    Layanan ini tidak perlu berinteraksi dengan apa pun di Google Cloud; oleh karena itu tidak ada izin tambahan yang perlu ditetapkan ke akun layanan ini.

  5. Bangun dan deploy image container ke Cloud Run:

    gcloud run deploy filesystem-app --source . \
        --vpc-connector CONNECTOR_NAME \
        --execution-environment gen2 \
        --allow-unauthenticated \
        --service-account fs-identity \
        --update-env-vars FILESTORE_IP_ADDRESS=$FILESTORE_IP_ADDRESS,FILE_SHARE_NAME=FILE_SHARE_NAME
    

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

    Pelajari lebih lanjut tentang cara Men-deploy dari kode sumber.

Proses Debug

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

  • Jika waktu tunggu koneksi habis, pastikan Anda memberikan alamat IP instance Filestore yang benar.

  • Jika akses ditolak oleh server, periksa untuk memastikan nama file yang dibagikan sudah benar.

  • Jika Anda menginginkan semua log dari proses pemasangan gunakan tanda --verbose bersama dengan perintah pemasangan: mount --verbose -o nolock $FILESTORE_IP_ADDRESS:/$FILE_SHARE_NAME $MNT_DIR

Melakukan Percobaan

Untuk mencoba layanan lengkap:

  1. Buka browser Anda ke URL yang diberikan pada langkah deployment di atas.
  2. Anda akan melihat file yang baru dibuat di instance Filestore Anda.
  3. Klik pada file untuk melihat isinya.

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

Contoh perincian biaya untuk layanan, yang dihosting di Iowa (us-central1) dengan 1 instance TiB Filestore dan konektor Akses VPC Serverless. Kunjungi setiap halaman harga untuk mendapatkan harga terbaru.

Produk Biaya per bulan
Filestore (Tidak bergantung pada jumlah yang digunakan) Biaya = Kapasitas yang disediakan (1024 GiB atau 1 TiB) * Harga Tingkat Regional (us-central1)

Tingkat HDD Dasar: 1024GiB * $0,16/bln = $163,84
Zonal (SSD): 1024GiB * $0,25/bln = $0,4 GiB = $256,00
Akses VPC Serverless Biaya = Harga ukuran mesin * jumlah instance (default instance min 2)

f1-micro: $3,88 * 2 instance = $7,76
e2- mikro: $6,11 * 2 instance = $12,22
e2-standard-4: $97,83 * 2 instance = $195,66
Cloud Run Biaya = CPU + Memori + Permintaan + Jaringan
Total $163,84 + $12,22 = $176,06/bln + biaya Cloud Run

Tutorial ini menggunakan instance Filestore tingkat HDD dasar. Tingkat layanan instance Filestore adalah kombinasi dari jenis instance dan jenis penyimpanannya. Jenis instance dapat diupgrade untuk mendapatkan kapasitas dan skalabilitas yang lebih besar. Jenis penyimpanan dapat diupgrade untuk meningkatkan performa. Pelajari lebih lanjut tentang rekomendasi jenis penyimpanan. Region dan kapasitas juga memengaruhi harga Filestore. Misalnya, instance TiB Tingkat 1 HDD Dasar di Iowa (us-central1) dikenai biaya $0,16 per GiB per bulan, yaitu sekitar $163,84 per bulan.

Konektor Akses VPC Serverless dihargai berdasarkan ukuran dan jumlah instance serta traffic keluar jaringan. Meningkatkan ukuran dan jumlah dapat meningkatkan throughput atau mengurangi latensi dalam pesan. Ada 3 ukuran mesin, f1-micro, e2-micro, dan e2-standard-4. Jumlah minimum instance adalah 2, sehingga biaya minimumnya adalah dua kali lipat biaya ukuran mesin tersebut.

Cloud Run dihargai berdasarkan penggunaan resource, yang dibulatkan ke 100 md terdekat, untuk memori, CPU, jumlah permintaan, dan jaringan. Oleh karena itu, biayanya akan bervariasi berdasarkan setelan layanan, jumlah permintaan dan waktu eksekusi. Layanan ini akan dikenakan biaya minimum sebesar $176,06 per bulan. Lihat dan jelajahi estimasi 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. Hapus resource Google Cloud lain yang dibuat dalam tutorial ini:

Langkah selanjutnya