1. Tổng quan
Phòng thí nghiệm này minh hoạ các tính năng và chức năng được thiết kế để đơn giản hoá quy trình phát triển cho các kỹ sư phần mềm có nhiệm vụ phát triển ứng dụng Python trong môi trường vùng chứa. Việc phát triển vùng chứa thông thường đòi hỏi người dùng phải hiểu rõ thông tin chi tiết về vùng chứa và quy trình xây dựng vùng chứa. Ngoài ra, nhà phát triển thường phải ngắt quy trình của mình, chuyển ra khỏi IDE để kiểm thử và gỡ lỗi ứng dụng trong môi trường từ xa. Với các công cụ và công nghệ được đề cập trong hướng dẫn này, nhà phát triển có thể làm việc hiệu quả với các ứng dụng được chứa trong vùng chứa mà không cần rời khỏi IDE.

Cloud Workstations là gì?
Cloud Workstations cung cấp các môi trường phát triển được quản lý trên Google Cloud, có sẵn tính năng bảo mật và môi trường phát triển được định cấu hình sẵn nhưng có thể tuỳ chỉnh. Truy cập vào Cloud Workstations thông qua một IDE dựa trên trình duyệt, từ nhiều trình chỉnh sửa mã cục bộ (chẳng hạn như VSCode hoặc các IDE của JetBrains như IntelliJ IDEA Ultimate và PyCharm Professional) hoặc thông qua SSH.
Máy trạm trên đám mây sử dụng các tài nguyên sau:
- Quản trị viên tạo cụm máy trạm
- Trong mỗi cụm máy trạm, quản trị viên sẽ tạo một hoặc nhiều cấu hình máy trạm đóng vai trò là mẫu cho máy trạm.
- Nhà phát triển có thể tạo máy trạm để xác định môi trường phát triển cung cấp một IDE trên đám mây, công cụ ngôn ngữ, thư viện và nhiều thành phần khác.
Cloud Workstations giúp quản trị viên CNTT và quản trị viên bảo mật dễ dàng cung cấp, mở rộng quy mô, quản lý và bảo mật môi trường phát triển của họ, đồng thời cho phép nhà phát triển truy cập vào môi trường phát triển với cấu hình nhất quán và công cụ có thể tuỳ chỉnh.
Cloud Workstations giúp chuyển bảo mật sang trái bằng cách tăng cường trạng thái bảo mật của môi trường phát triển ứng dụng. Nền tảng này có các tính năng bảo mật như VPC Service Controls, lưu lượng truy cập vào hoặc ra riêng tư, buộc cập nhật hình ảnh và chính sách truy cập Identity and Access Management.
Cloud Code là gì?
Cloud Code hỗ trợ IDE cho toàn bộ chu trình phát triển của các ứng dụng Kubernetes và Cloud Run, từ việc tạo và tuỳ chỉnh một ứng dụng mới từ các mẫu cho đến khi chạy ứng dụng đã hoàn tất. Cloud Code hỗ trợ bạn trong suốt quá trình phát triển bằng các mẫu sẵn sàng chạy, các đoạn mã cấu hình có sẵn và trải nghiệm gỡ lỗi phù hợp – giúp việc phát triển bằng Kubernetes và Cloud Run trở nên dễ dàng hơn rất nhiều!
Sau đây là một số tính năng của Cloud Code:
- Liên tục tạo và chạy các ứng dụng
- Hỗ trợ gỡ lỗi cho ứng dụng Kubernetes đang được phát triển
- Ghi nhật ký hoạt động phát trực tuyến và xem
Tìm hiểu thêm về các tính năng khác của Cloud Code.
Kiến thức bạn sẽ học được
Trong phòng thí nghiệm này, bạn sẽ tìm hiểu các phương pháp phát triển bằng vùng chứa trong GCP, bao gồm:
- Xem xét Cloud Workstations
- Khởi chạy Workstation
- Xem lại Cloud Code
- Gỡ lỗi trên Kubernetes
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tốc độ của riêng bạn
- Đăng nhập vào Google 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.



- Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
- Mã dự án là mã duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là
PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có dùng được hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ giữ nguyên trong suốt thời gian diễn ra dự án. - Để bạn biết, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
- 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/API trên 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ó. Để tắt các tài nguyên nhằm tránh phát sinh phí thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá toàn bộ dự án. 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.
Thiết lập môi trường
Trong Cloud Shell, hãy đặt mã dự án và số dự án cho dự án của bạn. Lưu các giá trị này dưới dạng biến PROJECT_ID và PROJECT_ID.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
Trong phòng thí nghiệm này, bạn sẽ triển khai mã đến GKE. Bạn cũng sẽ sử dụng Cloud Workstations làm IDE.
Tập lệnh thiết lập bên dưới sẽ chuẩn bị cơ sở hạ tầng này cho bạn.
- Tải tập lệnh thiết lập xuống và thực thi tập lệnh đó.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/setup_with_cw.sh
chmod +x setup_with_cw.sh
- Mở tệp
setup_with_cw.shvà chỉnh sửa giá trị của mật khẩu hiện được đặt thành CHANGEME - Chạy tập lệnh thiết lập để thiết lập một cụm GKE mà bạn sẽ dùng trong bài tập thực hành này. Quá trình thiết lập này sẽ mất khoảng 20 phút.
./setup_with_cw.sh &
- Mở Cloud Workstations trong Cloud Console. Đợi cho đến khi cụm có trạng thái
READYrồi mới chuyển sang các bước tiếp theo. - Nếu phiên Cloud Shell của bạn bị ngắt kết nối, hãy nhấp vào "Kết nối lại" rồi chạy lệnh gcloud cli để đặt mã dự án. Thay thế mã dự án mẫu bên dưới bằng mã dự án qwiklabs của bạn trước khi chạy lệnh.
gcloud config set project qwiklabs-gcp-project-id
- Tải xuống và chạy tập lệnh bên dưới trong thiết bị đầu cuối để tạo cấu hình Cloud Workstations.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/workstation_config_setup.sh
chmod +x workstation_config_setup.sh
./workstation_config_setup.sh
Cấu hình và Cụm Cloud Workstations
Mở Cloud Workstations trong Cloud Console. Xác minh rằng cụm đang ở trạng thái READY.

Xác minh trạng thái của các Cấu hình hiện có.

Tạo một máy trạm mới.

Đổi tên thành my-workstation và chọn cấu hình hiện có: codeoss-python.

Khởi chạy Workstation
- Khởi động và chạy máy trạm. Quá trình khởi động Workstation sẽ mất vài phút.

- Cho phép cookie của bên thứ ba bằng cách nhấp vào biểu tượng trên thanh địa chỉ.


- Nhấp vào "Trang web không hoạt động?".

- Nhấp vào "Cho phép cookie".

- Sau khi máy trạm khởi động, bạn sẽ thấy IDE Code OSS xuất hiện.
Nhấp vào "Đánh dấu là đã hoàn tất" trên trang Bắt đầu của IDE máy trạm

3. Tổng quan về Cloud Code
Xem các phần có trong Cloud Code.
- Phát triển Kubernetes. Có được một môi trường phát triển và gỡ lỗi Kubernetes được tích hợp đầy đủ trong IDE. Tạo và quản lý các cụm ngay trong IDE.
- Gỡ lỗi các ứng dụng đang chạy. Gỡ lỗi mã trong các IDE bằng Cloud Code for VS Code và Cloud Code for IntelliJ bằng cách tận dụng các tính năng gỡ lỗi IDE tích hợp.
- Khám phá các phiên bản triển khai. Xem tài nguyên cơ bản và siêu dữ liệu cho các cụm Kubernetes và dịch vụ Cloud Run. Bạn có thể tìm nạp nội dung mô tả, xem nhật ký, quản lý các khoá bí mật hoặc truy cập trực tiếp vào một thiết bị đầu cuối trong một nhóm.
- Đơn giản hoá quá trình phát triển cục bộ Kubernetes. Về cơ bản, Cloud Code cho IDE sử dụng các công cụ phổ biến như Skaffold, Jib và kubectl để cung cấp thông tin phản hồi liên tục về mã của bạn theo thời gian thực.

Đăng nhập vào Google Cloud
- Nhấp vào biểu tượng Cloud Code rồi chọn "Đăng nhập vào Google Cloud":

- Nhấp vào "Tiếp tục đăng nhập".

- Kiểm tra đầu ra trong Terminal và mở đường liên kết:

- Đăng nhập bằng thông tin đăng nhập của học viên Qwiklabs.

- Chọn "Cho phép":

- Sao chép mã xác minh rồi quay lại thẻ Workstation.

- Dán mã xác minh rồi nhấn Enter.

Nhấp vào nút "Cho phép" nếu bạn thấy thông báo này để có thể sao chép và dán vào máy trạm.

4. Tạo một ứng dụng khởi động Python mới
Trong phần này, bạn sẽ tạo một ứng dụng Python mới.
- Mở một cửa sổ dòng lệnh mới.

- Tạo một thư mục mới và mở thư mục đó dưới dạng không gian làm việc
mkdir music-service && cd music-service
code-oss-cloud-workstations -r --folder-uri="$PWD"
- Tạo một tệp có tên là
requirements.txtrồi sao chép nội dung sau vào tệp đó

Flask
gunicorn
ptvsd==4.3.2
- Tạo một tệp có tên là
app.pyrồi dán đoạn mã sau vào tệp đó
import os
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/")
def hello_world():
message="Hello, World!"
return message
if __name__ == '__main__':
server_port = os.environ.get('PORT', '8080')
app.run(debug=False, port=server_port, host='0.0.0.0')
- Tạo một tệp có tên là
Dockerfilerồi dán nội dung sau vào tệp đó
FROM python:3.8
ARG FLASK_DEBUG=0
ENV FLASK_DEBUG=$FLASK_DEBUG
ENV FLASK_APP=app.py
WORKDIR /app
COPY requirements.txt .
RUN pip install --trusted-host pypi.python.org -r requirements.txt
COPY . .
ENTRYPOINT ["python3", "-m", "flask", "run", "--port=8080", "--host=0.0.0.0"]
Lưu ý: FLASK_DEBUG=1 cho phép bạn tự động tải lại các thay đổi về mã cho một ứng dụng flask Python. Tệp Docker này cho phép bạn truyền giá trị này dưới dạng một đối số xây dựng.
Tạo tệp kê khai
Trong thiết bị đầu cuối, hãy thực thi lệnh sau để tạo skaffold.yaml và deployment.yaml mặc định
- Khởi động Skaffold bằng lệnh sau
skaffold init --generate-manifests
Khi được nhắc, hãy dùng các phím mũi tên để di chuyển con trỏ và dùng phím cách để chọn các lựa chọn.
Chọn:
8080cho cổngyđể lưu cấu hình
Cập nhật cấu hình Skaffold
- Thay đổi tên ứng dụng mặc định
- Mở
skaffold.yaml - Chọn tên hình ảnh hiện được đặt làm
dockerfile-image - Nhấp chuột phải rồi chọn Thay đổi tất cả các lần xuất hiện
- Nhập tên mới bằng
python-app - Chỉnh sửa thêm phần bản dựng để
- thêm
docker.buildArgsvào thẻFLASK_DEBUG=1 - Đồng bộ hoá chế độ cài đặt để tải mọi thay đổi đối với tệp
*.pytừ IDE vào vùng chứa đang chạy
Sau khi chỉnh sửa, phần bản dựng trong tệp skaffold.yaml sẽ có dạng như sau:
build:
artifacts:
- image: python-app
docker:
buildArgs:
FLASK_DEBUG: "1"
dockerfile: Dockerfile
sync:
infer:
- '**/*.py'
Sửa đổi tệp cấu hình Kubernetes
- Thay đổi Tên mặc định
- Mở tệp
deployment.yaml - Chọn tên hình ảnh hiện được đặt làm
dockerfile-image - Nhấp chuột phải rồi chọn Thay đổi tất cả các lần xuất hiện
- Nhập tên mới bằng
python-app
5. Tìm hiểu quy trình phát triển
Sau khi thêm logic nghiệp vụ, giờ đây, bạn có thể triển khai và kiểm thử ứng dụng của mình. Phần sau đây sẽ trình bày cách sử dụng trình bổ trợ Cloud Code. Ngoài các tiêu chí khác, trình bổ trợ này còn tích hợp với skaffold để tinh giản quy trình phát triển của bạn. Khi bạn triển khai đến GKE trong các bước sau, Cloud Code và Skaffold sẽ tự động tạo hình ảnh vùng chứa, đẩy hình ảnh đó vào một Container Registry, rồi triển khai ứng dụng your đến GKE. Quá trình này diễn ra ở chế độ nền, giúp loại bỏ các thông tin chi tiết khỏi quy trình của nhà phát triển.
Thêm cụm Kubernetes
- Thêm một Cụm

- Chọn Google Kubernetes Engine:

- Chọn dự án.

- Chọn "python-cluster" được tạo trong quá trình thiết lập ban đầu.

- Giờ đây, cụm này sẽ xuất hiện trong danh sách cụm Kubernetes trong Cloud Code. Di chuyển và khám phá cụm từ đây.

Triển khai lên Kubernetes
- Trong ngăn ở cuối Cloud Shell Editor, hãy chọn Cloud Code 

- Trong bảng điều khiển xuất hiện ở trên cùng, hãy chọn Chạy trên Kubernetes.
Nếu được nhắc, hãy chọn Có để sử dụng ngữ cảnh Kubernetes hiện tại.

Lệnh này bắt đầu tạo bản dựng mã nguồn rồi chạy các kiểm thử. Quá trình tạo và kiểm thử sẽ mất vài phút để chạy. Các kiểm thử này bao gồm kiểm thử đơn vị và một bước xác thực để kiểm tra các quy tắc được đặt cho môi trường triển khai. Bước xác thực này đã được định cấu hình và đảm bảo rằng bạn sẽ nhận được cảnh báo về các vấn đề triển khai ngay cả khi bạn vẫn đang làm việc trong môi trường phát triển.
- Lần đầu tiên bạn chạy lệnh, một lời nhắc sẽ xuất hiện ở đầu màn hình để hỏi xem bạn có muốn ngữ cảnh kubernetes hiện tại hay không, hãy chọn "Yes" (Có) để chấp nhận và sử dụng ngữ cảnh hiện tại.
- Tiếp theo, một lời nhắc sẽ xuất hiện để hỏi bạn muốn dùng sổ đăng ký vùng chứa nào. Nhấn Enter để chấp nhận giá trị mặc định được cung cấp
- Chọn thẻ "Đầu ra" trong ngăn dưới cùng để xem tiến trình và thông báo. Sử dụng trình đơn thả xuống để chọn "Kubernetes: Run/Debug" (Kubernetes: Chạy/Gỡ lỗi)

- Chọn "Kubernetes: Run/Debug – Detailed" (Kubernetes: Chạy/Gỡ lỗi – Chi tiết) trong trình đơn thả xuống ở bên phải để xem thêm thông tin chi tiết và nhật ký phát trực tiếp từ các vùng chứa

Khi quá trình tạo và kiểm thử hoàn tất, nhật ký trên thẻ Đầu ra sẽ có URL http://localhost:8080 được liệt kê trong chế độ xem "Kubernetes: Chạy/Gỡ lỗi".
- Trong thiết bị đầu cuối Cloud Code, hãy di chuột qua URL đầu tiên trong đầu ra (http://localhost:8080), sau đó trong chú thích xuất hiện, hãy chọn Open Web Preview (Mở bản xem trước trên web).
- Một thẻ trình duyệt mới sẽ mở ra và hiển thị thông báo:
Hello, World!
Tải lại nóng
- Mở tệp
app.py - Thay đổi tin nhắn chào mừng thành
Hello from Python
Lưu ý rằng ngay lập tức trong cửa sổ Output, chế độ xem Kubernetes: Run/Debug, trình theo dõi sẽ đồng bộ hoá các tệp đã cập nhật với vùng chứa trong Kubernetes
Update initiated Build started for artifact python-app Build completed for artifact python-app Deploy started Deploy completed Status check started Resource pod/python-app-6f646ffcbb-tn7qd status updated to In Progress Resource deployment/python-app status updated to In Progress Resource deployment/python-app status completed successfully Status check succeeded ...
- Nếu chuyển sang chế độ xem
Kubernetes: Run/Debug - Detailed, bạn sẽ thấy chế độ xem này nhận ra các thay đổi đối với tệp, sau đó tạo và triển khai lại ứng dụng
files modified: [app.py]
Syncing 1 files for gcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Copying files:map[app.py:[/app/app.py]]togcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Watching for changes...
[python-app] * Detected change in '/app/app.py', reloading
[python-app] * Restarting with stat
[python-app] * Debugger is active!
[python-app] * Debugger PIN: 744-729-662
- Làm mới thẻ trình duyệt nơi bạn thấy kết quả trước đó để xem kết quả mới nhất.
Gỡ lỗi
- Chuyển đến chế độ xem Gỡ lỗi và dừng luồng hiện tại
. Nếu được hỏi, bạn có thể chọn dọn dẹp sau mỗi lần chạy. 
- Nhấp vào biểu tượng
Cloud Codetrong trình đơn dưới cùng rồi chọnDebug on Kubernetesđể chạy ứng dụng ở chế độdebug.

- Trong chế độ xem
Kubernetes Run/Debug - Detailedcủa cửa sổOutput, hãy lưu ý rằng skaffold sẽ triển khai ứng dụng này ở chế độ gỡ lỗi.
- Trong lần đầu tiên chạy, một lời nhắc sẽ hỏi vị trí của nguồn bên trong vùng chứa. Giá trị này liên quan đến các thư mục trong Dockerfile.
Nhấn Enter để chấp nhận giá trị mặc định

Ứng dụng sẽ mất vài phút để tạo và triển khai. Nếu phiên gỡ lỗi bị ngắt kết nối, hãy chạy lại các bước để "Gỡ lỗi trên Kubernetes" trong phần "Phiên phát triển".
- Khi quá trình này hoàn tất. Bạn sẽ thấy một trình gỡ lỗi được đính kèm và thẻ Đầu ra có nội dung:
Attached debugger to container "python-app-8476f4bbc-h6dsl" successfully., đồng thời URL http://localhost:8080 được liệt kê.
Port forwarding pod/python-app-8bd64cf8b-cskfl in namespace default, remote port 5678 -> http://127.0.0.1:5678
- Thanh trạng thái dưới cùng sẽ thay đổi màu từ xanh dương sang cam, cho biết rằng thanh này đang ở chế độ Gỡ lỗi.

- Trong khung hiển thị
Kubernetes Run/Debug, hãy lưu ý rằng một vùng chứa có thể gỡ lỗi đã được khởi động
**************URLs***************** Forwarded URL from service python-app: http://localhost:8080 Debuggable container started pod/python-app-8bd64cf8b-cskfl:python-app (default) Update succeeded ***********************************
Khai thác điểm ngắt
- Mở tệp
app.py - Tìm câu lệnh có nội dung
return message - Thêm một điểm ngắt vào dòng đó bằng cách nhấp vào khoảng trống ở bên trái số dòng. Một chỉ báo màu đỏ sẽ xuất hiện để cho biết điểm ngắt đã được đặt
- Tải lại trình duyệt và lưu ý rằng trình gỡ lỗi sẽ dừng quy trình tại điểm ngắt, đồng thời cho phép bạn kiểm tra các biến và trạng thái của ứng dụng đang chạy từ xa trong GKE
- Nhấp vào mục BIẾN
- Nhấp vào Locals (Biến cục bộ), bạn sẽ thấy biến
"message". - Nhấp đúp vào tên biến "message" và trong cửa sổ bật lên, hãy thay đổi giá trị thành một giá trị khác, chẳng hạn như
"Greetings from Python" - Nhấp vào nút Tiếp tục trong bảng điều khiển gỡ lỗi

- Xem lại phản hồi trong trình duyệt. Lúc này, trình duyệt sẽ cho thấy giá trị mới cập nhật mà bạn vừa nhập.
- Dừng chế độ "Gỡ lỗi" bằng cách nhấn nút dừng
và xoá điểm ngắt bằng cách nhấp lại vào điểm ngắt.
6. Dọn dẹp
Xin chúc mừng! Trong phòng thí nghiệm này, bạn đã tạo một ứng dụng Python mới từ đầu và định cấu hình ứng dụng đó để hoạt động hiệu quả với các vùng chứa. Sau đó, bạn đã triển khai và gỡ lỗi ứng dụng của mình cho một cụm GKE từ xa theo quy trình phát triển tương tự trong các ngăn xếp ứng dụng truyền thống.
Cách dọn dẹp sau khi hoàn thành bài thực hành:
- Xoá các tệp được dùng trong phòng thí nghiệm
cd ~ && rm -rf ~/music-service
- Xoá dự án để loại bỏ tất cả cơ sở hạ tầng và tài nguyên liên quan
—
Lần cập nhật gần đây nhất: 22/3/2023