สร้างบริการ Cloud Run พร้อมไฟล์ช่วยเหลือ

1. ภาพรวม

บทนำ

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีทำให้บริการ Cloud Run ใช้งานได้ที่ใช้หลายคอนเทนเนอร์ คุณจะต้องสร้างแอป Node.js ที่จะใช้เป็นคอนเทนเนอร์ขาเข้าของ Cloud Run และแอป Node.js เพิ่มเติมที่จะใช้เป็นไฟล์ช่วยเหลือ

ภาพรวมด้านเทคนิค

เมื่อใช้หลายคอนเทนเนอร์ภายในอินสแตนซ์ Cloud Run ระบบจะใช้ 1 คอนเทนเนอร์เป็นคอนเทนเนอร์หลักสำหรับขาเข้าของเว็บ คอนเทนเนอร์เพิ่มเติมอย่างน้อย 1 รายการเรียกว่าไฟล์ช่วยเหลือ

คอนเทนเนอร์หลายรายการสื่อสารระหว่างกันได้ 2 วิธี ดังนี้

  1. คอนเทนเนอร์จะแชร์อินเทอร์เฟซเครือข่าย localhost ดังนั้นคอนเทนเนอร์ทั้งหมดจึงรับพอร์ตได้ เช่น localhost:port.
  2. นอกจากนี้ คุณยังใช้วอลุ่มในหน่วยความจำและต่อเชื่อมกับคอนเทนเนอร์เพื่อแชร์ไฟล์ได้ด้วย

กรณีการใช้งาน

เนื่องจากคอนเทนเนอร์ทั้งหมดภายในอินสแตนซ์ Cloud Run จะใช้อินเทอร์เฟซเครือข่าย localhost คุณจึงใช้ไฟล์ช่วยเหลือที่อยู่หน้าคอนเทนเนอร์หลักเพื่อขอพร็อกซีได้ พร็อกซีดังกล่าวสามารถให้กระบวนการแอบสแตรกต์อีกชั้นหนึ่งเพื่อการรับส่งข้อมูลที่มีประสิทธิภาพยิ่งขึ้นในการรับส่งข้อมูลไปยังแอปพลิเคชันระหว่างไคลเอ็นต์และเซิร์ฟเวอร์โดยการสกัดกั้นคำขอและส่งต่อไปยังปลายทางที่เหมาะสม ตัวอย่างเช่น คุณสามารถใช้อิมเมจ Nginx อย่างเป็นทางการจาก DockerHub (ดังที่แสดงที่นี่)

เนื่องจากคอนเทนเนอร์หลายรายการสามารถสื่อสารกันด้วยการแชร์ไฟล์ผ่านวอลุ่มที่แชร์ คุณจึงเพิ่มแอปพลิเคชันไฟล์ช่วยเหลือต่างๆ ลงในบริการได้ เช่น คุณสามารถใช้บริการ Cloud Run เพื่อใช้ Agent ที่กำหนดเอง เช่น OpenTelemetry เพื่อส่งออกบันทึก เมตริก และการติดตาม (ตัวอย่าง OpenTelemetry) อีกตัวอย่างหนึ่งคือการใช้ไฟล์ช่วยเหลือที่เชื่อมต่อกับฐานข้อมูล Cloud Spanner PostgreSQL (ตัวอย่าง Cloud Spanner Postgress)

ตัวอย่างใน Codelab นี้

ใน Codelab นี้ คุณจะต้องทำให้บริการ Cloud Run ใช้งานได้ก่อน โดยคอนเทนเนอร์ขาเข้าสื่อสารกับไฟล์ช่วยเหลือผ่านพอร์ต localhost จากนั้นจึงอัปเดตคอนเทนเนอร์ขาเข้าและไฟล์ช่วยเหลือเพื่อแชร์ไฟล์ผ่านตัวยึดวอลุ่ม

สิ่งที่คุณจะได้เรียนรู้

  • วิธีสร้างคอนเทนเนอร์ที่ใช้ไฟล์ช่วยเหลือ
  • วิธีที่คอนเทนเนอร์ขาเข้าสื่อสารกับไฟล์ช่วยเหลือโดยใช้ localhost
  • วิธีที่ทั้งคอนเทนเนอร์ขาเข้าและไฟล์ช่วยเหลือสามารถแชร์ไฟล์ผ่านวอลุ่มที่ต่อเชื่อม

2. การตั้งค่าและข้อกำหนด

ข้อกำหนดเบื้องต้น

เปิดใช้งาน Cloud Shell

  1. คลิกเปิดใช้งาน Cloud Shell d1264ca30785e435.png จาก Cloud Console

cb81e7c8e34bc8d.png

หากเริ่มต้นใช้งาน Cloud Shell เป็นครั้งแรก คุณจะเห็นหน้าจอตรงกลางที่อธิบายว่านี่คืออะไร หากระบบแสดงหน้าจอตรงกลาง ให้คลิกต่อไป

d95252b003979716.png

การจัดสรรและเชื่อมต่อกับ Cloud Shell ใช้เวลาเพียงไม่กี่นาที

7833d5e1c5d18f54.png

เครื่องเสมือนนี้โหลดด้วยเครื่องมือการพัฒนาทั้งหมดที่จำเป็น โดยมีไดเรกทอรีหลักขนาด 5 GB ถาวรและทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานส่วนใหญ่ใน Codelab นี้สามารถทำได้โดยใช้เบราว์เซอร์

เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นข้อความตรวจสอบสิทธิ์และโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์แล้ว

  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว
gcloud auth list

เอาต์พุตจากคำสั่ง

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้เกี่ยวกับโปรเจ็กต์ของคุณ
gcloud config list project

เอาต์พุตจากคำสั่ง

[core]
project = <PROJECT_ID>

หากไม่ใช่ ให้ตั้งคำสั่งด้วยคำสั่งนี้

gcloud config set project <PROJECT_ID>

เอาต์พุตจากคำสั่ง

Updated property [core/project].

3. สร้างแอปขาเข้า

ตั้งค่าตัวแปรสภาพแวดล้อม

ใน Codelab นี้ คุณจะสร้างตัวแปรสภาพแวดล้อมบางรายการเพื่อปรับปรุงให้คำสั่ง gcloud ที่ใช้ใน Codelab นี้อ่านได้ง่ายขึ้น

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

SERVICE_NAME=sidecar-codelab
REPO_NAME=sidecar-codelab

สร้างที่เก็บ ArtifactRegistry เพื่อเก็บอิมเมจคอนเทนเนอร์

คุณสร้างที่เก็บใน Artifact Registry เพื่อจัดเก็บอิมเมจคอนเทนเนอร์สำหรับ Codelab นี้ได้

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

จากนั้นสร้างไฟล์ package.json ที่มีเนื้อหาต่อไปนี้

{
  "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"
  }
}

จากนั้นสร้างไฟล์ชื่อ ingress.js ด้วยเนื้อหาต่อไปนี้

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}`);
});

สร้าง Dockerfile สำหรับคอนเทนเนอร์ขาเข้า

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" ]

และสร้างไฟล์ ``.dockerignore` สําหรับคอนเทนเนอร์ขาเข้า

# Exclude locally installed dependencies
node_modules/

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

# Exclude git history and configuration.
.gitignore

ตอนนี้คุณสร้างอิมเมจสำหรับคอนเทนเนอร์ขาเข้าได้โดยเรียกใช้คำสั่งต่อไปนี้

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

4. สร้างแอปไฟล์ช่วยเหลือ

ในส่วนนี้ คุณจะได้สร้างแอป Node.js ที่ 2 ที่จะใช้เป็นไฟล์ช่วยเหลือในบริการ Cloud Run

ไปที่ไดเรกทอรีไฟล์ช่วยเหลือ

cd ../sidecar

สร้างไฟล์ package.json ที่มีเนื้อหาต่อไปนี้

{
  "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"
  }
}

จากนั้นสร้างไฟล์ชื่อ sidecar.js ด้วยเนื้อหาต่อไปนี้

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}`);
});

สร้าง Dockerfile สำหรับคอนเทนเนอร์ไฟล์ช่วยเหลือ

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" ]

และสร้างไฟล์ ``.dockerignore` สำหรับคอนเทนเนอร์ไฟล์ช่วยเหลือ

# Exclude locally installed dependencies
node_modules/

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

# Exclude git history and configuration.
.gitignore

ตอนนี้คุณสร้างอิมเมจสำหรับคอนเทนเนอร์ขาเข้าได้โดยเรียกใช้คำสั่งต่อไปนี้

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

ทำให้บริการ Cloud Run ใช้งานได้

คุณจะทำให้บริการ Cloud Run ใช้งานได้โดยใช้ไฟล์ yaml

ไปที่ไดเรกทอรีระดับบนสุด

cd ..

สร้างไฟล์ชื่อ sidecar-codelab.yaml ที่มีเนื้อหาต่อไปนี้

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"

จากนั้นจึงทำให้บริการใช้งานได้โดยใช้คำสั่งต่อไปนี้ คุณต้องใช้ gcloud เบต้าเนื่องจากการต่อเชื่อมวอลุ่มอยู่ในตัวอย่างแบบสาธารณะ

gcloud beta run services replace sidecar-codelab.yaml

เมื่อทำให้ใช้งานได้แล้ว ให้บันทึก URL ของบริการในตัวแปรสภาพแวดล้อม

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

5. เรียกใช้บริการ Cloud Run

ตอนนี้คุณสามารถเรียกใช้บริการของคุณได้โดยระบุโทเค็นประจำตัวของคุณ

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

ผลลัพธ์ควรมีลักษณะคล้ายกับตัวอย่างเอาต์พุตด้านล่าง

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

6. แชร์ไฟล์ผ่านการต่อเชื่อมวอลุ่ม

ในส่วนนี้ คุณจะได้อัปเดตคอนเทนเนอร์เพื่อแชร์ไฟล์ผ่านการต่อเชื่อมวอลุ่ม ในตัวอย่างนี้ คอนเทนเนอร์ขาเข้าจะเขียนไปยังไฟล์ในวอลุ่มที่แชร์ ไฟล์ช่วยเหลือจะอ่านไฟล์และส่งคืนเนื้อหากลับไปยังคอนเทนเนอร์ขาเข้า

ก่อนอื่น คุณจะต้องอัปเดตโค้ดคอนเทนเนอร์ขาเข้า ไปที่ไดเรกทอรีขาเข้า

cd ../ingress

แล้วแทนที่เนื้อหาของไฟล์ ingress.js ด้วยข้อมูลต่อไปนี้

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}`);
});

และสร้างอิมเมจใหม่สำหรับคอนเทนเนอร์ขาเข้าโดยเรียกใช้คำสั่งต่อไปนี้

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

ไปที่ไดเรกทอรีไฟล์ช่วยเหลือโดยทำดังนี้

cd ../sidecar

และอัปเดต sidecar.js ด้วยเนื้อหาต่อไปนี้

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}`);
});

และสร้างอิมเมจใหม่สำหรับคอนเทนเนอร์ไฟล์ช่วยเหลือโดยเรียกใช้คำสั่งต่อไปนี้

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

อัปเดต sidecar-codelab.yaml ด้วยข้อมูลต่อไปนี้เพื่อแชร์วอลุ่ม

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

ทำให้ไฟล์ sidecar-codelab.yaml ที่อัปเดตแล้วใช้งานได้

gcloud beta run services replace sidecar-codelab.yaml

ตอนนี้คุณสามารถเรียกใช้บริการของคุณได้โดยระบุโทเค็นประจำตัวของคุณ

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

ผลลัพธ์ควรมีลักษณะคล้ายกับตัวอย่างเอาต์พุตด้านล่าง

The sidecar says: the ingress container created this file.

7. ยินดีด้วย

ขอแสดงความยินดีที่เรียน Codelab จนจบ

เราขอแนะนำให้อ่านเอกสารเกี่ยวกับ Cloud Run โดยเฉพาะอย่างยิ่งการทำให้คอนเทนเนอร์หลายคอนเทนเนอร์ใช้งานได้และการใช้การต่อเชื่อมวอลุ่มในหน่วยความจำ

หัวข้อที่ครอบคลุม

  • วิธีสร้างคอนเทนเนอร์ที่ใช้ไฟล์ช่วยเหลือ
  • วิธีที่คอนเทนเนอร์ขาเข้าสื่อสารกับไฟล์ช่วยเหลือโดยใช้ localhost
  • วิธีที่ทั้งคอนเทนเนอร์ขาเข้าและแถบด้านข้างแชร์วอลุ่มที่ต่อเชื่อมอยู่

8. ล้างข้อมูล

เพื่อหลีกเลี่ยงการเรียกเก็บเงินที่ไม่ตั้งใจ (เช่น หากมีการเรียกใช้ Cloud Function โดยไม่ได้ตั้งใจมากกว่าการจัดสรรการเรียกใช้ Cloud Run รายเดือนในรุ่นฟรี) คุณจะลบบริการ Cloud Run หรือลบโปรเจ็กต์ที่คุณสร้างในขั้นตอนที่ 2 ก็ได้

หากต้องการลบ Cloud Function ให้ไปที่ Cloud Function ใน Cloud Console ที่ https://console.cloud.google.com/run/ แล้วลบบริการ sidecar-codelab (หรือ $SERVICE_NAME ในกรณีที่คุณใช้ชื่ออื่น)

หากเลือกลบทั้งโปรเจ็กต์ ให้ไปที่ https://console.cloud.google.com/cloud-resource-manager เลือกโปรเจ็กต์ที่คุณสร้างในขั้นตอนที่ 2 แล้วเลือกลบ หากลบโปรเจ็กต์ คุณจะต้องเปลี่ยนโปรเจ็กต์ใน Cloud SDK คุณสามารถดูรายการโปรเจ็กต์ที่ใช้ได้ทั้งหมดโดยเรียกใช้ gcloud projects list