Triển khai trang web bằng Cloud Run

Việc chạy các trang web có thể gặp khó khăn với tất cả các chi phí phát sinh khi tạo và quản lý các thực thể Máy ảo (VM), cụm, Pod, dịch vụ, v.v. Điều này phù hợp với các ứng dụng nhiều tầng có quy mô lớn hơn, nhưng nếu bạn chỉ muốn triển khai và hiển thị trang web của mình, thì đây là một khoản chi phí phát sinh lớn.

Với Cloud Run (nền tảng triển khai Knative của Google Cloud), bạn có thể quản lý và triển khai trang web của mình mà không cần phải tốn chi phí cho việc triển khai dựa trên VM hoặc Kubernetes. Đây không chỉ là một phương pháp đơn giản hơn về mặt quản lý mà còn giúp bạn có thể giảm xuống 0 khi không có yêu cầu nào đến trang web của bạn.

Cloud Run không chỉ mang đến khả năng phát triển không cần máy chủ cho các vùng chứa mà còn có thể chạy trên các cụm Google Kubernetes Engine (GKE) của riêng bạn hoặc trên một giải pháp nền tảng dưới dạng dịch vụ (PaaS) được quản lý hoàn toàn do Cloud Run cung cấp. Bạn sẽ kiểm thử trường hợp sau trong lớp học lập trình này.

Sơ đồ sau đây minh hoạ quy trình triển khai và lưu trữ Cloud Run. Bạn bắt đầu bằng một hình ảnh Docker được tạo thông qua Cloud Build, mà bạn kích hoạt trong Cloud Shell. Sau đó, bạn triển khai hình ảnh đó vào Cloud Run bằng một lệnh trong Cloud Shell.

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

Kiến thức bạn sẽ học được

  • Cách tạo một hình ảnh Docker bằng Cloud Build và tải hình ảnh đó lên gcr.io
  • Cách triển khai hình ảnh Docker lên Cloud Run
  • Cách quản lý hoạt động triển khai Cloud Run
  • Cách thiết lập một điểm cuối cho ứng dụng trên Cloud Run

Sản phẩm bạn sẽ tạo ra

  • Một trang web tĩnh chạy trong vùng chứa Docker
  • Một phiên bản của vùng chứa này nằm trong Container Registry
  • Một hoạt động triển khai Cloud Run cho trang web tĩnh của bạn

Bạn cần có

  • Một Tài khoản Google có quyền quản trị để tạo dự án hoặc một dự án có vai trò chủ sở hữu dự án

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, bạn phải tạo một tài khoản. Sau đó, hãy đăng nhập vào Google Cloud Console rồi nhấp vào Dự án > Tạo dự án.

Ghi nhớ mã dự án. Mã này sẽ tự động điền bên dưới tên dự án của bạn. Mã dự án là một tên riêng biệt trên tất cả các dự án Google Cloud, vì vậy, tên trong ảnh chụp màn hình đã được sử dụng và sẽ không hoạt động đối với bạn. Sau này, khoá này sẽ được gọi 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 và bật Cloud Run API.

Bật Cloud Run API

Nhấp vào Trình đơn điều hướng ☰ > API và dịch vụ > Trang tổng quan > Bật API và dịch vụ. .

Tìm "Cloud Run API", sau đó nhấp vào Cloud Run API > Bật.

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). Để biết thêm thông tin, hãy xem phần Định giá.

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

Cloud Shell

Mặc dù có thể vận hành Google Cloud và Cloud Run từ xa trên 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ôi trường này được định cấu hình sẵn với tất cả các thư viện và khung ứng dụng mà bạn cần.

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ờ.

Vì bạn đang triển khai một trang web hiện có, nên bạn chỉ cần sao chép nguồn từ kho lưu trữ. Nhờ đó, bạn có thể tập trung vào việc tạo hình ảnh Docker và triển khai đến Cloud Run.

Chạy các lệnh sau để sao chép kho lưu trữ vào phiên bản Cloud Shell và chuyển sang thư mục thích hợp. Bạn cũng sẽ cài đặt các phần phụ thuộc Node.js để có thể kiểm thử ứng dụng trước khi triển khai.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

Thao tác này sẽ sao chép kho lưu trữ của bạn, thay đổi thư mục và cài đặt các phần phụ thuộc cần thiết để chạy ứng dụng của bạn trên thiết bị. Tập lệnh có thể mất vài phút để chạy.

Hãy thực hiện quy trình thẩm định và kiểm thử ứng dụng. Chạy lệnh sau để khởi động máy chủ web:

cd ~/monolith-to-microservices/monolith
npm start

Kết quả:

Monolith listening on port 8080!

Bạn có thể xem trước ứng dụng bằng cách 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ở ra một cửa sổ mới để bạn có thể xem Cửa hàng của bạn trên Fancy đang hoạt động!

Bạn có thể đóng cửa sổ này sau khi xem trang web. Để dừng quy trình máy chủ web, hãy nhấn CONTROL+C (Command+C trên Macintosh) trong cửa sổ thiết bị đầu cuối.

Bây giờ, khi các tệp nguồn đã sẵn sàng, bạn có thể Docker hoá ứng dụng của mình!

Thông thường, bạn sẽ phải thực hiện theo quy trình gồm 2 bước, đó là tạo một vùng chứa Docker và đẩy vùng chứa đó vào một sổ đăng ký để lưu trữ hình ảnh mà GKE sẽ kéo từ đó. Tuy nhiên, bạn có thể đơn giản hoá quy trình bằng cách sử dụng Cloud Build để tạo vùng chứa Docker và đưa hình ảnh vào Container Registry chỉ bằng một lệnh! Để xem quy trình tạo Dockerfile và đẩy tệp theo cách thủ công, hãy xem phần Hướng dẫn bắt đầu nhanh cho Container Registry.

Cloud Build nén các tệp trong thư mục và di chuyển các tệp đó vào một bộ chứa Cloud Storage. Sau đó, quy trình tạo bản dựng sẽ lấy tất cả các tệp trong nhóm và sử dụng Dockerfile (có trong cùng một thư mục) để chạy quy trình tạo bản dựng Docker. Vì bạn đã chỉ định cờ --tag với máy chủ lưu trữ là gcr.io cho hình ảnh Docker, nên hình ảnh Docker kết quả sẽ được chuyển đến Container Registry.

Trước tiên, bạn cần đảm bảo rằng bạn đã bật Cloud Build API. Chạy lệnh sau để bật tính năng này:

gcloud services enable cloudbuild.googleapis.com

Sau khi bật API, hãy chạy lệnh sau trong Cloud Shell để bắt đầu quy trình tạo:

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .

Quá trình này mất vài phút, nhưng sau khi hoàn tất, sẽ có đầu ra trong thiết bị đầu cuối tương tự như sau:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/monolith:1.0.0  SUCCESS

Để xem nhật ký bản dựng hoặc theo dõi quy trình theo thời gian thực, bạn có thể chuyển đến Cloud Console, sau đó nhấp vào Trình đơn điều hướng ☰ > Cloud Build > Nhật ký. Tại đó, bạn có thể thấy danh sách tất cả các bản dựng trước đây của mình, nhưng chỉ nên có bản dựng mà bạn đã tạo.

Nếu nhấp vào Mã bản dựng, bạn có thể xem tất cả thông tin chi tiết về bản dựng đó, bao gồm cả đầu ra nhật ký. Bạn có thể xem hình ảnh vùng chứa đã được tạo bằng cách nhấp vào đường liên kết bên cạnh Hình ảnh.

Giờ đây, bạn đã tạo vùng chứa cho trang web và chuyển trang web đó sang Container Registry, đã đến lúc triển khai sang Cloud Run!

Có hai phương pháp để triển khai đến Cloud Run:

  • Cloud Run (được quản lý hoàn toàn) là mô hình PaaS, trong đó toàn bộ vòng đời của vùng chứa đều được quản lý. Bạn sẽ sử dụng phương pháp đó cho lớp học lập trình này.
  • Cloud Run for Anthos là Cloud Run có thêm một lớp kiểm soát, cho phép bạn mang các cụm và Pod từ GKE. Để biết thêm thông tin, hãy xem bài viết Thiết lập Cloud Run cho Anthos trên Google Cloud.

Các ví dụ về dòng lệnh sẽ có trong Cloud Shell bằng cách sử dụng các biến môi trường mà bạn đã thiết lập trước đó.

Dòng lệnh

Chạy lệnh sau để triển khai ứng dụng của bạn:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed 

Bạn sẽ được yêu cầu chỉ định khu vực mà bạn muốn chạy. Chọn khu vực gần bạn nhất, sau đó chấp nhận tên dịch vụ được đề xuất mặc định (monolith).

Để kiểm thử, hãy cho phép các yêu cầu chưa được xác thực đối với ứng dụng. Nhập y khi được nhắc.

Xác minh quá trình triển khai

Để xác minh rằng quá trình triển khai đã được tạo thành công, hãy chạy lệnh sau. Có thể mất vài phút để Pod status chuyển sang trạng thái Running:

gcloud run services list

Chọn [1] Cloud Run (được quản lý hoàn toàn).

Kết quả:

SERVICE   REGION    URL  LAST DEPLOYED BY          LAST DEPLOYED AT
✔  monolith  us-east1 <your url>  <your email>  2019-09-16T21:07:38.267Z

Kết quả đầu ra cho thấy một số thông tin. Bạn có thể xem quá trình triển khai, cũng như người dùng đã triển khai (địa chỉ email của bạn) và URL mà bạn có thể dùng để truy cập vào ứng dụng. Có vẻ như mọi thứ đã được tạo thành công!

Mở URL được cung cấp trong danh sách dịch vụ trong trình duyệt web. Bạn sẽ thấy trang web giống như trang web mà bạn đã xem trước cục bộ.

Bây giờ, hãy triển khai lại ứng dụng của bạn, nhưng lần này hãy điều chỉnh một trong các tham số.

Theo mặc định, một ứng dụng Cloud Run sẽ có giá trị đồng thời là 80, nghĩa là mỗi phiên bản vùng chứa sẽ xử lý tối đa 80 yêu cầu cùng một lúc. Đây là một điểm khác biệt lớn so với mô hình hàm dưới dạng dịch vụ (FaaS), trong đó một phiên bản xử lý một yêu cầu tại một thời điểm.

Triển khai lại cùng một hình ảnh vùng chứa với giá trị đồng thời là 1 (chỉ cho mục đích kiểm thử) và xem điều gì sẽ xảy ra.

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1

Trả lời các câu hỏi tiếp theo như lần đầu tiên. Sau khi lệnh được thực thi thành công, hãy kiểm tra Cloud Console để xem kết quả.

Trên trang tổng quan Cloud Run, hãy nhấp vào dịch vụ monolith để xem thông tin chi tiết.

Nhấp vào thẻ Bản sửa đổi. Bạn sẽ thấy 2 bản sửa đổi được tạo. Nhấp vào monolith-00002 rồi xem thông tin chi tiết. Bạn sẽ thấy giá trị đồng thời giảm xuống 1.

]

Mặc dù cấu hình đó đủ để kiểm thử, nhưng trong hầu hết các trường hợp sản xuất, bạn sẽ có các vùng chứa hỗ trợ nhiều yêu cầu đồng thời.

Bây giờ, hãy khôi phục mức độ đồng thời ban đầu mà không cần triển khai lại. Bạn có thể đặt giá trị đồng thời thành giá trị mặc định là 80 hoặc 0. Việc này sẽ xoá mọi hạn chế về tính đồng thời và đặt giá trị này thành giá trị tối đa mặc định (hiện tại là 80 tại thời điểm viết bài này).

Chạy lệnh sau trong Cloud Shell để cập nhật bản sửa đổi hiện tại:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80

Lưu ý rằng một bản sửa đổi khác đã được tạo, lưu lượng truy cập đã được chuyển hướng và mức độ đồng thời đã trở lại 80.

Nhóm tiếp thị yêu cầu bạn thay đổi trang chủ của trang web công ty. Họ cho rằng trang này cần cung cấp nhiều thông tin hơn về công ty và sản phẩm/dịch vụ mà công ty bán. Trong phần này, bạn sẽ thêm một số văn bản vào trang chủ để nhóm tiếp thị hài lòng!

Có vẻ như một trong các nhà phát triển của bạn đã tạo các thay đổi bằng tên tệp index.js.new. Bạn chỉ cần sao chép tệp đó vào index.js và các thay đổi của bạn sẽ được phản ánh. Làm theo hướng dẫn để thực hiện các thay đổi phù hợp.

Chạy các lệnh sau, sao chép tệp đã cập nhật vào tên tệp chính xác và in nội dung của tệp đó để xác minh các thay đổi:

cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js

Mã kết quả sẽ có dạng như sau:

/*
Copyright 2019 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    width: "800px",
    margin: "0 auto",
    padding: theme.spacing(3, 2)
  }
}));
export default function Home() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <Paper className={classes.paper}>
        <Typography variant="h5">
          Fancy Fashion &amp; Style Online
        </Typography>
        <br />
        <Typography variant="body1">
          Tired of mainstream fashion ideas, popular trends and societal norms?
          This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
          Start shopping Fancy items now!
        </Typography>
      </Paper>
    </div>
  );
}

Bạn đã cập nhật các thành phần React, nhưng bạn cần tạo ứng dụng React để tạo các tệp tĩnh. Chạy lệnh sau để tạo ứng dụng React và sao chép ứng dụng đó vào thư mục công khai của monolith:

cd ~/monolith-to-microservices/react-app
npm run build:monolith

Sau khi cập nhật mã, bạn cần tạo lại vùng chứa Docker và xuất bản vùng chứa đó lên Container Registry. Bạn có thể dùng lệnh tương tự như trước, chỉ khác là lần này bạn sẽ cập nhật nhãn phiên bản!

Chạy lệnh sau để kích hoạt một Cloud Build mới có phiên bản hình ảnh 2.0.0 mới cập nhật:

cd ~/monolith-to-microservices/monolith

#Feel free to test your application
npm start

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

Trong phần tiếp theo, bạn sẽ sử dụng hình ảnh đó để cập nhật ứng dụng mà không bị gián đoạn.

Các thay đổi đã hoàn tất và nhóm tiếp thị hài lòng với nội dung cập nhật của bạn! Đã đến lúc bạn cần cập nhật trang web mà không làm gián đoạn người dùng.

Cloud Run coi mỗi lượt triển khai là một bản sửa đổi mới, bản sửa đổi này sẽ được đưa vào hoạt động rồi chuyển hướng lưu lượng truy cập đến đó.

Làm theo các hướng dẫn tiếp theo để cập nhật trang web của bạn.

Dòng lệnh

Qua dòng lệnh, bạn có thể triển khai lại dịch vụ để cập nhật hình ảnh lên phiên bản mới bằng lệnh sau:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managed

Xác minh quá trình triển khai

Xác thực bản cập nhật triển khai bằng cách chạy lệnh sau:

gcloud run services describe monolith --platform managed 

Kết quả sẽ có dạng như sau:

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  annotations:
    client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0
...

Bạn sẽ thấy dịch vụ của mình hiện đang sử dụng phiên bản mới nhất của hình ảnh được triển khai trong một bản sửa đổi mới.

Để xác minh các thay đổi, hãy chuyển đến URL bên ngoài của dịch vụ Cloud Run một lần nữa và lưu ý rằng tiêu đề ứng dụng của bạn đã được cập nhật.

Chạy lệnh sau để liệt kê các dịch vụ và xem địa chỉ IP nếu bạn quên:

gcloud run services list

Giờ đây, trang web của bạn sẽ hiển thị văn bản mà bạn đã thêm vào thành phần trang chủ!

Xoá hình ảnh trong Container Registry

# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet

# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet

Xoá cấu phần phần mềm Cloud Build khỏi Cloud Storage

# The following command will take all source archives from all builds and delete them from cloud storage

# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}' 

gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done

Xoá dịch vụ Cloud Run

gcloud run services delete monolith --platform managed

Bạn đã triển khai, mở rộng quy mô và cập nhật trang web của mình bằng Cloud Run.

Tìm hiểu thêm