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

1. ภาพรวม

บทนำ

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

ภาพรวมทางเทคนิค

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

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

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

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

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

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

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

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

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

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

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

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

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

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

cb81e7c8e34bc8d.png

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

d95252b003979716.png

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

7833d5e1c5d18f54.png

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

เมื่อเชื่อมต่อกับ 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 นี้ คุณจะสร้างตัวแปรสภาพแวดล้อม 2-3 ตัวเพื่อปรับปรุงความสามารถในการอ่านคำสั่ง gcloud ที่ใช้ใน Codelab นี้

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

SERVICE_NAME=sidecar-codelab
REPO_NAME=sidecar-codelab

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

คุณสร้างที่เก็บใน 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

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

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

4. สร้างแอป Sidecar

ในส่วนนี้ คุณจะได้สร้างแอป Node.js ที่ 2 ซึ่งจะใช้เป็น Sidecar ในบริการ Cloud Run

ไปที่ไดเรกทอรี Sidecar

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 สำหรับคอนเทนเนอร์ Sidecar

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` สำหรับคอนเทนเนอร์ Sidecar

# Exclude locally installed dependencies
node_modules/

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

# Exclude git history and configuration.
.gitignore

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

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. แชร์ไฟล์ผ่านการติดตั้งโวลุ่ม

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

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

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

ตอนนี้ให้ไปที่ไดเรกทอรี Sidecar

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

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

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 โดยเฉพาะการติดตั้งใช้งานแบบหลายคอนเทนเนอร์และการใช้การติดตั้งโวลุ่มในหน่วยความจำ

สิ่งที่เราได้พูดถึง

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

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

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

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

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