Membuat layanan Cloud Run dengan file bantuan

1. Ringkasan

Pengantar

Dalam codelab ini, Anda akan mempelajari cara men-deploy layanan Cloud Run yang menggunakan beberapa container. Anda akan membuat aplikasi node.js yang akan digunakan sebagai container masuk Cloud Run dan aplikasi node.js tambahan yang akan digunakan sebagai file bantuan.

Ringkasan teknis

Saat menggunakan beberapa container dalam instance Cloud Run, satu container digunakan sebagai container utama untuk traffic masuk web. Satu atau beberapa penampung tambahan disebut sebagai file bantuan.

Ada dua cara bagi beberapa container untuk berkomunikasi satu sama lain:

  1. Container membagikan antarmuka jaringan localhost, sehingga semua container dapat memproses port, misalnya localhost:port.
  2. Anda juga dapat menggunakan volume dalam memori dan memasangnya di container untuk berbagi file.

Kasus penggunaan

Karena semua container dalam instance Cloud Run berbagi antarmuka jaringan localhost, Anda dapat menggunakan file bantuan di depan container utama untuk permintaan proxy. Proxy tersebut dapat memberikan lapisan abstraksi tambahan untuk aliran traffic yang lebih efisien ke aplikasi antara klien dan server dengan mencegat permintaan dan meneruskannya ke endpoint yang sesuai. Sebagai contoh, Anda dapat menggunakan image Nginx resmi dari DockerHub (seperti yang ditunjukkan di sini).

Karena beberapa penampung dapat berkomunikasi dengan berbagi file melalui volume bersama, Anda menambahkan berbagai aplikasi bantuan ke layanan Anda. Misalnya, Anda dapat menginstrumentasikan layanan Cloud Run untuk menggunakan agen kustom seperti OpenTelemetry guna mengekspor log, metrik, dan trace (contoh OpenTelemetry). Contoh lainnya adalah menggunakan file bantuan yang terhubung ke database PostgreSQL Cloud Spanner (contoh Postgress Cloud Spanner).

Contoh dalam codelab ini

Dalam codelab ini, pertama-tama Anda akan men-deploy layanan Cloud Run tempat container masuknya berkomunikasi dengan file bantuan melalui port localhost. Kemudian, Anda akan memperbarui penampung masuk dan file bantuan untuk membagikan file melalui pemasangan volume.

Yang akan Anda pelajari

  • Cara membuat penampung yang menggunakan file bantuan
  • Cara container masuk dapat berkomunikasi dengan file bantuan menggunakan localhost
  • Cara container masuk dan file bantuan dapat berbagi file melalui volume yang terpasang

2. Penyiapan dan Persyaratan

Prasyarat

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Jika ini pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Lanjutkan.

d95252b003979716.png

Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.

7833d5e1c5d18f54.pngS

Mesin virtual ini dimuat dengan semua alat pengembangan yang diperlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan dengan browser.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda telah diautentikasi dan project sudah ditetapkan ke project ID Anda.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

3. Membuat aplikasi masuk

Menetapkan Variabel Lingkungan

Dalam codelab ini, Anda akan membuat beberapa variabel lingkungan untuk meningkatkan keterbacaan perintah gcloud yang digunakan dalam codelab ini.

REGION=<YOUR-REGION>
PROJECT_ID=<YOUR-PROJECT-ID>

SERVICE_NAME=sidecar-codelab
REPO_NAME=sidecar-codelab

Membuat repositori ArtifactRegistry untuk menyimpan image container

Anda dapat membuat repositori di Artifact Registry untuk menyimpan image container Anda untuk codelab ini.

gcloud artifacts repositories create $REPO_NAME --repository-format=docker \
--location=$REGION --description="sidecar codelab"

Lalu, buat file package.json dengan konten berikut:

{
  "name": "sidecar-codelab",
  "version": "1.0.0",
  "private": true,
  "description": "demonstrates how to use sidecars in cloud run",
  "main": "index.js",
  "author": "Google LLC",
  "license": "Apache-2.0",
  "scripts": {
    "start": "node ingress.js"
  },
  "dependencies": {
    "axios": "^1.6.2",
    "express": "^4.18.2"
  }
}

Sekarang, buat file bernama ingress.js dengan konten berikut:

const express = require('express');
const app = express();
const axios = require("axios");

app.get('/', async (req, res) => {

    let response = await axios.get("http://localhost:5000");

    res.send("The sidecar says: " + response.data);
});

const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
    console.log(`Ingress container listening on port ${port}`);
});

Membuat dockerfile untuk container masuk

FROM node:20.10.0-slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --production

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

# Run the web service on container startup.
ENV PORT=8080
CMD [ "npm", "start" ]

Dan buat file ``.dockerignore` untuk penampung masuk.

# Exclude locally installed dependencies
node_modules/

# Exclude "build-time" ignore files.
.dockerignore
.gcloudignore

# Exclude git history and configuration.
.gitignore

Sekarang, Anda dapat membangun image untuk container masuk dengan menjalankan perintah berikut:

gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest

4. Membuat aplikasi file bantuan

Di bagian ini, Anda akan membuat aplikasi node.js kedua yang akan digunakan sebagai file bantuan di layanan Cloud Run.

Buka direktori file bantuan.

cd ../sidecar

Buat file package.json dengan konten berikut:

{
  "name": "sidecar-codelab",
  "version": "1.0.0",
  "private": true,
  "description": "demonstrates how to use sidecars in cloud run",
  "main": "index.js",
  "author": "Google LLC",
  "license": "Apache-2.0",
  "scripts": {
    "start": "node sidecar.js"
  },
  "dependencies": {
    "axios": "^1.6.2",
    "express": "^4.18.2"
  }
}

Sekarang, buat file bernama sidecar.js dengan konten berikut:

const express = require('express');
const app = express();

app.get('/', async (req, res) => {
    res.send("Hello ingress container! I'm the sidecar.");
});

const port = parseInt(process.env.PORT || 5000);
app.listen(port, () => {
    console.log(`Sidecar container listening on port ${port}`);
});

Membuat Dockerfile untuk container file bantuan

FROM node:20.10.0-slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --production

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

# Run the web service on container startup.
ENV PORT=5000
CMD [ "npm", "start" ]

Kemudian, buat file ``.dockerignore` untuk penampung file bantuan.

# Exclude locally installed dependencies
node_modules/

# Exclude "build-time" ignore files.
.dockerignore
.gcloudignore

# Exclude git history and configuration.
.gitignore

Sekarang, Anda dapat membangun image untuk container masuk dengan menjalankan perintah berikut:

gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest

Men-deploy layanan Cloud Run

Anda akan men-deploy layanan Cloud Run menggunakan file yaml.

Buka direktori induk.

cd ..

Buat file bernama sidecar-codelab.yaml dengan konten berikut:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  annotations:
  name: sidecar-codelab
  labels:
    cloud.googleapis.com/location: "<YOUR_REGION>"
spec:
  template:
    spec:
      containers:
        - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/ingress:latest"
          ports:
            - containerPort: 8080
        - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/sidecar:latest"
          env:
            - name: PORT
              value: "5000"

Kemudian, deploy layanan menggunakan perintah berikut. Anda perlu menggunakan gcloud beta karena pemasangan volume sedang dalam pratinjau publik.

gcloud beta run services replace sidecar-codelab.yaml

Setelah di-deploy, simpan URL layanan di variabel lingkungan.

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --platform managed --region $REGION --format 'value(status.url)') 

5. Memanggil layanan Cloud Run

Sekarang Anda dapat memanggil layanan dengan memberikan token identitas.

curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}

Hasilnya akan terlihat seperti contoh output di bawah ini:

The sidecar says: Hello ingress container! I'm the sidecar.

6. Membagikan file melalui pemasangan volume

Di bagian ini, Anda akan memperbarui container untuk membagikan file melalui pemasangan volume. Dalam contoh ini, penampung masuk akan menulis ke file pada volume bersama. File bantuan akan membaca file tersebut dan mengembalikan isinya ke container masuk.

Pertama, Anda akan memperbarui kode container masuk. Buka direktori masuk.

cd ../ingress

lalu ganti konten file ingress.js dengan kode berikut:

const express = require('express');
const app = express();
const fs = require('fs');
const axios = require("axios");

const filename = "test.txt"

let path = "/my-volume-mount";
app.use(path, express.static(path));

try {
    fs.writeFileSync(`${path}/${filename}`, "The ingress container created this file.");
} catch (err) {
    console.error(err);
}

app.get('/', async (req, res) => {

    let response = await axios.get("http://localhost:5000");

    res.send("The sidecar says: " + response.data);
});

const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
    console.log(`Ingress container listening on port ${port}`);
});

Dan bangun image baru untuk container masuk Anda dengan menjalankan perintah berikut:

gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest

Sekarang buka direktori file bantuan:

cd ../sidecar

Kemudian, update sidecar.js dengan konten berikut:

const express = require('express');
const app = express();
const fs = require('fs');

const filename = "test.txt"

let path = "/my-volume-mount";
app.use(path, express.static(path));

async function readFile() {
    try {
        return await fs.readFileSync(`${path}/${filename}`, { encoding: 'utf8' });
    } catch (err) {
        console.log(err);
    }
}

app.get('/', async (req, res) => {
    let contents = await readFile();
    res.send(contents);
});

const port = parseInt(process.env.PORT || 5000);
app.listen(port, () => {
    console.log(`Sidecar container listening on port ${port}`);
});

Dan, bangun image baru untuk container file bantuan dengan menjalankan perintah berikut:

gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest

Update sidecar-codelab.yaml dengan kode berikut untuk berbagi volume:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  annotations:
  name: sidecar-codelab
  labels:
    cloud.googleapis.com/location: "<YOUR_REGION>"
spec:
  template:
    spec:
      containers:
        - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/ingress:latest"
          ports:
            - containerPort: 8080
          volumeMounts:
            - mountPath: /my-volume-mount
              name: in-memory-1
        - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/sidecar:latest"
          env:
            - name: PORT
              value: "5000"
          volumeMounts:
            - mountPath: /my-volume-mount
              name: in-memory-1
      volumes:
        - emptyDir:
            medium: Memory
          name: in-memory-1

Men-deploy file sidecar-codelab.yaml yang diupdate

gcloud beta run services replace sidecar-codelab.yaml

Sekarang Anda dapat memanggil layanan dengan memberikan token identitas.

curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}

Hasilnya akan terlihat seperti contoh output di bawah ini:

The sidecar says: the ingress container created this file.

7. Selamat!

Selamat, Anda telah menyelesaikan codelab!

Sebaiknya tinjau dokumentasi tentang Cloud Run, khususnya men-deploy multicontainer dan menggunakan pasangan volume dalam memori.

Yang telah kita bahas

  • Cara membuat penampung yang menggunakan file bantuan
  • Cara container masuk dapat berkomunikasi dengan file bantuan menggunakan localhost
  • Bagaimana container masuk dan file bantuan dapat berbagi volume yang terpasang

8. Pembersihan

Untuk menghindari tagihan yang tidak disengaja, (misalnya, jika Cloud Function ini secara tidak sengaja dipanggil lebih sering daripada alokasi panggilan Cloud Run bulanan Anda di paket gratis), Anda dapat menghapus layanan Cloud Run atau menghapus project yang Anda buat di Langkah 2.

Untuk menghapus Cloud Function, buka Konsol Cloud Cloud Function di https://console.cloud.google.com/run/ dan hapus layanan sidecar-codelab (atau $SERVICE_NAME jika Anda menggunakan nama yang berbeda).

Jika memilih untuk menghapus seluruh project, Anda dapat membuka https://console.cloud.google.com/cloud-resource-manager, pilih project yang dibuat pada Langkah 2, lalu pilih Hapus. Jika project dihapus, Anda harus mengubah project di Cloud SDK. Anda dapat melihat daftar semua project yang tersedia dengan menjalankan gcloud projects list.