1. Trước khi bắt đầu
Việc chạy trang web có thể gặp khó khăn do 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, Vùng chứa, dịch vụ, v.v. Điều này không sao đối với các ứng dụng lớn hơn, nhiều cấp, nhưng nếu bạn chỉ muốn triển khai và hiển thị trang web của mình, thì đó là một chi phí hao tổn lớn.
Với Cloud Run, cách triển khai 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 cần tốn thêm chi phí cho các hoạt động triển khai dựa trên máy ảo hoặc Kubernetes. Đây không chỉ là phương pháp đơn giản hơn từ góc độ quản lý mà còn giúp bạn có thể mở rộng quy mô về 0 khi không có yêu cầu nào đến trang web của bạn.
Trong lớp học lập trình này, bạn 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.
Điều kiện tiên quyết
- Có kiến thức chung về Docker (Xem phần Bắt đầu trên trang web của Docker.)
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ý các bản 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
- Một trang web tĩnh chạy bên trong vùng chứa Docker
- Phiên bản của vùng chứa này nằm trong Kho lưu trữ vùng chứa
- Một bản triển khai Cloud Run cho trang web tĩnh
Bạn cần có
- 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 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ẽ được tự động điền trong tên dự án. Mã dự án là một tên duy nhấ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, biế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ụ. .
Tìm "Cloud Run API", sau đó nhấp vào Cloud Run API > Bật.
Việc tham gia lớp học lập trình này sẽ không tố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 Giá.
Người dùng mới của Google Cloud đủ điều kiện dùng thử miễn phí 300 đô la.
Cloud Shell
Mặc dù có thể điều khiển 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 được định cấu hình sẵn với tất 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 tải sẵn tất cả các công cụ phát triển mà bạn cần. Ứng dụng này cung cấp một thư mục gốc 5 GB ổn định và chạy trong Google Cloud, giúp cải thiện đáng kể hiệu suất mạng và xác thực. Điều này có nghĩa là tất cả những gì bạn cần cho lớp học lập trình này là một trình duyệt (có, trình duyệt này hoạt động trên Chromebook).
- Để kích hoạt Cloud Shell từ Cloud Console, bạn chỉ cần nhấp vào Kích hoạt Cloud Shell (quá trình cấp phép và kết nối với môi trường sẽ chỉ mất vài phút).
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ả của lệnh
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
Kết quả của lệnh
[core] project = <PROJECT_ID>
Nếu vì lý do nào đó mà dự án không được đặt, 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 mà bạn đã sử dụng trong các bước thiết lập hoặc tra cứu mã nhận dạng đó trong trang tổng quan của Cloud Console:
Theo mặc định, Cloud Shell cũng đặt một số biến môi trường. 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
Kết quả của lệnh
<PROJECT_ID>
- Cuối cùng, hãy đặt múi giờ mặc định và cấu hình dự án.
gcloud config set compute/zone us-central1-f
Bạn có thể chọn nhiều múi giờ. Để biết thêm thông tin, hãy xem phần Khu vực và vùng.
3. Sao chép kho lưu trữ nguồn
Vì đang triển khai một trang web hiện có, nên bạn chỉ cần nhân bản nguồn từ kho lưu trữ để 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 phiên bản Cloud Shell và thay đổi thành 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. Quá trình chạy tập lệnh có thể mất vài phút.
Hãy kiểm tra kỹ lưỡng và kiểm thử ứng dụng của bạn. 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 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ổ 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 đã sẵn sàng, đã đến lúc bạn phải Dockerize ứng dụng!
Thông thường, bạn phải thực hiện phương pháp hai bước bao gồm việc 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ẽ lấy. Tuy nhiên, bạn có thể dễ dàng 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 bằng một lệnh duy nhất! Để xem quy trình thủ công tạo và đẩy Dockerfile, hãy xem phầ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 đó sang một bộ chứa trên Cloud Storage. Sau đó, quá trình xây dựng sẽ lấy tất cả tệp từ bộ chứa và sử dụng Dockerfile có trong cùng thư mục để chạy quá 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 vào Kho lưu trữ vùng chứa.
Trước tiên, bạn cần đảm bảo rằng bạn đã bật API Cloud Build. 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 quá trình tạo bản 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, bạn sẽ thấy kết quả trong dòng lệnh 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ể 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 đó, nhưng chỉ có một 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ả kết quả nhật ký. Bạn có thể xem hình ảnh vùng chứa đã tạo bằng cách nhấp vào đường liên kết bên cạnh Hình ảnh.
5. Triển khai vùng chứa lên Cloud Run
Giờ đây, bạn đã đóng gói trang web của mình và đẩy trang web đó vào Container Registry, đã đến lúc triển khai trang web đó trên Cloud Run!
Có hai phương pháp để triển khai lên 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ẽ 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 đưa các cụm và Vùng chứa 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:
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).
Để thử nghiệm, hãy cho phép các yêu cầu chưa xác thực truy cập vào ứng dụng. Nhập y
vào lời nhắc.
Xác minh quá trình triển khai
Để xác minh rằng bạn đã tạo thành công bản triển khai, 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ý toàn diệ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ố điều. Bạn có thể thấy bản triển khai của mình, cũng như người dùng đã triển khai bản 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 và bạn sẽ thấy chính trang web mà bạn đã xem trước trên máy.
6. Tạo bản sửa đổi mới có mức độ đồng thời thấp hơn
Bây giờ, hãy triển khai lại ứng dụng, nhưng lần này hãy điều chỉnh một trong các tham số.
Theo mặc định, ứng dụng Cloud Run sẽ có giá trị đồng thời là 80, nghĩa là mỗi thực thể vùng chứa sẽ phân phát tối đa 80 yêu cầu cùng một lúc. Đó là một sự khác biệt lớn so với mô hình hàm dưới dạng dịch vụ (FaaS), trong đó mỗi thực thể 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 có giá trị đồng thời là 1 (chỉ dành 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ư bạn đã làm 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 của 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 còn 1.
]
Mặc dù cấu hình đó là đủ để 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 tính năng đồ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. Thao tác này sẽ xoá mọi quy tắc 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 (vào thời điểm viết bài này là 80).
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à số lượng đồng thời đã trở lại 80.
7. Chỉnh sửa trang web
Nhóm tiếp thị của bạn yêu cầu bạn thay đổi trang chủ của trang web công ty. Họ cho rằng trang web đó 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ủ để làm hài lòng nhóm tiếp thị!
Có vẻ như một trong các nhà phát triển của bạn đã tạo các thay đổi với 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 sẽ được phản ánh. Làm theo hướng dẫn để thực hiện các thay đổi thích 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 & 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 monolith:
cd ~/monolith-to-microservices/react-app npm run build:monolith
Giờ đây, khi mã đã được cập nhật, bạn cần tạo lại vùng chứa Docker và phát hành vùng chứa đó lên Container Registry. Bạn có thể sử dụng cùng một lệnh 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 một bản dựng trên Google Cloud mới có phiên bản hình ảnh cập nhật là 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ẽ sử dụng hình ảnh đó để cập nhật ứng dụng mà không bị gián đoạn.
8. Cập nhật trang web mà không có thời gian ngừng hoạt động
Chúng tôi đã hoàn tất các thay đổi và nhóm 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ần triển khai là một bản sửa đổi mới. Bản sửa đổi này sẽ được đưa lên mạ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
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 truy cập lại URL bên ngoài của dịch vụ Cloud Run và bạn sẽ thấy tiêu đề ứng dụng đã đượ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ủ!
9. Dọn dẹp
Xoá hình ảnh trong Registry vùng chứa
# 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 bằng Cloud Run.