1. ภาพรวม
บทนำ
ใน Codelab นี้ คุณจะได้เรียนรู้วิธีทำให้บริการ Cloud Run ใช้งานได้ที่ใช้หลายคอนเทนเนอร์ คุณจะต้องสร้างแอป Node.js ที่จะใช้เป็นคอนเทนเนอร์ขาเข้าของ Cloud Run และแอป Node.js เพิ่มเติมที่จะใช้เป็นไฟล์ช่วยเหลือ
ภาพรวมด้านเทคนิค
เมื่อใช้หลายคอนเทนเนอร์ภายในอินสแตนซ์ Cloud Run ระบบจะใช้ 1 คอนเทนเนอร์เป็นคอนเทนเนอร์หลักสำหรับขาเข้าของเว็บ คอนเทนเนอร์เพิ่มเติมอย่างน้อย 1 รายการเรียกว่าไฟล์ช่วยเหลือ
คอนเทนเนอร์หลายรายการสื่อสารระหว่างกันได้ 2 วิธี ดังนี้
- คอนเทนเนอร์จะแชร์อินเทอร์เฟซเครือข่าย localhost ดังนั้นคอนเทนเนอร์ทั้งหมดจึงรับพอร์ตได้ เช่น localhost:port.
- นอกจากนี้ คุณยังใช้วอลุ่มในหน่วยความจำและต่อเชื่อมกับคอนเทนเนอร์เพื่อแชร์ไฟล์ได้ด้วย
กรณีการใช้งาน
เนื่องจากคอนเทนเนอร์ทั้งหมดภายในอินสแตนซ์ Cloud Run จะใช้อินเทอร์เฟซเครือข่าย localhost คุณจึงใช้ไฟล์ช่วยเหลือที่อยู่หน้าคอนเทนเนอร์หลักเพื่อขอพร็อกซีได้ พร็อกซีดังกล่าวสามารถให้กระบวนการแอบสแตรกต์อีกชั้นหนึ่งเพื่อการรับส่งข้อมูลที่มีประสิทธิภาพยิ่งขึ้นในการรับส่งข้อมูลไปยังแอปพลิเคชันระหว่างไคลเอ็นต์และเซิร์ฟเวอร์โดยการสกัดกั้นคำขอและส่งต่อไปยังปลายทางที่เหมาะสม ตัวอย่างเช่น คุณสามารถใช้อิมเมจ Nginx อย่างเป็นทางการจาก DockerHub (ดังที่แสดงที่นี่)
เนื่องจากคอนเทนเนอร์หลายรายการสามารถสื่อสารกันด้วยการแชร์ไฟล์ผ่านวอลุ่มที่แชร์ คุณจึงเพิ่มแอปพลิเคชันไฟล์ช่วยเหลือต่างๆ ลงในบริการได้ เช่น คุณสามารถใช้บริการ Cloud Run เพื่อใช้ Agent ที่กำหนดเอง เช่น OpenTelemetry เพื่อส่งออกบันทึก เมตริก และการติดตาม (ตัวอย่าง OpenTelemetry) อีกตัวอย่างหนึ่งคือการใช้ไฟล์ช่วยเหลือที่เชื่อมต่อกับฐานข้อมูล Cloud Spanner PostgreSQL (ตัวอย่าง Cloud Spanner Postgress)
ตัวอย่างใน Codelab นี้
ใน Codelab นี้ คุณจะต้องทำให้บริการ Cloud Run ใช้งานได้ก่อน โดยคอนเทนเนอร์ขาเข้าสื่อสารกับไฟล์ช่วยเหลือผ่านพอร์ต localhost จากนั้นจึงอัปเดตคอนเทนเนอร์ขาเข้าและไฟล์ช่วยเหลือเพื่อแชร์ไฟล์ผ่านตัวยึดวอลุ่ม
สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้างคอนเทนเนอร์ที่ใช้ไฟล์ช่วยเหลือ
- วิธีที่คอนเทนเนอร์ขาเข้าสื่อสารกับไฟล์ช่วยเหลือโดยใช้ localhost
- วิธีที่ทั้งคอนเทนเนอร์ขาเข้าและไฟล์ช่วยเหลือสามารถแชร์ไฟล์ผ่านวอลุ่มที่ต่อเชื่อม
2. การตั้งค่าและข้อกำหนด
ข้อกำหนดเบื้องต้น
- คุณเข้าสู่ระบบ Cloud Console แล้ว
- คุณได้ทำให้บริการ Cloud Run ใช้งานได้ก่อนหน้านี้ ตัวอย่างเช่น คุณทำตามวิธีทำให้บริการเว็บใช้งานได้จากการเริ่มต้นอย่างรวดเร็วสำหรับซอร์สโค้ดเพื่อเริ่มต้นใช้งาน
เปิดใช้งาน Cloud Shell
- คลิกเปิดใช้งาน Cloud Shell จาก Cloud Console
หากเริ่มต้นใช้งาน Cloud Shell เป็นครั้งแรก คุณจะเห็นหน้าจอตรงกลางที่อธิบายว่านี่คืออะไร หากระบบแสดงหน้าจอตรงกลาง ให้คลิกต่อไป
การจัดสรรและเชื่อมต่อกับ Cloud Shell ใช้เวลาเพียงไม่กี่นาที
เครื่องเสมือนนี้โหลดด้วยเครื่องมือการพัฒนาทั้งหมดที่จำเป็น โดยมีไดเรกทอรีหลักขนาด 5 GB ถาวรและทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานส่วนใหญ่ใน Codelab นี้สามารถทำได้โดยใช้เบราว์เซอร์
เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นข้อความตรวจสอบสิทธิ์และโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์แล้ว
- เรียกใช้คำสั่งต่อไปนี้ใน 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`
- เรียกใช้คำสั่งต่อไปนี้ใน 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