Phát triển sản phẩm trong 3 bước đơn giản nhờ Cloud Run

1. Giới thiệu

Tại sao việc quản lý ứng dụng lại khó khăn đến vậy?

Một lý do lớn là các nhà phát triển thường phải là quản trị viên hệ thống bán thời gian. Hãy xem xét danh sách (một phần) các mối lo ngại này để phát triển, triển khai và quản lý một ứng dụng web hiện đại ở cấp độ sản xuất :

4d018476b4a73b47.png

Tôi không biết bạn thế nào, nhưng đây là tất cả những điều tôi không muốn lo lắng! Điều tôi thực sự muốn nghĩ đến là logic ứng dụng của mình:

6dfd143d20e5548b.png

Nói tóm lại, Cloud Run là một nền tảng giúp bạn tập trung vào ứng dụng của mình, còn mọi hoạt động quản trị và bảo trì sẽ do người khác đảm nhận, cụ thể là Google. Google đã đầu tư hàng triệu giờ để tinh chỉnh và hoàn thiện các kỹ năng của mình trong lĩnh vực này.

Ngoài những thách thức về quản trị nêu trên, bạn cũng phải đối mặt với:

  • Phần phụ thuộc – Môi trường mà ứng dụng của bạn chạy phải khớp chính xác với môi trường mà ứng dụng đã được kiểm thử (nếu có thể). Điều này có thể bao gồm nhiều khía cạnh, bao gồm hệ điều hành, thư viện hỗ trợ, trình thông dịch hoặc trình biên dịch ngôn ngữ, cấu hình phần cứng và nhiều yếu tố khác.
  • Phân phối – Việc chuyển từ một phiên bản cục bộ của ứng dụng sang một phiên bản được chia sẻ rộng rãi trên Internet thường đòi hỏi phải thay đổi môi trường thời gian chạy, một bước nhảy vọt về độ phức tạp và một đường cong học tập dốc.

Cloud Run sẽ xử lý những vấn đề này và nhiều vấn đề khác cho bạn. Thay vì chỉ nghe lời tôi, hãy cùng nhau tạo một ứng dụng và xem việc chuyển đổi từ môi trường phát triển cục bộ sang một ứng dụng đám mây cấp sản xuất chỉ qua vài bước đơn giản dễ dàng như thế nào.

Những việc bạn sẽ làm...

  • Bạn sẽ tạo một ứng dụng web đơn giản và xác minh rằng ứng dụng đó chạy như mong đợi trong môi trường phát triển của bạn.
  • Sau đó, bạn sẽ chuyển sang phiên bản được chứa trong vùng chứa của cùng một ứng dụng. Trong quá trình này, bạn sẽ khám phá ý nghĩa của việc tạo vùng chứa và lý do khiến việc này rất hữu ích.
  • Cuối cùng, bạn sẽ triển khai ứng dụng lên đám mây và nhận thấy việc quản lý dịch vụ Cloud Run bằng dòng lệnh và Google Cloud Console rất dễ dàng.

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

  • Cách tạo một ứng dụng máy chủ web đơn giản bằng Python
  • Cách đóng gói ứng dụng vào một vùng chứa Docker có thể chạy ở mọi nơi
  • Cách triển khai ứng dụng lên đám mây để mọi người có thể dùng thử sản phẩm mới của bạn
  • Cách đơn giản hoá hơn nữa các bước trên bằng Buildpack
  • Cách sử dụng công cụ dòng lệnh Google Cloud và giao diện người dùng web Cloud Console

Những thứ bạn cần...

  • Trình duyệt web
  • Tài khoản Google

Lớp học này dành cho nhà phát triển ở mọi cấp độ, kể cả người mới bắt đầu. Mặc dù sẽ sử dụng Python, nhưng bạn không cần phải quen thuộc với lập trình Python để hiểu những gì đang diễn ra vì chúng tôi sẽ giải thích tất cả mã mà bạn sử dụng.

2. Bắt đầu thiết lập

5110b5081a1e1c49.png

Phần này trình bày mọi việc bạn cần làm để bắt đầu với lớp học này.

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

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Hãy nhớ mã dự án, một tên duy nhất trên 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.

  1. 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 nhiều chi phí, nếu có. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" để biết cách tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi 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í trị giá 300 USD.

Khởi động Cloud Shell

Trong phòng thí nghiệm này, bạn sẽ làm việc trong một phiên Cloud Shell. Đây là một trình thông dịch lệnh do một máy ảo chạy trong đám mây của Google lưu trữ. Bạn có thể dễ dàng chạy phần này trên máy tính của mình, nhưng việc sử dụng Cloud Shell sẽ giúp mọi người có được trải nghiệm có thể tái tạo trong một môi trường nhất quán. Sau khi hoàn thành bài thực hành, bạn có thể thử lại phần này trên máy tính của mình.

704a7b7491bd157.png

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell 4292cbf4971c9786.png.

bce75f34b2c53987.png

Nếu chưa từng khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian (bên dưới phần hiển thị đầu tiên) mô tả về Cloud Shell. Nếu vậy, hãy nhấp vào Tiếp tục (và bạn sẽ không bao giờ thấy màn hình này nữa). Sau đây là giao diện của màn hình xuất hiện một lần:

70f315d7b402b476.png

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

fbe3a0674c982259.png

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc trong lớp học lập trình này chỉ bằng một trình duyệt hoặc Chromebook.

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 mã dự án của bạn.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Đầu ra của lệnh

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Nếu không, bạn có thể đặt nó bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Đầu ra của lệnh

Updated property [core/project].

Đặt một số biến môi trường trong thiết bị đầu cuối để giúp bạn dễ dàng thực hiện các bước tiếp theo:

export PROJ=$GOOGLE_CLOUD_PROJECT 
export APP=hello 
export PORT=8080
export REGION="us-central1"
export TAG="gcr.io/$PROJ/$APP"

Bật các API

Trong các bước sau, bạn sẽ thấy nơi cần đến các dịch vụ này (và lý do), nhưng hiện tại, hãy chạy lệnh này để cấp cho dự án của bạn quyền truy cập vào các dịch vụ Cloud Build, Container Registry và Cloud Run:

gcloud services enable cloudbuild.googleapis.com         \
                       containerregistry.googleapis.com  \
                       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. Tạo một ứng dụng web đơn giản

eef530b56b8e93a3.png

Bắt đầu bằng cách nhấp vào nút Open Editor ở đầu bảng điều khiển Cloud Shell. Thông báo sẽ có dạng như sau:

9b81c8a37a6bcdd8.png

Sau đó, bạn sẽ thấy mình đang ở trong một môi trường IDE tương tự như Visual Studio Code, trong đó bạn có thể tạo dự án, chỉnh sửa mã nguồn, chạy chương trình, v.v. Nếu màn hình quá chật, bạn có thể mở rộng hoặc thu hẹp đường phân chia giữa bảng điều khiển và cửa sổ chỉnh sửa/thiết bị đầu cuối bằng cách kéo thanh ngang giữa hai vùng đó, được đánh dấu ở đây:

8dea35450851af53.png

Bạn có thể chuyển đổi qua lại giữa Trình chỉnh sửa và Thiết bị đầu cuối bằng cách nhấp vào nút Open EditorOpen Terminal tương ứng. Bây giờ, hãy thử chuyển đổi qua lại giữa hai môi trường này.

Tiếp theo, hãy tạo một thư mục để lưu trữ công việc của bạn cho lớp học này bằng cách chọn File->New Folder (Tệp->Thư mục mới), nhập hello rồi nhấp vào OK. Tất cả các tệp bạn tạo trong lớp học này và mọi công việc bạn thực hiện trong Cloud Shell sẽ diễn ra trong thư mục này.

Bây giờ, hãy tạo một tệp requirements.txt. Thao tác này cho Python biết ứng dụng của bạn phụ thuộc vào thư viện nào. Đối với ứng dụng web đơn giản này, bạn sẽ sử dụng một mô-đun Python phổ biến để tạo máy chủ web có tên là Flask và một khung máy chủ web có tên là gunicorn. Trong cửa sổ Cloud Editor, hãy nhấp vào trình đơn File->New File (Tệp->Tệp mới) để tạo một tệp mới. Khi được nhắc nhập tên tệp mới, hãy nhập requirements.txt rồi nhấn nút OK. Đảm bảo tệp mới nằm trong thư mục dự án hello.

Nhập các dòng sau vào tệp mới để chỉ định rằng ứng dụng của bạn phụ thuộc vào gói Flask của Python và máy chủ web gunicorn.

Flask
gunicorn

Bạn không cần lưu tệp này một cách rõ ràng vì Cloud Editor sẽ tự động lưu các thay đổi cho bạn.

Phiên bản 1: Xin chào thế giới!

Bằng cách sử dụng cùng một kỹ thuật, hãy tạo một tệp mới khác có tên là main.py. Đây sẽ là tệp nguồn Python chính (và duy nhất) của ứng dụng. Một lần nữa, hãy đảm bảo tệp mới nằm trong thư mục dự án hello.

Chèn mã sau đây vào tệp này:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from the environment.

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
@app.route("/", methods=["GET"])
def say_hello():
    html = "<h1>Hello world!</h1>"
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Chuyển lại sang cửa sổ dòng lệnh và chuyển sang thư mục dự án bằng lệnh sau:

cd hello

Chạy lệnh sau để cài đặt các phần phụ thuộc của dự án:

pip3 install -r requirements.txt

Bây giờ, hãy chạy ứng dụng bằng cách chạy lệnh này trong cửa sổ dòng lệnh:

python3 main.py

Tại thời điểm này, ứng dụng của bạn đang chạy trên máy ảo dành riêng cho phiên cloud shell. Cloud Shell có một cơ chế proxy cho phép bạn truy cập vào các máy chủ web (chẳng hạn như máy chủ bạn vừa khởi động) đang chạy trên máy ảo của bạn từ mọi nơi trên Internet toàn cầu.

Nhấp vào nút web preview rồi nhấp vào mục Preview on Port 8080 trong trình đơn như sau:

fe45e0192080efd6.png

Thao tác này sẽ mở một thẻ trình duyệt web cho ứng dụng đang chạy của bạn. Ứng dụng này sẽ có dạng như sau:

b1f06501509aefb9.png

Phiên bản 2: Phản hồi Đường dẫn URL

Quay lại Cloud Editor (thông qua nút Open Editor) và thêm chế độ hỗ trợ phản hồi một hậu tố URL không bắt buộc bằng cách cập nhật tệp main.py như sau:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])     # ← NEW
def say_hello(name="world"):               # ← MODIFIED
    html = f"<h1>Hello {name}!</h1>"       # ← MODIFIED
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Chuyển về Terminal (Thiết bị đầu cuối) (thông qua nút Open Terminal) rồi nhập control-C (nhấn và giữ phím control trong khi nhấn "C") để dừng ứng dụng đang chạy, sau đó khởi động lại ứng dụng bằng cách nhập:

python3 main.py

Một lần nữa, hãy nhấp vào nút web preview rồi nhấp vào mục trình đơn Preview on Port 8080 để mở một thẻ trình duyệt web cho ứng dụng đang chạy của bạn. Bạn sẽ thấy lại thông báo "Xin chào thế giới!" nhưng giờ đây, hãy thay thế văn bản URL sau ký tự dấu gạch chéo bằng bất kỳ chuỗi nào bạn chọn (ví dụ: /your-name) và xác minh rằng bạn thấy nội dung như sau:

93b87996f88fa370.png

Phiên bản 3: Màu ngẫu nhiên

Giờ đây, hãy thêm tính năng hỗ trợ màu nền ngẫu nhiên bằng cách quay lại Cloud Editor (thông qua nút Open Editor) và cập nhật tệp main.py như sau:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from the environment.

# This function decides whether foreground text should be
# displayed in black or white, to maximize fg/bg contrast.
def set_text_color(rgb):                      # ← NEW
    sum = round(                              # ← NEW
        (int(rgb[0]) * 0.299)                 # ← NEW
        + (int(rgb[1]) * 0.587)               # ← NEW
        + (int(rgb[2]) * 0.114)               # ← NEW
    )                                         # ← NEW
    return "black" if sum > 186 else "white"  # ← NEW


# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
# To verify each new invocation of these requests, the HTML document
# includes CSS styling to produce a randomly colored background.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])
def say_hello(name="world"):
    bg = random.sample(range(1, 255), 3)                       # ← NEW
    hex = (int(bg[0]) * 256) + (int(bg[1]) * 16) + int(bg[2])  # ← NEW
    fg_color = set_text_color(bg)                              # ← NEW
    bg_color = f"#{hex:06x}"                                   # ← NEW
    style = f"color:{fg_color}; background-color:{bg_color}"   # ← NEW
    html = f'<h1 style="{style}">Hello {name}!</h1>'           # ← MODIFIED
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Chuyển về Terminal (Thiết bị đầu cuối) (thông qua nút Open Terminal) rồi nhập control-C (nhấn và giữ phím control trong khi nhấn "C") để dừng ứng dụng đang chạy, sau đó khởi động lại ứng dụng bằng cách nhập:

python3 main.py

Một lần nữa, hãy nhấp vào nút web preview rồi nhấp vào mục trình đơn Preview on Port 8080 để mở một thẻ trình duyệt web cho ứng dụng đang chạy của bạn. Bạn sẽ thấy văn bản đã tạo, có bất kỳ hậu tố nào được chỉ định hoặc chuỗi "Hello world!" mặc định, xuất hiện trước một nền có màu ngẫu nhiên, như sau:

baf8d028f15ea7f4.png

Tải lại trang vài lần để thấy màu nền ngẫu nhiên thay đổi mỗi khi bạn truy cập vào ứng dụng.

Như vậy là ứng dụng của bạn đã hoàn tất. Xin chúc mừng! Trong bước tiếp theo, bạn sẽ tìm hiểu cách đóng gói ứng dụng vào một vùng chứa và lý do đây là một việc hữu ích.

4. Đóng gói ứng dụng của bạn vào vùng chứa

17cc234ec3325a8a.png

Vùng chứa là gì?

Nhìn chung, các vùng chứa và đặc biệt là Docker, cho phép chúng ta tạo một hộp mô-đun để chạy một ứng dụng với tất cả các phần phụ thuộc được kết hợp với nhau. Chúng tôi gọi kết quả này là hình ảnh vùng chứa. Trong phần này, bạn sẽ tạo một hình ảnh vùng chứa. Hình ảnh này sẽ được dùng để đóng gói ứng dụng và tất cả các phần phụ thuộc của ứng dụng.

Nói về các phần phụ thuộc, trong bước trước, khi chạy ứng dụng trong môi trường nhà phát triển, bạn phải chạy pip3 install -r requirements.txt và đảm bảo rằng tệp requirements.txt chứa tất cả các thư viện phụ thuộc và phiên bản tương ứng. Với các vùng chứa, bạn sẽ cài đặt những yêu cầu đó khi tạo hình ảnh vùng chứa, vì vậy người dùng vùng chứa không cần lo lắng về việc cài đặt bất cứ thứ gì.

Hình ảnh vùng chứa này sẽ tạo thành thành phần cơ bản để triển khai ứng dụng của bạn trên Cloud Run. Vì có thể sử dụng vùng chứa trên hầu hết mọi máy chủ ảo hoặc máy chủ thực, nên vùng chứa giúp chúng ta triển khai ứng dụng của bạn ở bất cứ đâu bạn muốn, cũng như di chuyển ứng dụng của bạn từ nhà cung cấp dịch vụ này sang nhà cung cấp dịch vụ khác hoặc từ cơ sở hạ tầng tại chỗ lên Đám mây.

Vùng chứa giúp ứng dụng của bạn:

  • có thể tái tạo – các vùng chứa độc lập và hoàn chỉnh
  • di động – vùng chứa là các thành phần đa ngành, cho phép khả năng có thể di chuyển của ứng dụng trên các nhà cung cấp dịch vụ đám mây và môi trường

Nói tóm lại, cuối cùng thì các vùng chứa cũng có thể "viết một lần và chạy ở mọi nơi". Một trường hợp ngoại lệ đối với quy tắc đó là vùng chứa được tạo bị hạn chế chạy trên loại bộ xử lý mà bạn đã tạo, nhưng cũng có những cách để tạo các phiên bản vùng chứa cho các cấu hình phần cứng khác.

Đủ rồi, hãy tạo một vùng chứa! Bạn sẽ sử dụng một công nghệ cụ thể để tạo vùng chứa có tên là Docker.

Trong Cloud Editor, hãy tạo một tệp mới có tên là Dockerfile. Tệp này là bản thiết kế để tạo hình ảnh. Tệp này cho Docker biết về môi trường hoạt động và mã nguồn của bạn, cách cài đặt các phần phụ thuộc, cách tạo ứng dụng và cách chạy mã.

# Use an official lightweight Python image.
FROM python:3.9-slim

# Copy local code to the container image.
WORKDIR /app
COPY main.py .
COPY requirements.txt .

# Install dependencies into this container so there's no need to 
# install anything at container run time.
RUN pip install -r requirements.txt

# Service must listen to $PORT environment variable.
# This default value facilitates local development.
ENV PORT 8080

# Run the web service on container startup. Here you use the gunicorn
# server, with one worker process and 8 threads. For environments 
# with multiple CPU cores, increase the number of workers to match 
# the number of cores available.
CMD exec gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 main:app

Trong Cloud Terminal, hãy tạo hình ảnh vùng chứa bằng Cloud Build bằng cách chạy lệnh sau:

gcloud builds submit --tag $TAG

Sau khi đẩy vào sổ đăng ký, bạn sẽ thấy một thông báo SUCCESS chứa tên hình ảnh, có dạng như sau: gcr.io/<project-id>/hello. Giờ đây, hình ảnh này được lưu trữ trong Google Container Registry và bạn có thể sử dụng lại bất cứ lúc nào và ở bất cứ đâu bạn 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

Giờ đây, hãy chạy và kiểm thử ứng dụng cục bộ từ Cloud Shell bằng cách sử dụng các lệnh docker sau:

docker run -p $PORT:$PORT -e PORT=$PORT $TAG

Lựa chọn -p $PORT:$PORT cho Docker biết rằng bạn muốn ánh xạ cổng bên ngoài $PORT (được đặt thành 8080 ở trên) trong môi trường máy chủ lưu trữ vào cùng một số cổng bên trong vùng chứa đang chạy. Điều này giúp bạn dễ dàng hơn vì mã máy chủ mà bạn viết và số cổng bên ngoài mà bạn kết nối khi kiểm thử ứng dụng sẽ giống nhau (8080), nhưng bạn cũng có thể dễ dàng sử dụng tuỳ chọn -p để ánh xạ bất kỳ cổng bên ngoài tuỳ ý nào trên máy chủ lưu trữ đến bất kỳ cổng nội bộ nào bạn muốn bên trong vùng chứa.

Lựa chọn -e PORT=$PORT yêu cầu Docker cung cấp biến môi trường $PORT (được đặt thành 8080 ở trên) cho ứng dụng của bạn đang chạy bên trong vùng chứa.

Giờ đây, bạn đã sẵn sàng kiểm thử ứng dụng bằng cách trỏ một trình duyệt web đến mã Python đang chạy bên trong vùng chứa. Trong cửa sổ Cloud Shell, hãy nhấp vào biểu tượng "Xem trước trên web" rồi chọn "Xem trước trên cổng 8080" như bạn đã làm ở bước trước.

Kết quả sẽ quen thuộc – bạn sẽ thấy văn bản đã tạo ở phía trước một nền có màu ngẫu nhiên, giống như khi bạn chạy ứng dụng trực tiếp trong thiết bị đầu cuối Cloud Shell. Tải lại trang vài lần để thấy màu nền ngẫu nhiên thay đổi mỗi khi bạn truy cập vào ứng dụng.

Xin chúc mừng! Giờ đây, bạn đã chạy một phiên bản ứng dụng được chứa trong vùng chứa. Trong phần tiếp theo, bạn sẽ biến hình ảnh vùng chứa thành một ứng dụng web có chất lượng sản xuất mà không cần chỉnh sửa một dòng mã nào.

5. Lên đám mây...

1b0665d94750ded6.gif

Giờ đây, khi đã tạo vùng chứa cho ứng dụng, bạn sẽ muốn chia sẻ thành quả này với mọi người trên thế giới. Vì vậy, đã đến lúc triển khai ứng dụng lên Cloud. Nhưng bạn muốn làm nhiều việc hơn là chỉ chia sẻ. Bạn cần đảm bảo rằng:

  • chạy một cách đáng tin cậy – bạn sẽ tự động có khả năng chịu lỗi trong trường hợp máy tính chạy ứng dụng của bạn gặp sự cố
  • tự động điều chỉnh quy mô – ứng dụng của bạn sẽ theo kịp lưu lượng truy cập ở mức độ lớn và tự động giảm mức sử dụng khi không dùng đến
  • giảm thiểu chi phí của bạn bằng cách không tính phí cho những tài nguyên mà bạn không sử dụng – bạn chỉ bị tính phí cho những tài nguyên được sử dụng trong khi phản hồi lưu lượng truy cập
  • có thể truy cập thông qua một tên miền tuỳ chỉnh – bạn có thể sử dụng giải pháp một lần nhấp để chỉ định một tên miền tuỳ chỉnh cho dịch vụ của mình
  • cung cấp thời gian phản hồi tuyệt vời – khởi động nguội có khả năng phản hồi hợp lý nhưng bạn có thể tinh chỉnh điều đó bằng cách chỉ định cấu hình số phiên bản tối thiểu
  • hỗ trợ mã hoá đầu cuối bằng cách sử dụng tính năng bảo mật web SSL/TLS tiêu chuẩn – khi triển khai một dịch vụ, bạn sẽ nhận được tính năng mã hoá web tiêu chuẩn và các chứng chỉ bắt buộc tương ứng, miễn phí và tự động

Khi triển khai ứng dụng lên Google Cloud Run, bạn sẽ nhận được tất cả những lợi ích nêu trên và nhiều lợi ích khác.

Triển khai ứng dụng lên Cloud Run

Trước tiên, hãy sửa đổi ứng dụng để bạn có thể phân biệt bản sửa đổi mới với bản sửa đổi cũ. Hãy làm việc đó bằng cách sửa đổi tệp main.py sao cho thông báo mặc định thay đổi từ "Hello world!" thành "Hello from Cloud Run!". Nói cách khác, hãy thay đổi dòng này trong main.py từ:

def say_hello(name="world"):

thành:

def say_hello(name="from Cloud Run"):

Cloud Run là dịch vụ theo khu vực, tức là cơ sở hạ tầng chạy các dịch vụ Cloud Run của bạn nằm ở một khu vực cụ thể và do Google quản lý để có thể hoạt động dư thừa trên tất cả các vùng trong khu vực đó. Trong phần "Thiết lập" ở trên, bạn đã xác định một khu vực mặc định thông qua biến môi trường REGION.

Tạo lại hình ảnh vùng chứa và triển khai ứng dụng được đóng gói vào vùng chứa lên Cloud Run bằng lệnh sau:

gcloud builds submit --tag $TAG
gcloud run deploy "$APP"   \
  --image "$TAG"           \
  --platform "managed"     \
  --region "$REGION"       \
  --allow-unauthenticated
  • Bạn cũng có thể xác định một khu vực mặc định bằng gcloud config set run/region $REGION.
  • Lựa chọn --allow-unauthenticated giúp cung cấp dịch vụ công khai. Để tránh các yêu cầu chưa được xác thực, hãy dùng --no-allow-unauthenticated.

Hình ảnh được chỉ định ở đây là hình ảnh docker mà bạn đã tạo ở bước cuối cùng. Nhờ dịch vụ Cloud Build (lưu trữ hình ảnh kết quả trong Google Container Registry), dịch vụ Cloud Run có thể tìm thấy và triển khai hình ảnh đó cho bạn.

Đợi vài phút cho đến khi quá trình triển khai hoàn tất. Khi thành công, dòng lệnh sẽ hiển thị URL của dịch vụ:

Deploying container to Cloud Run service [hello] in project [PROJECT_ID...
✓ Deploying new service... Done.                                   
  ✓ Creating Revision... Revision deployment finished. Waiting for health check...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [hello] revision [hello-...] has been deployed and is serving 100 percent of traffic.
Service URL: https://hello-....a.run.app

Bạn cũng có thể truy xuất URL dịch vụ bằng lệnh sau:

gcloud run services describe hello  \
  --platform managed                \
  --region $REGION                  \
  --format "value(status.url)"

Thao tác này sẽ hiển thị nội dung như sau:

https://hello-....a.run.app

Đường liên kết này là một URL chuyên dụng, có bảo mật TLS, dành cho dịch vụ Cloud Run của bạn. Đường liên kết này là đường liên kết cố định (miễn là bạn không tắt dịch vụ) và có thể sử dụng ở bất kỳ đâu trên Internet. Công cụ này không sử dụng cơ chế proxy của Cloud Shell như đã đề cập trước đó (cơ chế này phụ thuộc vào một máy ảo tạm thời).

Nhấp vào Service URL được đánh dấu để mở một thẻ trình duyệt web cho ứng dụng đang chạy của bạn. Kết quả sẽ hiển thị thông báo "Xin chào từ Cloud Run!" trước một nền có màu ngẫu nhiên.

Xin chúc mừng! Ứng dụng của bạn hiện đang chạy trên Đám mây của Google. Không cần phải suy nghĩ, ứng dụng của bạn sẽ được cung cấp công khai, có mã hoá TLS (HTTPS) và khả năng tự động cấp tài nguyên bổ sung đến mức lưu lượng truy cập đáng kinh ngạc.

Nhưng tôi nghĩ quy trình này có thể còn đơn giản hơn nữa...

6. Tự động tạo vùng chứa

Tất cả những điều này đều khá thú vị, nhưng nếu tôi không muốn nghĩ đến Dockerfile và vùng chứa thì sao? Điều gì sẽ xảy ra nếu, giống như hầu hết các nhà phát triển, tôi chỉ muốn tập trung vào việc viết mã xử lý ứng dụng và để người khác lo lắng về việc tạo vùng chứa cho ứng dụng đó. Thật may mắn là Cloud Run hỗ trợ một tiêu chuẩn nguồn mở có tên là Buildpacks. Tiêu chuẩn này được tạo ra chính vì lý do này: tự động hoá quy trình sản xuất một vùng chứa từ một tập hợp các tệp nguồn.

Xin lưu ý rằng trong một số trường hợp, nhà phát triển có thể muốn sử dụng một Dockerfile rõ ràng, chẳng hạn như nếu họ muốn tuỳ chỉnh ở mức độ cao cách tạo vùng chứa của mình. Nhưng đối với những trường hợp phổ biến như bài tập này, buildpack hoạt động hiệu quả và tránh được nhu cầu tạo Dockerfile theo cách thủ công. Hãy sửa đổi mã của bạn để sử dụng buildpack.

Trước tiên, hãy sửa đổi ứng dụng để bạn có thể phân biệt bản sửa đổi mới với bản sửa đổi cũ. Hãy làm như vậy bằng cách sửa đổi tệp main.py để thông báo mặc định thay đổi từ "Xin chào từ Cloud Run!" thành "Xin chào từ Cloud Run với Buildpack!". Nói cách khác, hãy thay đổi dòng này trong main.py từ:

def say_hello(name="from Cloud Run"):

thành:

def say_hello(name="from Cloud Run with Buildpacks"):

Bây giờ, hãy tận dụng buildpack bằng cách tạo một tệp mới có tên Procfile. Hãy tạo tệp đó trong Cloud Editor và chèn dòng văn bản này:

web: python3 main.py

Thao tác này cho hệ thống buildback biết cách chạy ứng dụng của bạn trong vùng chứa được tạo tự động. Với hướng dẫn này, bạn thậm chí không cần Dockerfile nữa. Để xác minh điều này, hãy xoá Dockerfile rồi chạy lệnh sau trong Cloud Shell Terminal:

gcloud beta run deploy "$APP"  \
    --source .                 \
    --platform "managed"       \
    --region "$REGION"         \
    --allow-unauthenticated

Lệnh này tương tự như lệnh bạn đã chạy để triển khai ứng dụng ở bước cuối cùng, nhưng lần này bạn đã thay thế lựa chọn --image bằng lựa chọn --source .. Lệnh này cho biết lệnh gcloud mà bạn muốn dùng buildpack để tạo hình ảnh vùng chứa, dựa trên các tệp nguồn mà lệnh này tìm thấy trong thư mục hiện tại (dot trong --source . là viết tắt của thư mục hiện tại). Vì dịch vụ này sẽ xử lý ngầm hình ảnh vùng chứa, nên bạn không cần chỉ định hình ảnh cho lệnh gcloud này.

Một lần nữa, hãy xác minh rằng quá trình triển khai này đã hoạt động bằng cách nhấp vào Service URL được đánh dấu để mở một thẻ trình duyệt web cho ứng dụng đang chạy của bạn và đảm bảo rằng dịch vụ của bạn đang hiển thị "Hello from Cloud Run with Buildpacks!" (Xin chào từ Cloud Run với Buildpacks!) trước một nền có màu ngẫu nhiên.

Xin lưu ý rằng bằng cách sử dụng buildpack để sản xuất Dockerfile, về cơ bản, bạn đã giảm 3 bước đơn giản xuống còn 2 bước:

  1. Tạo một ứng dụng trong môi trường phát triển của bạn.
  2. Triển khai chính xác cùng một mã lên đám mây chỉ bằng một lệnh.

7. Tôi có bắt buộc phải sử dụng dòng lệnh không?

Không! Giống như hầu hết mọi dịch vụ của Google Cloud, có 3 cách để tương tác với Cloud Run:

  • Công cụ dòng lệnh gcloud mà bạn vừa thấy.
  • Giao diện người dùng web đa dạng thông qua Cloud Console, hỗ trợ kiểu tương tác trỏ và nhấp trực quan.
  • Theo chương trình, bằng cách sử dụng các thư viện ứng dụng của Google có sẵn cho nhiều ngôn ngữ phổ biến, bao gồm Java, C#, Python, Go, Javascript, Ruby, C/C++ và các ngôn ngữ khác.

Hãy triển khai một phiên bản khác của ứng dụng Cloud Run bằng giao diện người dùng bảng điều khiển. Chuyển đến trang đích Cloud Run Service thông qua trình đơn ở trên cùng bên trái:

e2b4983b38c81796.png

Sau đó, bạn sẽ thấy thông tin tóm tắt về các Dịch vụ Cloud Run, chẳng hạn như sau:

b335e7bf0a3af845.png

Nhấp vào đường liên kết "Tạo dịch vụ" để bắt đầu quy trình triển khai:

51f61a8ddc7a4c0b.png

Nhập "hello-again" làm tên dịch vụ, chọn nền tảng và khu vực triển khai mặc định rồi nhấp vào "Tiếp theo".

8a17baa45336c4c9.png

Nhập URL này cho hình ảnh vùng chứa: gcr.io/cloudrun/hello. Đây là một vùng chứa do Google tạo ra cho mục đích kiểm thử. Nhấp vào trình đơn thả xuống "Cài đặt nâng cao" để xem một số trong nhiều chế độ cài đặt cấu hình mà bạn có thể sử dụng. Sau đây là một số điểm bạn có thể tuỳ chỉnh:

  • số cổng và điểm truy cập của vùng chứa (thao tác này sẽ ghi đè điểm truy cập được chỉ định khi tạo vùng chứa)
  • phần cứng: bộ nhớ và số lượng CPU
  • scaling: min and max instances
  • biến môi trường
  • khác: chế độ cài đặt thời gian chờ yêu cầu, số lượng yêu cầu tối đa cho mỗi vùng chứa, HTTP/2

Nhấp vào nút "Tiếp theo" để chuyển sang hộp thoại tiếp theo. Hộp thoại tiếp theo cho phép bạn chỉ định cách kích hoạt dịch vụ. Đối với "Ingress", hãy chọn "allow all traffic" (cho phép tất cả lưu lượng truy cập) và đối với "Authentication" (Xác thực), hãy chọn "Allow unauthenticated traffic" (Cho phép lưu lượng truy cập chưa được xác thực).

e78281d1cff3418.png

Đây là chế độ cài đặt tự do nhất, cho phép mọi người truy cập vào ứng dụng Cloud Run của bạn từ mọi nơi trên Internet công cộng mà không cần chỉ định thông tin xác thực. Bạn có thể muốn cài đặt hạn chế hơn cho ứng dụng của mình, nhưng hãy giữ cho ứng dụng đơn giản trong bài tập học tập này.

Bây giờ, hãy nhấp vào nút Create để tạo dịch vụ Cloud Run. Sau vài giây, bạn sẽ thấy dịch vụ mới xuất hiện trong danh sách tóm tắt các dịch vụ Cloud Run. Dòng tóm tắt cung cấp thông tin về lần triển khai gần đây nhất (ngày/giờ và người triển khai) cùng với một số chế độ cài đặt cấu hình chính. Nhấp vào đường liên kết tên dịch vụ để truy sâu vào chi tiết về dịch vụ mới.

Để xác minh dịch vụ của bạn, hãy nhấp vào URL xuất hiện gần đầu trang tóm tắt như được đánh dấu trong ví dụ bên dưới:

6c35cf0636dddc51.png

Bạn sẽ thấy như sau:

3ba6ab4fe0da1f84.png

Bây giờ, bạn đã triển khai một dịch vụ Cloud Run mới, hãy chọn thẻ REVISIONS để xem một số cách quản lý nhiều hoạt động triển khai.

2351ee7ec4a356f0.png

Để triển khai các bản sửa đổi mới ngay từ bảng điều khiển, bạn có thể nhấp vào nút EDIT & DEPLOY NEW REVISION, như được đánh dấu trong ảnh chụp màn hình ví dụ bên dưới:

a599fa88d00d6776.png

Nhấp vào nút đó ngay bây giờ để tạo một bản sửa đổi mới. Gần URL của vùng chứa, hãy nhấp vào nút SELECT như minh hoạ bên dưới:

5fd1b1f8e1f11d40.png

Trong hộp thoại bật lên, hãy tìm ứng dụng web đơn giản mà bạn đã triển khai từ Cloud Build bằng Buildpack trước đó rồi nhấp vào chọn. Đảm bảo bạn chọn hình ảnh vùng chứa trong phần

gcr.io/<project>/cloud-run-source-deploy

thư mục , như sau:

8a756c6157face3a.png

Sau khi chọn, hãy di chuyển xuống dưới cùng rồi nhấp vào nút DEPLOY. Giờ đây, bạn đã triển khai một bản sửa đổi mới cho ứng dụng của mình. Để xác minh, hãy truy cập lại vào URL dịch vụ của bạn và xác minh rằng bạn hiện đang thấy ứng dụng web "Xin chào từ Cloud Run với Buildpacks!" đầy màu sắc.

Như bạn thấy, thẻ bản sửa đổi cung cấp thông tin tóm tắt về mọi bản sửa đổi mà bạn đã triển khai và giờ đây, bạn sẽ thấy 2 bản sửa đổi cho dịch vụ này. Bạn có thể chọn một bản sửa đổi cụ thể bằng cách nhấp vào nút chọn ở bên trái tên bản sửa đổi. Thao tác này sẽ hiển thị bản tóm tắt thông tin chi tiết về bản sửa đổi ở bên phải màn hình. Khi chọn các nút đó, bạn có thể thấy rằng 2 bản sửa đổi của bạn bắt nguồn từ 2 hình ảnh vùng chứa khác nhau.

Nút MANAGE TRAFFIC cho phép bạn sửa đổi việc phân phối các yêu cầu đến được gửi đến một bản sửa đổi nhất định. Khả năng tinh chỉnh lượng lưu lượng truy cập được gửi đến một bản sửa đổi nhất định cho phép một số trường hợp sử dụng có giá trị:

  • kiểm thử phát hành có chọn lọc một phiên bản mới của ứng dụng với một phần nhỏ lưu lượng truy cập đến
  • chuyển lưu lượng truy cập từ một bản phát hành có vấn đề sang một bản sửa đổi trước đó
  • Thử nghiệm A/B

Tìm nút MANAGE TRAFFIC tại đây:

519d3c22ae028287.png

Định cấu hình mức phân tách lưu lượng truy cập là 50/50 giữa hai bản sửa đổi bằng cách chỉ định mức phân tách lưu lượng truy cập là 50/50 như sau:

8c37d4f115d9ded4.png

Bây giờ, hãy nhấp vào nút LƯU và xác minh tỷ lệ phân chia 50/50 bằng cách truy cập nhiều lần vào URL của dịch vụ và kiểm tra để đảm bảo rằng trung bình một nửa số yêu cầu của bạn được phiên bản hiện tại ("Hello from Cloud Run with Buildpacks!") xử lý và một nửa được phiên bản trước ("It's running!") xử lý.

Các thẻ khác trên trang thông tin chi tiết Dịch vụ cho phép bạn theo dõi hiệu suất, lưu lượng truy cập và nhật ký, từ đó cung cấp thông tin chi tiết có giá trị về mức độ và hiệu quả hoạt động của dịch vụ. Bạn cũng có thể điều chỉnh quyền truy cập vào dịch vụ của mình thông qua thẻ "Quyền". Dành chút thời gian để khám phá các thẻ trên trang này nhằm nắm được những chức năng có sẵn.

Giao diện có lập trình

Như đã lưu ý trước đó, bạn cũng có thể tạo, triển khai và quản lý các dịch vụ Cloud Run theo phương thức lập trình. Đối với các tác vụ thủ công, lựa chọn này nâng cao hơn so với dòng lệnh hoặc bảng điều khiển web, nhưng chắc chắn đây là cách để tự động hoá các dịch vụ Cloud Run. Bạn có thể sử dụng các thư viện ứng dụng Google bằng một số ngôn ngữ lập trình phổ biến.

8. Kiểm thử ứng dụng

198ada162d1f0bf1.png

Trong bước cuối cùng này, bạn sẽ chạy một kiểm thử tải nhân tạo để kiểm thử hiệu suất ứng dụng và xem cách ứng dụng mở rộng quy mô khi có nhu cầu. Bạn sẽ sử dụng một công cụ có tên là hey. Công cụ này được cài đặt sẵn trong Cloud Shell và cho phép chúng ta chạy các kiểm thử tải cũng như trình bày kết quả.

Chạy thử nghiệm

Trong Cloud Shell Terminal, hãy chạy lệnh sau để chạy kiểm thử tải:

hey -q 1000 -c 200 -z 30s https://hello-...run.app

Các đối số của lệnh được diễn giải như sau:

  • -q 1000 – cố gắng tăng tải ở mức khoảng 1.000 yêu cầu mỗi giây
  • -c 200 – phân bổ 200 worker song song
  • -z 30s – chạy kiểm thử tải trong 30 giây
  • hãy nhớ sử dụng URL dịch vụ của bạn làm đối số cuối cùng trong dòng lệnh này

Kết quả kiểm thử sẽ có dạng như sau:

 Summary:
 Total:        30.2767 secs
 Slowest:      3.3633 secs
 Fastest:      0.1071 secs
 Average:      0.1828 secs
 Requests/sec: 1087.2387
 Total data:   3028456 bytes
 Size/request: 92 bytes

Response time histogram:
 0.107 [1]     |
 0.433 [31346] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
 0.758 [1472]  |■■
 1.084 [82]    |
 1.410 [4]     |
...

Latency distribution:
...
 50% in 0.1528 secs
 75% in 0.1949 secs
 90% in 0.2442 secs
 95% in 0.4052 secs
 99% in 0.7062 secs

Details (average, fastest, slowest):
...
 req write:    0.0000 secs, 0.0000 secs, 0.0232 secs
 resp wait:    0.1824 secs, 0.1070 secs, 3.2953 secs
 resp read:    0.0000 secs, 0.0000 secs, 0.0010 secs
Status code distribution:
 [200] 32918 responses

Bản tóm tắt này cho chúng ta biết một số thông tin đáng chú ý:

  • 32.918 yêu cầu đã được gửi với tốc độ khoảng 1.000 yêu cầu/giây trong 30 giây.
  • Không có lỗi (chỉ có phản hồi HTTP 200).
  • Độ trễ trung bình là 180 mili giây.
  • Độ trễ tối thiểu là 107 mili giây, trường hợp xấu nhất là 3,3 giây
  • Độ trễ ở phân vị thứ 90 là 244 mili giây.

Nếu kiểm tra thẻ METRICS trên bảng điều khiển Cloud Run, bạn có thể thấy phía máy chủ của câu chuyện hiệu suất:

e635c6831c468dd3.png

9. Dọn dẹp

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 GCP để 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 trong dự án đó, hoặc chỉ cần xoá hình ảnh vùng chứa bằng lệnh sau:

gcloud container images delete $TAG

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

gcloud run services delete hello --platform managed --region $REGION --quiet
gcloud run services delete hello-again --platform managed --region $REGION --quiet

10. Bạn làm được rồi!

9a31f4fdbbf1ddcb.png

Xin chúc mừng! Bạn đã tạo và triển khai thành công một ứng dụng Cloud Run cho môi trường sản xuất. Trong quá trình này, bạn đã tìm hiểu về các vùng chứa và cách tạo vùng chứa của riêng mình. Bạn cũng đã thấy việc triển khai ứng dụng bằng Cloud Run dễ dàng như thế nào, khi sử dụng cả công cụ dòng lệnh gcloud và Cloud Console. Giờ đây, bạn đã biết cách chia sẻ những tác phẩm sáng tạo tuyệt vời của mình với cả thế giới!

Tôi muốn đặt cho bạn một câu hỏi quan trọng:

Sau khi ứng dụng của bạn hoạt động trong môi trường nhà phát triển, bạn phải sửa đổi bao nhiêu dòng mã để triển khai ứng dụng đó lên đám mây, với tất cả các thuộc tính cấp sản xuất do Cloud Run cung cấp?

Đương nhiên, câu trả lời là 0. :)

Các lớp học lập trình cần xem...

Các tính năng thú vị khác để khám phá...

Tài liệu tham khảo...

11. Kêu gọi hành động

Biểu trưng Google Cloud

Nếu bạn thích lớp học lập trình này và có ý định dành thêm thời gian thực hành trên Google Cloud, thì bạn nên Tham gia cộng đồng Google Cloud Innovators ngay hôm nay!

Biểu trưng huy hiệu thành viên chung của Innovators

Google Cloud Innovators là chương trình Miễn phí và bao gồm:

  • Các buổi thảo luận trực tiếp, AMA và các phiên thảo luận về lộ trình để tìm hiểu thông tin mới nhất trực tiếp từ các nhân viên của Google
  • tin tức mới nhất về Google Cloud ngay trong hộp thư đến của bạn
  • Huy hiệu kỹ thuật số và ảnh nền hội nghị truyền hình
  • 500 tín dụng để sử dụng các phòng thí nghiệm và nội dung học tập trên Skills Boost

Nhấp vào đây để đăng ký!