1. Mục tiêu
Trong hướng dẫn này, bạn sẽ tạo 3 cụm GKE có tên là preview, canary và prod. Sau đó, tạo một mục tiêu Cloud Deploy tương ứng với mỗi cụm và một quy trình Cloud Deploy sẽ xác định trình tự các bước để thực hiện việc triển khai trong các mục tiêu đó.
Quy trình triển khai sẽ được kích hoạt bởi một quy trình cloudbuild để tạo bản phát hành Cloud Deploy và thực hiện việc triển khai trong cụm preview. Sau khi xác minh rằng việc triển khai trong bản xem trước đã thành công và hoạt động như mong đợi, bạn sẽ tự động quảng bá bản phát hành trong cụm canary. Việc quảng bá bản phát hành trong cụm prod sẽ yêu cầu phê duyệt. Bạn sẽ phê duyệt quy trình prod trong giao diện người dùng Cloud Deploy và cuối cùng là quảng bá quy trình đó.
Bạn có thể chia mục tiêu của hướng dẫn này thành các bước sau:
- Chuẩn bị không gian làm việc
- Xác định mục tiêu Cloud Deploy
- Xác định quy trình Cloud Deploy
- Tạo bản phát hành
- Quảng bá bản triển khai
- Phê duyệt bản phát hành chính thức
Thiết lập môi trường tự học
- Đă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ị cho 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 và bạn có thể cập nhật chuỗi này bất cứ lúc nào.
- Mã dự án phải là duy nhất trên tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đã đặt). Cloud Console 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 (và thường được xác định là
PROJECT_ID). Vì vậy, nếu không thích, hãy tạo một mã ngẫu nhiên khác hoặc bạn có thể thử mã của riêng mình và xem mã đó có dùng được hay không. Sau đó, mã này sẽ "đóng băng" sau khi dự án được tạo. - 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 API/tài nguyên Cloud. Việc chạy lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt tài nguyên để không phải chịu chi phí thanh toán ngoài hướng dẫn này, hãy làm theo mọi hướng dẫn "dọn dẹp" ở cuối lớp học lập trình. 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.
2. Thiết lập nền tảng
Chuẩn bị không gian làm việc
Chúng ta sẽ thiết lập môi trường cần thiết để chạy hướng dẫn này. Khi hoàn tất bước này, chúng ta sẽ tạo một cụm GKE để chạy các bản triển khai.
- Đặt giá trị mặc định cho cấu hình gcloud
gcloud config set project <your project>
gcloud config set deploy/region us-central1
- Sao chép kho lưu trữ
git clone https://github.com/gushob21/software-delivery-workshop
cd software-delivery-workshop/labs/cloud-deploy/
cloudshell workspace .
rm -rf deploy && mkdir deploy
- Đặt các biến môi trường
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")
- Cho phép API
gcloud services enable \
cloudresourcemanager.googleapis.com \
`container.googleapis.com \`
`cloudbuild.googleapis.com \`
`containerregistry.googleapis.com \`
`secretmanager.googleapis.com \`
`clouddeploy.googleapis.com`
- Tạo cụm GKE
`gcloud container clusters create preview \`
--zone=us-central1-a --async
`gcloud container clusters create canary \`
--zone=us-central1-b --async
`gcloud container clusters create prod \`
--zone=us-central1-c
Xác định mục tiêu Cloud Deploy
- Tạo một tệp trong thư mục triển khai có tên là preview.yaml bằng lệnh sau trong cloudshell:
cat <<EOF >deploy/preview.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: preview
annotations: {}
labels: {}
description: Target for preview environment
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-a/clusters/preview
EOF
As you noticed, the "kind" tag is "Target". It allows us to add some metadata to the target, a description and finally the GKE cluster where the deployment is supposed to happen for this target.
- Tạo một tệp trong thư mục triển khai có tên là canary.yaml bằng lệnh sau trong cloudshell:
cat <<EOF >deploy/canary.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: canary
annotations: {}
labels: {}
description: Target for canary environment
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-b/clusters/canary
EOF
- Tạo một tệp trong thư mục triển khai có tên là prod.yaml bằng lệnh sau trong cloudshell:
cat <<EOF >deploy/prod.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
name: prod
annotations: {}
labels: {}
description: Target for prod environment
requireApproval: true
gke:
cluster: projects/$PROJECT_ID/locations/us-central1-c/clusters/prod
EOF
Lưu ý thẻ requireApproval được đặt thành true. Thẻ này sẽ không cho phép quảng bá vào mục tiêu prod cho đến khi được phê duyệt. Bạn cần có vai trò roles/clouddeploy.approver để phê duyệt bản phát hành.
- Tạo mục tiêu triển khai
`gcloud config set deploy/region us-central1`
gcloud beta deploy apply --file deploy/preview.yaml
gcloud beta deploy apply --file deploy/canary.yaml
gcloud beta deploy apply --file deploy/prod.yaml
3. Tạo ứng dụng
Trong quá trình tạo ứng dụng mới, quy trình CICD thường được thiết lập để thực hiện các bản dựng tự động, kiểm thử tích hợp và triển khai. Các bước sau đây được coi là một phần của quy trình thiết lập cho một ứng dụng mới. Mỗi ứng dụng mới sẽ có một quy trình triển khai được định cấu hình.
Xác định quy trình Cloud Deploy
- Tạo một tệp trong thư mục triển khai có tên là pipeline.yaml bằng lệnh sau trong cloudshell:
cat <<EOF >>deploy/pipeline.yaml
apiVersion: deploy.cloud.google.com/v1beta1
kind: DeliveryPipeline
metadata:
name: sample-app
labels:
`app: sample-app`
description: delivery pipeline
serialPipeline:
stages:
- targetId: preview
`profiles:`
`- preview`
- targetId: canary
`profiles:`
`- canary`
- targetId: prod
`profiles:`
`- prod`
EOF
As you noticed, the "kind" tag is "DeliveryPipeline". It lets you define the metadata for the pipeline, a description and an order of deployment into various targets via serialPipeline tag.
Thẻ serialPipeline chứa một thẻ có tên là stages. Đây là danh sách tất cả các mục tiêu mà quy trình phân phối này được định cấu hình để triển khai.
targetId xác định mục tiêu cụ thể để sử dụng cho giai đoạn này của quy trình phân phối. Giá trị là thuộc tính metadata.name từ định nghĩa mục tiêu.
profiles là danh sách gồm 0 hoặc nhiều tên hồ sơ Skaffold, từ skaffold.yaml. Cloud Deploy sử dụng hồ sơ có skaffold render khi tạo bản phát hành.
- Áp dụng quy trình
gcloud beta deploy apply --file deploy/pipeline.yaml
4. Giai đoạn phát triển
Khi các ứng dụng được phát triển, chuỗi công cụ CICD tự động sẽ xây dựng và lưu trữ các thành phần. Các lệnh sau đây được thực thi để xây dựng ứng dụng bằng skaffold và lưu trữ các thành phần để triển khai bằng Cloud Deploy. Bước này sẽ được quy trình CICD thực hiện cho mỗi bản dựng ứng dụng.
- Xây dựng và lưu trữ ứng dụng bằng skaffold
skaffold build \
--file-output=artifacts.json \
--default-repo gcr.io/$PROJECT_ID \
--push=true
5. Giai đoạn phát hành
Khi kết thúc quy trình CICD, thường là khi mã được gắn thẻ cho bản phát hành chính thức, bạn sẽ bắt đầu quy trình phát hành bằng cách gọi lệnh cloud deploy release. Sau đó, khi bản triển khai đã được xác thực và phê duyệt, bạn sẽ di chuyển bản phát hành qua nhiều môi trường mục tiêu bằng cách quảng bá và phê duyệt hành động thông qua các quy trình tự động hoặc phê duyệt thủ công.
Tạo bản phát hành
Trước đó, trong hướng dẫn này, chúng ta đã tạo các tệp Cloud Deploy để hiểu cách Cloud Deploy hoạt động. Để minh hoạ, chúng ta đã tạo cùng các tệp Cloud Deploy và đẩy các tệp đó vào một kho lưu trữ github có ứng dụng mẫu và chúng ta sẽ sử dụng Cloud Deploy để phát hành ứng dụng đó.
export REL_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')
gcloud beta deploy releases create \
sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--description="Release demo" \
--build-artifacts=artifacts.json \
--annotations="release-id=rel-${REL_TIMESTAMP}"
Xem lại bản phát hành
Khi một bản phát hành Cloud Deploy được tạo, hệ thống sẽ tự động triển khai bản phát hành đó trong mục tiêu đầu tiên là bản xem trước.
- Chuyển đến <Cloud Deploy> trong Google Cloud Console
- Nhấp vào "sample-app"
Trên màn hình này, bạn sẽ thấy biểu diễn đồ hoạ về quy trình của mình.
- Xác nhận đường viền màu xanh lục ở bên trái hộp xem trước, nghĩa là bản phát hành đã được triển khai vào môi trường đó.
- Bạn có thể xem thêm thông tin chi tiết về bản phát hành bằng cách nhấp vào tên bản phát hành trong phần Thông tin chi tiết về bản phát hành ở phần dưới của màn hình
- Xác minh rằng bản phát hành đã triển khai ứng dụng thành công, hãy chạy lệnh sau trong cloudshell
gcloud container clusters get-credentials preview --zone us-central1-a && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- Nhấp vào biểu tượng xem trước web ở phía trên cùng bên phải của màn hình.
- Chọn Xem trước trên cổng 8080
Thao tác này sẽ đưa bạn đến một trang mới hiển thị thông báo "Hello World!"
- Sử dụng
ctrl+ctrong thiết bị đầu cuối để kết thúc việc chuyển tiếp cổng.
Quảng bá bản phát hành
Giờ đây, bản phát hành của bạn đã được triển khai vào mục tiêu đầu tiên (bản xem trước) trong quy trình, bạn có thể quảng bá bản phát hành đó đến mục tiêu tiếp theo (canary). Chạy lệnh sau để bắt đầu quy trình.
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
Xem lại chương trình quảng bá bản phát hành
- Chuyển đến quy trình sample-app trong bảng điều khiển Cloud của Google
- Xác nhận đường viền màu xanh lục ở bên trái hộp Canary, nghĩa là bản phát hành đã được triển khai vào môi trường đó.
- Xác minh rằng ứng dụng được triển khai đúng cách bằng cách tạo một đường hầm đến ứng dụng đó
gcloud container clusters get-credentials canary --zone us-central1-b && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- Nhấp vào biểu tượng xem trước web ở phía trên cùng bên phải của màn hình.
- Chọn Xem trước trên cổng 8080
Thao tác này sẽ đưa bạn đến một trang mới hiển thị thông báo "Hello World!"
- Sử dụng
ctrl+ctrong thiết bị đầu cuối để kết thúc việc chuyển tiếp cổng.
Phê duyệt bản phát hành chính thức
Hãy nhớ khi chúng ta tạo mục tiêu prod thông qua prod.yaml, chúng ta đã chỉ định thẻ requireApproval là true. Thao tác này sẽ buộc phải phê duyệt để quảng bá trong bản phát hành chính thức.
- Quảng bá bản phát hành canary lên bản phát hành chính thức bằng lệnh sau
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
- Chuyển đến quy trình sample-app trong bảng điều khiển Cloud của Google
- Lưu ý chỉ báo màu vàng cho biết "1 đang chờ xử lý".
Thông báo này cho biết có một bản phát hành đang được xếp hàng để triển khai vào bản phát hành chính thức nhưng cần xem xét và phê duyệt.
- Nhấp vào nút "Xem xét" ngay bên dưới thông báo màu vàng.
- Trong màn hình tiếp theo, hãy nhấp lại vào "Xem xét" để truy cập vào màn hình phê duyệt cho bản phát hành công khai
- Bạn có thể xem xét Manifest Diff để xem các thay đổi. Trong trường hợp này là một tệp hoàn toàn mới.
- Nhấp vào nút "Phê duyệt"
- Quay lại trang quy trình sample-app, nơi bạn sẽ thấy bản phát hành cho bản phát hành chính thức đang diễn ra.
Xem lại bản phát hành chính thức
Giống như các môi trường khác, bạn có thể xem xét bản triển khai khi hoàn tất bằng các bước bên dưới.
- Chạy lệnh sau trong cloudshell để tạo đường hầm chuyển tiếp cổng
gcloud container clusters get-credentials prod --zone us-central1-c && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080
- Nhấp vào biểu tượng xem trước web ở phía trên cùng bên phải của màn hình.
- Chọn Xem trước trên cổng 8080
Thao tác này sẽ đưa bạn đến một trang mới hiển thị thông báo "Hello World!"
- Sử dụng
ctrl+ctrong thiết bị đầu cuối để kết thúc việc chuyển tiếp cổng.