ทำให้คอนเทนเนอร์ใช้งานได้และเรียกใช้คอนเทนเนอร์ด้วย Cloud Run บน Node.js

1. ก่อนเริ่มต้น

6a5cf23c8e20491f.png

Cloud Run เป็นแพลตฟอร์มคำนวณที่มีการจัดการซึ่งทำให้คุณเรียกใช้คอนเทนเนอร์แบบไม่เก็บสถานะที่เรียกใช้ผ่านคำขอ HTTP ได้ Cloud Run เป็นแบบ Serverless ซึ่งช่วยลดความจำเป็นในการจัดการโครงสร้างพื้นฐาน คุณจึงมุ่งเน้นไปที่การสร้างแอปที่ยอดเยี่ยม ซึ่งเป็นสิ่งที่สำคัญที่สุดได้ Cloud Run สร้างขึ้นจาก Knative ซึ่งให้คุณเลือกที่จะเรียกใช้คอนเทนเนอร์ด้วย Cloud Run (ที่มีการจัดการครบวงจร) หรือ Cloud Run สำหรับ Anthos ได้ เป้าหมายของ Codelab นี้คือการสร้างอิมเมจคอนเทนเนอร์และทำให้ใช้งานได้ใน Cloud Run

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

ไม่มี

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

การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง

  1. ลงชื่อเข้าใช้ Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ G Suite คุณต้องสร้างบัญชี)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZwci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีผู้ใช้แล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้

  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud

การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย โปรดทำตามวิธีการในส่วน "การล้างข้อมูล" ซึ่งจะแนะนำวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ใหม่ของ Google Cloud มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300USD

Cloud Shell

แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลจากแล็ปท็อปได้ แต่คุณจะต้องใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud

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

  1. หากต้องการเปิดใช้งาน Cloud Shell จาก Cloud Console เพียงคลิกเปิดใช้งาน Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (ระบบจะจัดสรรและเชื่อมต่อกับสภาพแวดล้อมในเวลาไม่กี่นาที)

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01AScreen Shot 2017-06-14 at 10.13.43 PM.png

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

gcloud auth list

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

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

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

[core]
project = <PROJECT_ID>

หากไม่ได้ตั้งค่าโปรเจ็กต์ด้วยเหตุผลบางประการ ให้เรียกใช้คำสั่งต่อไปนี้

gcloud config set project <PROJECT_ID>

หากกำลังมองหา PROJECT_ID ตรวจสอบว่าคุณใช้รหัสใดในขั้นตอนการตั้งค่า หรือค้นหารหัสในแดชบอร์ด Cloud Console

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

นอกจากนี้ Cloud Shell ยังตั้งค่าตัวแปรสภาพแวดล้อมบางอย่างโดยค่าเริ่มต้น ซึ่งอาจมีประโยชน์เมื่อคุณเรียกใช้คำสั่งในอนาคต

echo $GOOGLE_CLOUD_PROJECT

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

<PROJECT_ID>
  1. สุดท้าย ให้ตั้งค่าโซนเริ่มต้นและการกำหนดค่าโปรเจ็กต์
gcloud config set compute/zone us-central1-f

คุณเลือกโซนต่างๆ ได้หลากหลาย ดูข้อมูลเพิ่มเติมได้ที่ภูมิภาคและโซน

เปิดใช้ Cloud Run API

เปิดใช้ Cloud Run API จาก Cloud Shell

gcloud services enable run.googleapis.com

ซึ่งควรจะแสดงข้อความว่าสำเร็จคล้ายกับข้อความต่อไปนี้

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3. เขียนแอปตัวอย่าง

คุณจะสร้างแอป Node.js ที่เรียบง่ายซึ่งอิงตาม Express เพื่อตอบสนองต่อคำขอ HTTP

หากต้องการสร้างแอป ให้ใช้ Cloud Shell เพื่อสร้างไดเรกทอรีใหม่ชื่อ helloworld-nodejs แล้วเปลี่ยนไดเรกทอรีเป็นไดเรกทอรีดังกล่าว

mkdir helloworld-nodejs
cd helloworld-nodejs

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

{
  "name": "cloudrun-helloworld",
  "version": "1.0.0",
  "description": "Simple hello world sample in Node",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "Apache-2.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}

ที่สำคัญที่สุดคือไฟล์ด้านบนมีคำสั่งสคริปต์เริ่มต้นและทรัพยากร Dependency บนเฟรมเวิร์กเว็บแอป Express

จากนั้นในไดเรกทอรีเดียวกัน ให้สร้างไฟล์ index.js แล้วคัดลอกเนื้อหาต่อไปนี้ลงในไฟล์

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

app.get('/', (req, res) => {
  console.log('Hello world received a request.');

  const target = process.env.TARGET || 'World';
  res.send(`Hello ${target}!`);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});

โค้ดดังกล่าวจะสร้างเว็บเซิร์ฟเวอร์พื้นฐานที่รอฟังพอร์ตซึ่งกำหนดโดยตัวแปรสภาพแวดล้อม PORT ตอนนี้แอปของคุณพร้อมที่จะทำเป็นคอนเทนเนอร์ ทดสอบ และอัปโหลดไปยัง Container Registry แล้ว

4. สร้างคอนเทนเนอร์ให้กับแอปและอัปโหลดไปยัง Container Registry

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

# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

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

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

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

gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

$GOOGLE_CLOUD_PROJECT คือตัวแปรสภาพแวดล้อมที่มีรหัสโปรเจ็กต์ที่อยู่ในระบบคลาวด์ Google Cloud เมื่อเรียกใช้ใน Cloud Shell หรือจะรับได้โดยเรียกใช้ gcloud config get-value project

เมื่อพุชไปยังรีจิสทรีแล้ว คุณจะเห็นข้อความ SUCCESS ที่มีชื่ออิมเมจ (gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld) ระบบจะจัดเก็บอิมเมจไว้ใน Container Registry และสามารถนำกลับมาใช้ใหม่ได้หากต้องการ

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

gcloud container images list

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

docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

ใน Cloud Shell ให้คลิกตัวอย่างเว็บ170b7a95be8c6296.png แล้วเลือกแสดงตัวอย่างบนพอร์ต 8080

3618ca3a4a135570.png

ซึ่งจะเปิดหน้าต่างเบราว์เซอร์ที่มีข้อความว่า Hello World!

a0307f34cacf9e6a.png

หรือจะใช้ curl localhost:8080 ก็ได้

5. ทำให้ใช้งานได้กับ Cloud Run

การทําให้แอปที่อยู่ในคอนเทนเนอร์ใช้งานได้ใน Cloud Run จะทําได้โดยใช้คําสั่งต่อไปนี้ (ตรวจสอบว่าได้ปรับชื่ออิมเมจให้ถูกต้องสําหรับแอปที่คุณสร้างขึ้น หรือใช้อิมเมจที่สร้างไว้ล่วงหน้า gcr.io/cloudrun/hello)

gcloud run deploy helloworld \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated

--allow-unauthenticated ตัวเลือกการติดตั้งใช้งานช่วยให้คุณเข้าถึงแอปได้โดยไม่ต้องมีการตรวจสอบสิทธิ์ --platform managed \ ตัวเลือกการทำให้ใช้งานได้หมายความว่าคุณกำลังขอสภาพแวดล้อมที่มีการจัดการครบวงจร (ไม่ใช่โครงสร้างพื้นฐานของ Kubernetes ผ่าน Anthos)

โปรดรอสักครู่จนกว่าการติดตั้งใช้งานจะเสร็จสมบูรณ์ เมื่อเสร็จแล้ว บรรทัดคำสั่งจะแสดง URL ของบริการ

Service [helloworld] revision [helloworld-00001] has been deployed
and is serving traffic at https://helloworld-wdl7fdwaaa-uc.a.run.app

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

63260b4d3aee42b8.png

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

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

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

คุณจะลบโปรเจ็กต์ Google Cloud เพื่อหลีกเลี่ยงการเรียกเก็บเงิน ซึ่งจะหยุดการเรียกเก็บเงินสำหรับทรัพยากรทั้งหมดที่ใช้สำหรับโปรเจ็กต์นั้น หรือจะลบรูปภาพ helloworld โดยใช้คำสั่งนี้ก็ได้

gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

หากต้องการลบบริการ Cloud Run ให้ใช้คำสั่งต่อไปนี้

gcloud run services delete helloworld \
  --platform managed \
  --region us-central1

7. ขอแสดงความยินดี

ยินดีด้วย คุณได้ทําให้แอปที่แพ็กเกจในอิมเมจคอนเทนเนอร์ใช้งานได้กับ Cloud Run

ดูข้อมูลเพิ่มเติม

ขั้นตอนถัดไปที่ควรทำคือดูการเริ่มต้นอย่างรวดเร็ว: ทำให้ใช้งานได้กับ Cloud Run สำหรับ Anthos บน Google Cloud

ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างคอนเทนเนอร์ HTTP แบบไม่เก็บสถานะที่เหมาะกับ Cloud Run จากแหล่งที่มาของโค้ดและการพุชคอนเทนเนอร์ไปยัง Container Registry ได้ที่แหล่งข้อมูลต่อไปนี้

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Knative ซึ่งเป็นโปรเจ็กต์โอเพนซอร์สพื้นฐานได้ที่ Knative