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

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 trạng thái có thể gọi được thông qua các yêu cầu HTTP. Cloud Run là một nền tảng không máy chủ, giúp bạn không cần quản lý cơ sở hạ tầng, nhờ đó, bạn có thể tập trung vào những điều quan trọng nhất – xây dựng các ứng dụng tuyệt vời. Dịch vụ này được xây dựng dựa trên Knative, cho phép bạn chọn chạy các vùng chứa bằng Cloud Run (được quản lý toàn bộ) 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 tạo một hình ảnh vùng chứa và triển khai hình ảnh đó vào Cloud Run.

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

Không áp dụng

Thiết lập môi trường theo tốc độ của riêng bạn

Nếu chưa có Tài khoản Google (Gmail hoặc Google Apps), bạn phải tạo một tài khoản. Đăng nhập vào bảng điều khiển Google Cloud Platform (console.cloud.google.com) rồi tạo một dự án mới:

Ảnh chụp màn hình từ 2016-02-10 12:45:26.png

Hãy nhớ mã dự án, một tên duy nhất trong tất cả các dự án trên Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, xin lỗi!). Sau này trong lớp học lập trình này, chúng ta sẽ gọi nó là PROJECT_ID.

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

Việc thực hiện lớp học lập trình này sẽ không tốn của bạn quá vài đô la, nhưng có thể tốn nhiều hơn nếu bạn quyết định sử dụng nhiều tài nguyên hơn hoặc nếu bạn để các tài nguyên đó chạy (xem phần "dọn dẹp" ở cuối tài liệu này).

Người dùng mới của Google Cloud Platform đủ điều kiện dùng thử miễn phí 300 USD.

Cloud Shell

Mặc dù có thể vận hành Google Cloud từ xa bằng máy tính xách tay, nhưng bạn sẽ 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 trang bị tất cả các công cụ phát triển mà bạn cần. Nó cung cấp một thư mục chính có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Điều này có nghĩa là bạn chỉ cần một trình duyệt (có, trình duyệt này hoạt động trên Chromebook) cho lớp học lập trình này.

Để kích hoạt Google Cloud Shell, trong bảng điều khiển dành cho nhà phát triển, bạn chỉ cần nhấp vào nút ở phía trên cùng bên phải (mất vài giây để cung cấp và kết nối với môi trường):

activateCloudShell.png

Nhấp vào nút "Start Cloud Shell" (Bắt đầu Cloud Shell):

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

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

gcloud auth list

Đầu ra của lệnh

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

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

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

echo $GOOGLE_CLOUD_PROJECT

Đầu ra của lệnh

<PROJECT_ID>

Nếu vì lý do nào đó mà dự án chưa được thiết lập, bạn chỉ cần đưa ra lệnh sau :

gcloud config set project <PROJECT_ID>

Bạn đang tìm PROJECT_ID? Kiểm tra mã nhận dạng bạn đã dùng trong các bước thiết lập hoặc tìm mã nhận dạng đó trong trang tổng quan của bảng điều khiển:

Project_ID.png

QUAN TRỌNG: Cuối cùng, hãy đặ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 múi giờ khác nhau. Tìm hiểu thêm trong tài liệu về Khu vực và múi giờ.

Bật Cloud Run API

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

gcloud services enable run.googleapis.com

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

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

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

Để tạo ứng dụng, hãy dùng Cloud Shell để tạo một thư mục mới có tên 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 một lệnh tập lệnh khởi động và một phần phụ thuộc vào khung ứng dụng web Express.

Tiếp theo, trong cùng một thư mục, hãy tạo một tệp index.js rồi sao chép nội dung sau 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);
});

Đoạn mã đó tạo một máy chủ web cơ bản, lắng nghe trên cổng do biến môi trường PORT xác định. Giờ đây, ứng dụng của bạn đã sẵn sàng được đóng gói, kiểm thử và tải lên Container Registry.

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

# 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 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 của bạn trên Google Cloud khi chạy trong Cloud Shell. Bạn cũng có thể nhận được mã này bằng cách chạy gcloud config get-value project.

Sau khi được chuyển đến sổ đăng ký, bạn sẽ thấy một thông báo SUCCESS có 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ể được dùng lại nếu muốn.

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

gcloud container images list

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

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

Trong Cloud Shell, hãy nhấp vào Xem trước trên web rồi chọn Xem trước trên cổng 8080.

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

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

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

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

Lựa chọn triển khai --allow-unauthenticated cho phép bạn truy cập vào ứng dụng mà không cần xác thực. Lựa 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ý hoàn toàn (không phải cơ sở hạ tầng Kubernetes thông qua Anthos).

Đợ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 thị URL của 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:

Cloud Run tự động mở rộng quy mô theo chiều ngang cho hình ảnh vùng chứa để 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 trả tiền cho CPU, bộ nhớ và mạng được sử dụng trong quá trình xử lý yêu cầu.

Mặc dù Cloud Run không tính phí khi dịch vụ không được sử dụng, 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 để không bị tính phí. Thao tác này sẽ ngừng tính phí cho tất cả tài nguyên được 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

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ước tiếp theo nên làm là xem Hướng dẫn nhanh: Triển khai đến Cloud Run for Anthos trên Google Cloud.

Để biết thêm thông tin về cách tạo một vùng chứa HTTP không trạng thái phù hợp với Cloud Run từ nguồn mã và đẩy vùng chứa đó vào 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 Knative.