Triển khai trang web bằng Cloud Run

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

Việc chạy các trang web có thể gặp khó khăn với toàn bộ chi phí tạo và quản lý các phiên bản, cụm, Nhóm, dịch vụ và nhiều mục khác của Máy ảo (VM). Điều này là bình thường đối với các ứng dụng lớn hơn, nhiều lớp, nhưng nếu bạn chỉ cố gắng triển khai và hiển thị trang web của mình, thì sẽ tốn rất nhiều chi phí.

Nhờ Cloud Run, giải pháp triển khai của Knative trên Google Cloud, bạn có thể quản lý và triển khai trang web của mình mà không phải phát sinh thêm chi phí khi triển khai trên máy ảo hoặc Kubernetes. Đó không chỉ là một phương pháp đơn giản hơn từ góc độ quản lý, mà còn cho phép bạn mở rộng quy mô về 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 giải pháp phát triển không 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 nền tảng được quản lý hoàn toàn dưới dạng một giải pháp dịch vụ (PaaS) do Cloud Run cung cấp. Bạn sẽ kiểm thử tình huống sau trong lớp học lập trình này.

Sơ đồ dưới đây minh hoạ quy trình triển khai và quy trình lưu trữ Cloud Run. Bắt đầu với 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 đó lên Cloud Run bằng một lệnh trong Cloud Shell.

db5f05c090d5ebcb.png

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

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

  • Cách tạo 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 cho Cloud Run
  • Cách quản lý hoạt động triển khai Cloud Run
  • Cách thiết lập điểm cuối cho ứng dụng trên Cloud Run

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

  • Trang web tĩnh chạy bên trong vùng chứa Docker
  • Phiên bản vùng chứa này nằm trong Đăng ký vùng chứa
  • Triển khai Cloud Run cho trang web tĩnh

Bạn cần có

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

2. Thiết lập môi trường

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

Nếu chưa có Tài khoản Google, thì bạn phải tạo một tài khoản. Sau đó, đăng nhập vào Google Cloud Console rồi nhấp vào Dự án > Tạo dự án.

53dad2cefdae71da.pngS

faab21976aabeb4c.png

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

5dbb2e6e27a55fcf.png.

Tìm "Cloud Run API" rồi nhấp vào Cloud Run API > Bật.

f1fd486174a744cf.png

Bạn sẽ không mất quá vài đô la khi chạy qua lớp học lập trình này, nhưng sẽ 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 để chúng chạy (xem phần Dọn dẹp ở phần cuối). Để biết thêm thông tin, hãy xem bài viết Định giá.

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

Cloud Shell

Mặc dù bạn 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ả những khung và thư viện ứng dụng mà bạn cần.

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 có dung lượng ổn định 5 GB 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.

3. Kho lưu trữ nguồn bản sao

Vì đ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ữ là có thể tập trung vào việc tạo hình ảnh Docker và triển khai lên Cloud Run.

Chạy các lệnh sau để sao chép kho lưu trữ vào thực thể Cloud Shell và thay đổi 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ữ, 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 trên máy. Có thể mất vài phút để tập lệnh chạy.

Thẩm định và thử nghiệm ứng dụng của bạn. Chạy lệnh sau để khởi động máy chủ web của bạn:

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 của mình bằng cách nhấp vào biểu tượng Xem trước trên webacc630712255c604.png rồi chọn Xem trước trên cổng 8080.

5869738f0e9ec386.pngS

Thao tác này sẽ mở ra một cửa sổ mới để bạn có thể xem Cửa hàng yêu thích của mình hoạt động!

9ed25c3f0cbe62fa.png.

Bạn có thể đóng cửa sổ này sau khi xem trang web. Để dừng quá trình máy chủ web, nhấn CONTROL+C (Command+C trên Macintosh) trong cửa sổ dòng lệnh.

4. Tạo vùng chứa Docker bằng Cloud Build

Giờ đây, khi các tệp nguồn của bạn đã sẵn sàng hoạt động, đã đến lúc Docker hoá ứng dụng!

Thông thường, bạn phải thực hiện phương pháp gồm 2 bước, bao gồm việc xây dựng 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 để GKE lấy. Tuy nhiên, bạn có thể tận hưởng cuộc sống thuận tiện hơn bằng cách sử dụng Cloud Build để tạo vùng chứa Docker và đặt hình ảnh vào Container Registry chỉ bằng một lệnh! Để xem quy trình tạo và đẩy Dockerfile theo cách thủ công, hãy xem phần Quickstart for Container Registry (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 xây dựng sẽ lấy tất cả các tệp từ bộ chứa và sử dụng Dockerfile nằm trong cùng thư mục để chạy quy trình xây 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 thu được sẽ được đẩy đến Sổ đăng ký vùng chứa.

Trước tiên, bạn cần đảm bảo mình đã 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 xây dựng:

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, cửa sổ dòng lệnh sẽ xuất ra kết quả 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 lịch sử xây dựng hoặc xem quá trình xây dựng theo thời gian thực, bạn có thể truy cập vào 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.

4c753ede203255f6.png.

Nếu nhấp vào Build ID (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ả kết quả 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.

6e88ed1643dfe629.pngS

5. Triển khai vùng chứa lên Cloud Run

Giờ đây, khi bạn đã lưu trữ trang web của mình thành vùng chứa và đẩy trang web vào Container Registry, đã đến lúc triển khai Cloud Run!

Có 2 phương pháp triển khai Cloud Run:

  • Cloud Run (được quản lý hoàn toàn) là mô hình PaaS quản lý toàn bộ vòng đời của vùng chứa. Bạn sẽ dùng phương pháp đó trong 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 chuyển các cụm và Pods của mình từ GKE. Để biết thêm thông tin, hãy xem bài viết Thiết lập Cloud Run for 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 bạn muốn chạy chiến dịch ở vùng nào. 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 (một nguyên khối).

d52d9419c5166674.png

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

3a57b32f133dad61.pngs

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 trở thành 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ả cho bạn thấy một số nội dung. Bạn có thể xem quá trình triển khai của mình, cũng như người dùng đã triển khai quá trình đó (địa chỉ email của bạn) và URL mà bạn có thể sử 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ụ trên trình duyệt web của bạn và bạn sẽ thấy chính trang web mà bạn đã xem trước cục bộ.

6. Tạo bản sửa đổi mới với mức độ đồng thời thấp hơn

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, tức là mỗi thực thể vùng chứa sẽ phân phát tối đa 80 yêu cầu tại một thời điểm. Đó là một sự khác biệt lớn so với các hàm dưới dạng mô hình dịch vụ (FaaS), trong đó một thực thể chỉ xử lý một yêu cầu tại một thời điểm.

Triển khai lại hình ảnh vùng chứa đó với giá trị đồng thời là 1 (chỉ cho mục đích thử nghiệm) 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 đặt lệnh thành công, hãy kiểm tra Cloud Console để xem kết quả.

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

7d1eed2e4728a4f2.pngS

Nhấp vào thẻ Bản sửa đổi. Bạn sẽ thấy hai 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 còn 1.

217185c0ecpc87dd.png.]

4ad481b8bcd0343d.png.

Mặc dù cấu hình đó là đủ để thử nghiệm, nhưng trong hầu hết các tình huống sản xuất, bạn sẽ 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ô hình đồ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 mặc định là 80 hoặc 0, điều này sẽ loại bỏ mọi hạn chế đồng thời và đặt giá trị đó thành mức tối đa mặc định (xảy ra 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ô hình đồng thời quay lại 80.

7. Thực hiện thay đổi đối với trang web

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

Có vẻ như một trong những nhà phát triển của bạn đã tạo các thay đổi này bằng tên tệp index.js.new. Bạn chỉ cần sao chép tệp đó vào index.js là các thay đổi của bạn sẽ được phản ánh. Hãy 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 đúng tên tệp 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 cần xây dựng ứ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 monolith:

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

Bây giờ, mã của bạn đã được cập nhật, bạn cần xây dựng lại vùng chứa Docker và xuất bản vùng chứa đó lên Container Registry. Bạn có thể sử dụng lệnh tương tự như trước đó, ngoại trừ 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 Cloud Build mới với phiên bản hình ảnh đã cập nhật 2.0.0:

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ẽ dùng hình ảnh đó để cập nhật ứng dụng mà không bị ngừng hoạt động.

8. Cập nhật trang web mà không bị ngừng hoạt động

Các thay đổi đã hoàn tất và đội ngũ tiếp thị rất hài lòng với nội dung cập nhật của bạn! Đã đến lúc 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, sau đó sẽ được đưa trực tuyến đến lưu lượng truy cập được chuyển hướng đến đó.

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

Dòng lệnh

Từ 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 hình ảnh mới nhất đượ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à để ý rằng tên ứ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 địa chỉ IP:

gcloud run services list

Bây giờ, 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ủ!

451ca252acae6928.pngS

9. Dọn dẹp

Xoá các 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

10. Xin chúc mừng

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