Triển khai và chạy một vùng chứa bằng Cloud Run trên Node.js

1. Trước khi bắt đầu

6a5cf23c8e20491f.png.

Cloud Run là một nền tảng điện toán được quản lý cho phép bạn chạy các vùng chứa không có trạng thái có thể gọi qua các yêu cầu HTTP. Cloud Run là nền tảng không máy chủ; nhờ đó, bạn không cần phải quản lý cơ sở hạ tầng nữa. Nhờ vậy, bạn có thể tập trung vào công việc quan trọng nhất – tạo ra các ứng dụng tuyệt vời. Bộ công cụ này được xây dựng từ Knative, cho phép bạn chọn chạy các vùng chứa của mình bằng Cloud Run (được quản lý hoàn toàn) hoặc Cloud Run for Anthos. Mục tiêu của lớp học lập trình này là giúp bạn xây dựng hình ảnh vùng chứa và triển khai hình ảnh đó cho Cloud Run.

Điều kiện tiên quyết

Không áp dụng

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. (Nếu chưa có tài khoản Gmail hoặc G Suite, bạn phải tạo một tài khoản.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Xin lưu ý rằng mã dự án là một tên riêng biệt trong tất cả dự án Google Cloud (tên ở trên đã được sử dụng nên sẽ không phù hợp với bạn!). Lớp này sẽ được đề cập sau trong lớp học lập trình này là PROJECT_ID.

  1. Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Cloud Console để sử dụng tài nguyên của Google Cloud.

Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" sẽ tư vấn cho bạn cách tắt tài nguyên để bạn không phải chịu thanh toán ngoài hướng dẫn này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng bạn sẽ dùng Cloud Shell, một môi trường dòng lệnh chạy trong Google Cloud.

Máy ảo dựa trên Debian này được tải tất cả các công cụ phát triển mà bạn cần. Dịch vụ này cung cấp thư mục gốc 5 GB ổn định và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Tức là tất cả những gì bạn cần để thực hiện lớp học lập trình này là một trình duyệt (vâng, trình duyệt này hoạt động trên Chromebook).

  1. Để kích hoạt Cloud Shell trong Cloud Console, bạn chỉ cần nhấp vào Kích hoạt Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (chỉ mất vài phút để cấp phép và kết nối với môi trường).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Ảnh chụp màn hình lúc 10:13.43 chiều 14/6/2017.png

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án đã được đặt thành PROJECT_ID.

gcloud auth list

Kết quả lệnh

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

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu vì lý do nào đó mà dự án không được thiết lập, chỉ cần phát hành lệnh sau:

gcloud config set project <PROJECT_ID>

Bạn đang tìm PROJECT_ID? Hãy xem mã nhận dạng bạn đã sử dụng ở các bước thiết lập hoặc tra cứu trong trang tổng quan Cloud Console:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell cũng đặt một số biến môi trường theo mặc định. Điều này có thể hữu ích khi bạn chạy các lệnh sau này.

echo $GOOGLE_CLOUD_PROJECT

Kết quả lệnh

<PROJECT_ID>
  1. Cuối cùng, đặt cấu hình dự án và vùng mặc định.
gcloud config set compute/zone us-central1-f

Bạn có thể chọn nhiều vùng khác nhau. Để biết thêm thông tin, hãy xem Khu vực và Vùng.

Bật Cloud Run API

Trong Cloud Shell, hãy bật Cloud Run API.

gcloud services enable run.googleapis.com

Thao tác này sẽ tạo ra một thông báo thành công tương tự như thông báo sau:

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

3. Viết ứng dụng mẫu

Bạn sẽ xây dựng một ứng dụng Node.js dựa trên nền tảng nhanh, đơn giản để phản hồi các yêu cầu HTTP.

Để xây dựng ứng dụng, hãy dùng Cloud Shell để tạo một thư mục mới có tên là helloworld-nodejs rồi thay đổi thư mục thành thư mục đó.

mkdir helloworld-nodejs
cd helloworld-nodejs

Tạo tệp package.json có nội dung sau:

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

Quan trọng nhất là tệp ở trên chứa lệnh bắt đầu tập lệnh và phần phụ thuộc trên khung ứng dụng web Express.

Tiếp theo, trong chính thư mục đó, hãy tạo một tệp index.js rồi sao chép nội dung sau đây vào tệp đó:

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

Mã đó sẽ tạo một máy chủ web cơ bản tiếp nhận trên cổng do biến môi trường PORT xác định. Bây giờ, ứng dụng của bạn đã sẵn sàng để được lưu trữ, kiểm thử và tải lên Container Registry.

4. Lưu trữ ứng dụng của bạn và tải ứng dụng lên Container Registry

Để chứa ứng dụng mẫu, hãy tạo một tệp mới có tên Dockerfile trong cùng thư mục với tệp nguồn rồi sao chép nội dung sau vào đó:

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

Bây giờ, hãy tạo hình ảnh vùng chứa của bạn bằng Cloud Build bằng cách chạy lệnh sau từ thư mục chứa Dockerfile:

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

$GOOGLE_CLOUD_PROJECT là một biến môi trường chứa mã dự án trên Google Cloud khi chạy trong Cloud Shell. Bạn cũng có thể tải gcloud config get-value project.

Sau khi được đẩy vào sổ đăng ký, bạn sẽ thấy thông báo SUCCESS chứa tên hình ảnh (gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld). Hình ảnh này được lưu trữ trong Container Registry và có thể sử dụng lại nếu muốn.

Bạn có thể liệt kê tất cả hình ảnh vùng chứa được liên kết với dự án hiện tại của mình bằng lệnh sau:

gcloud container images list

Nếu muốn chạy và kiểm thử cục bộ ứng dụng trên Cloud Shell, bạn có thể bắt đầu ứng dụng bằng lệnh docker tiêu chuẩn sau:

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

Trong Cloud Shell, hãy nhấp vào biểu tượng Xem trước trên web170b7a95be8c6296.pngS rồi chọn Xem trước trên cổng 8080.

3618ca3a4a135570.pngS

Thao tác này sẽ mở ra một cửa sổ trình duyệt có nội dung Hello World! (Xin chào!)

a0307f34cacf9e6a.png

Bạn cũng có thể chỉ cần sử dụng curl localhost:8080.

5. Triển khai lên Cloud Run

Việc triển khai ứng dụng trong vùng chứa lên Cloud Run được thực hiện bằng lệnh sau (nhớ điều chỉnh thành đúng tên hình ảnh cho ứng dụng mà bạn đã tạo hoặc sử dụng hình ảnh tạo sẵn gcr.io/cloudrun/hello):

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

Tuỳ chọn triển khai --allow-unauthenticated cho phép bạn truy cập ứng dụng mà không cần xác thực. Tuỳ chọn triển khai --platform managed \ có nghĩa là bạn đang yêu cầu môi trường được quản lý toàn diện (không phải cơ sở hạ tầng Kubernetes thông qua Anthos).

Hãy đợi vài phút cho đến khi quá trình triển khai hoàn tất. Khi hoàn tất, dòng lệnh sẽ hiện URL dịch vụ.

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

Giờ đây, bạn có thể truy cập vào vùng chứa đã triển khai bằng cách mở URL dịch vụ trong trình duyệt web:

63260b4d3aee42b8.pngS

Cloud Run tự động mở rộng và mở rộng hình ảnh vùng chứa theo chiều ngang để xử lý các yêu cầu đã nhận được, sau đó giảm quy mô khi nhu cầu giảm. Bạn chỉ phải thanh toán cho CPU, bộ nhớ và kết nối mạng được tiêu thụ trong quá trình xử lý yêu cầu.

6. Dọn dẹp

Mặc dù Cloud Run không tính phí khi bạn không sử dụng dịch vụ này, nhưng bạn vẫn có thể bị tính phí khi lưu trữ hình ảnh vùng chứa đã tạo.

Bạn có thể xoá dự án Google Cloud của mình để tránh phát sinh phí, tức là ngừng tính phí cho tất cả tài nguyên dùng cho dự án đó, hoặc chỉ cần xoá hình ảnh helloworld bằng lệnh sau:

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

Để xoá dịch vụ Cloud Run, hãy dùng lệnh sau:

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

7. Xin chúc mừng

Xin chúc mừng! Bạn đã triển khai một ứng dụng được đóng gói trong một hình ảnh vùng chứa lên Cloud Run.

Tìm hiểu thêm

Bạn nên tham khảo bài viết Quickstart: Deploy to Cloud Run for Anthos trên Google Cloud (Bắt đầu nhanh: Triển khai lên Cloud Run cho Anthos trên Google Cloud).

Để biết thêm thông tin về cách xây dựng vùng chứa HTTP không có trạng thái phù hợp với Cloud Run từ nguồn mã và đẩy vùng chứa đó sang Container Registry, hãy xem các tài nguyên sau:

Để tìm hiểu thêm về Knative, dự án nguồn mở cơ bản, hãy xem phần Knative.