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

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

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

ไม่มี

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

หากยังไม่มีบัญชี Google (Gmail หรือ Google Apps) คุณต้องสร้างบัญชี ลงชื่อเข้าใช้คอนโซล Google Cloud Platform (console.cloud.google.com) แล้วสร้างโปรเจ็กต์ใหม่โดยทำดังนี้

ภาพหน้าจอจาก 2016-02-10 12:45:26.png

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

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

การทำ Codelab นี้ไม่ควรมีค่าใช้จ่ายเกิน 2-3 ดอลลาร์ แต่ก็อาจมีค่าใช้จ่ายมากกว่านี้หากคุณตัดสินใจใช้ทรัพยากรเพิ่มเติมหรือปล่อยให้ทรัพยากรทำงานต่อไป (ดูส่วน "การล้างข้อมูล" ที่ท้ายเอกสารนี้)

ผู้ใช้ใหม่ของ Google Cloud Platform มีสิทธิ์ทดลองใช้ฟรี$300

Cloud Shell

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

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

หากต้องการเปิดใช้งาน Google Cloud Shell จากคอนโซลนักพัฒนาแอป ให้คลิกปุ่มที่ด้านขวาบน (ระบบจะจัดสรรและเชื่อมต่อกับสภาพแวดล้อมในเวลาเพียงไม่กี่นาที)

activateCloudShell.png

คลิกปุ่ม "เริ่ม Cloud Shell"

Screen 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>

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

echo $GOOGLE_CLOUD_PROJECT

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

<PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

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

Project_ID.png

สำคัญ: สุดท้าย ให้ตั้งค่าการกำหนดค่าโซนและโปรเจ็กต์เริ่มต้น

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.

คุณจะสร้างแอป 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"
  }
}

ที่สำคัญที่สุดคือไฟล์ด้านบนมีคำสั่งสคริปต์เริ่มต้นและการอ้างอิงเฟรมเวิร์กเว็บแอป 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 แล้ว

หากต้องการสร้างคอนเทนเนอร์แอปตัวอย่าง ให้สร้างไฟล์ใหม่ชื่อ 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 ให้คลิกตัวอย่างเว็บ แล้วเลือกแสดงตัวอย่างบนพอร์ต 8080

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

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

การทําให้แอปที่อยู่ในคอนเทนเนอร์ใช้งานได้ใน 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 ของบริการในเว็บเบราว์เซอร์

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

แม้ว่า 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

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

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

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

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

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