Triển khai, mở rộng quy mô và cập nhật trang web bằng Google Kubernetes Engine (GKE)

1. Giới thiệu

Việc chạy các trang web và ứng dụng rất khó.

Mọi việc không thể khắc phục được khi không nên, máy chủ gặp sự cố, nhu cầu tăng lên khiến người dùng sử dụng nhiều tài nguyên hơn, còn việc thực hiện các thay đổi mà không phải ngừng hoạt động thì rất phức tạp và căng thẳng.

Hãy tưởng tượng có một công cụ có thể giúp bạn làm được tất cả những việc đó, thậm chí bạn còn có thể tự động hoá nó! Với GKE, tất cả những việc đó không chỉ có thể thực hiện mà còn rất dễ dàng! Trong lớp học lập trình này, bạn sẽ vào vai một nhà phát triển chạy một trang web thương mại điện tử cho một công ty hư cấu – Cửa hàng yêu thích. Do các vấn đề liên quan đến việc mở rộng quy mô và ngừng hoạt động, bạn có nhiệm vụ triển khai ứng dụng của mình cho GKE!

Các bài tập được sắp xếp để phản ánh trải nghiệm phổ biến của nhà phát triển đám mây:

  1. Tạo một cụm GKE.
  2. Tạo vùng chứa Docker.
  3. Triển khai vùng chứa cho GKE.
  4. Hiển thị vùng chứa thông qua một dịch vụ.
  5. Mở rộng vùng chứa thành nhiều bản sao.
  6. Sửa đổi trang web.
  7. Triển khai phiên bản mới mà không bị ngừng hoạt động.

Sơ đồ cấu trúc

ddba666bd2b02d0d.png

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

  • Cách tạo cụm GKE
  • Cách tạo hình ảnh Docker
  • Cách triển khai hình ảnh Docker cho Kubernetes
  • Cách mở rộng quy mô ứng dụng trên Kubernetes
  • Cách cập nhật liên tục trên Kubernetes

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

  • 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
  • Hiểu biết cơ bản về Docker và Kubernetes (Nếu bạn thiếu hiểu biết cơ bản, vui lòng xem lại DockerKubernetes ngay.)

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. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới.

53dad2cefdae71da.pngS

Ảnh chụp màn hình từ 2016-02-10 12:45:26.png

Xin lưu ý rằng mã dự án là một tên riêng biệt trong tất cả dự án Google Cloud (tên ở trên đã được sử dụng nên 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 sẽ 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. Người dùng mới của Google Cloud đủ điều kiện nhận 300 USD dùng thử miễn phí. Đừng lo lắng nếu bạn không phải là người dùng mới vì lớp học lập trình này sẽ không có quá nhiều chi phí cho bạn. Tuy nhiên, lớp học lập trình này có thể tốn nhiều chi phí hơn nếu bạn sử dụng nhiều tài nguyên hơn hoặc để chúng chạy (xem phần "dọn dẹp" ở cuối). Để biết thêm thông tin, hãy xem bài viết Định giá.

Cloud Shell

Mặc dù có thể vận hành Google Cloud và GKE từ xa bằng 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 trên Đám mây) cho lớp học lập trình.

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 5 GB ổn định 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. Tạo một cụm GKE

Giờ đây, khi đã có môi trường làm việc dành cho nhà phát triển, bạn cần có một cụm GKE để triển khai trang web! Trước khi tạo một cụm, bạn cần đảm bảo rằng đã bật các API phù hợp. Chạy lệnh sau để bật API vùng chứa:

gcloud services enable container.googleapis.com

Bây giờ, bạn có thể tạo cụm của mình! Hãy làm theo các bước bên dưới để tạo một cụm có tên fancy-cluster3 nút:

gcloud container clusters create fancy-cluster --num-nodes 3

Quá trình tạo cụm có thể mất vài phút. Sau đó, hãy chạy lệnh sau và xem 3 phiên bản máy ảo (VM) worker của cụm:

gcloud compute instances list

Kết quả:

NAME                                          ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
gke-fancy-cluster-default-pool-ad92506d-1ng3  us-east4-a  n1-standard-1               10.150.0.7   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4fvq  us-east4-a  n1-standard-1               10.150.0.5   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4zs3  us-east4-a  n1-standard-1               10.150.0.6   XX.XX.XX.XX    RUNNING

Bạn cũng có thể xem cụm của mình và thông tin liên quan trong Bảng điều khiển Cloud. Nhấp vào nút trình đơn ở góc trên cùng bên trái, di chuyển xuống Kubernetes Engine rồi nhấp vào Clusters. Bạn sẽ thấy cụm có tên fancy-cluster.

795c794b03c5d2b0.pngS

6b394dfb8a6031f2.png.

Xin chúc mừng! Bạn đã tạo cụm đầu tiên!

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

Vì đây là trang web hiện có nên bạn chỉ cần sao chép 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 cho GKE.

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

Thẩm định và kiểm tra đơn đăng ký 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 web trong trình đơn Cloud Shell và 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ổ đó sau khi xem trang web. Nhấn Control+C (Windows hoặc Mac) trong cửa sổ dòng lệnh để dừng quá trình máy chủ web.

5. 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, đã đến lúc Docker hoá ứng dụng!

Thông thường, bạn sẽ 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 mà GKE lấy từ đó. 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 tệp docker theo cách thủ công, hãy xem phần Quickstart for Container Registry (Bắt đầu nhanh cho hệ thống đăng ký vùng chứa).)

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 các tệp từ bộ chứa và sử dụng Dockerfile để 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 sang Container Registry.

Trước tiên, bạn cần bật Cloud Build API bằng cách chạy lệnh sau:

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:

cd ~/monolith-to-microservices/monolith
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 có thể thấy kết quả sau đây trong cửa sổ dòng lệnh:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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ý xây dựng hoặc xem quy trình theo thời gian thực, bạn có thể truy cập vào Cloud Console. Nhấp vào nút trình đơn ở góc trên cùng bên trái, cuộn xuống Ci/CD, sau đó nhấp vào Cloud Build, cuối cùng nhấp vào History (Lịch sử). Tại đó, bạn có thể thấy danh sách các bản dựng trước đây của mình, nhưng chỉ 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ả đầu ra nhật ký.

Trên trang chi tiết bản dựng, bạn có thể xem hình ảnh vùng chứa đã được tạo bằng cách nhấp vào tên Hình ảnh trong phần thông tin bản dựng.

6e88ed1643dfe629.pngS

6. Triển khai vùng chứa cho GKE

Giờ đây, khi đã tạo vùng chứa cho trang web của mình và đẩy vùng chứa vào Sổ đăng ký vùng chứa, bạn có thể triển khai vùng chứa cho Kubernetes!

Để triển khai và quản lý các ứng dụng trên một cụm GKE, bạn phải giao tiếp với hệ thống quản lý cụm của Kubernetes. Bạn thường thực hiện việc này bằng cách sử dụng công cụ dòng lệnh kubectl.

Kubernetes biểu thị các ứng dụng dưới dạng Pods, là các đơn vị đại diện cho một vùng chứa (hoặc một nhóm các vùng chứa được kết nối chặt chẽ). Nhóm là đơn vị nhỏ nhất có thể triển khai trong Kubernetes. Ở đây, mỗi Nhóm chỉ chứa vùng chứa nguyên khối.

Để triển khai ứng dụng, bạn cần tạo một bản Deployment (Triển khai). Triển khai quản lý nhiều bản sao ứng dụng của bạn (được gọi là bản sao) và lên lịch chạy các bản sao này trên các nút riêng lẻ trong cụm của bạn. Trong trường hợp này, Triển khai sẽ chỉ chạy một Nhóm ứng dụng của bạn. Quy trình triển khai đảm bảo điều đó bằng cách tạo một ReplicaSet. ReplicaSet chịu trách nhiệm đảm bảo rằng số lượng bản sao được chỉ định luôn chạy.

Lệnh kubectl create deployment khiến Kubernetes tạo một bản Deployment có tên monolith trên cụm của bạn bằng bản sao 1.

Chạy lệnh sau để triển khai ứng dụng của bạn:

kubectl create deployment monolith --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0

Xác minh quá trình triển khai

Để xác minh rằng Triển khai đã được tạo thành công, hãy chạy lệnh sau (Có thể mất một lúc trạng thái nhóm mới là "Đang chạy"):

kubectl get all

Kết quả:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-7d8bc7bf68-htm7z   1/1     Running   0          6m21s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.27.240.1   <none>        443/TCP   24h

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1         1         1            1           20m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   1         1         1       20m

Kết quả đó cho bạn thấy một vài thông tin. Bạn có thể thấy Triển khai của mình, hiện tại; ReplicaSet của bạn, với Số lượng nhóm mong muốn là một; và Nhóm của bạn đang chạy. Có vẻ như bạn đã tạo xong mọi thứ!

Để xem từng tài nguyên, bạn có thể chạy các lệnh sau:

# Show pods
kubectl get pods

# Show deployments
kubectl get deployments

# Show replica sets
kubectl get rs

#You can also combine them
kubectl get pods,deployments

Để hiểu rõ toàn bộ lợi ích của Kubernetes, bạn có thể mô phỏng sự cố máy chủ, xoá Nhóm và xem điều gì sẽ xảy ra!

Sao chép tên nhóm từ lệnh trước rồi chạy lệnh sau để xoá nhóm đó:

kubectl delete pod/<POD_NAME>

Nếu bạn đủ nhanh, bạn có thể chạy lệnh trước để xem lại tất cả và bạn sẽ thấy hai Nhóm, một nhóm kết thúc và một nhóm còn lại đang tạo hoặc đang chạy:

kubectl get all

Kết quả:

NAME                            READY   STATUS        RESTARTS   AGE
pod/monolith-7d8bc7bf68-2bxts   1/1     Running       0          4s
pod/monolith-7d8bc7bf68-htm7z   1/1     Terminating   0          9m35s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.27.240.1   <none>        443/TCP   24h

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1         1         1            1           24m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   1         1         1       24m

Tại sao việc đó xảy ra? ReplicaSet nhận thấy nhóm đã chấm dứt và kích hoạt một nhóm mới để duy trì số lượng bản sao mong muốn. Sau đó, bạn sẽ được tìm hiểu cách mở rộng quy mô để đảm bảo rằng bạn có nhiều phiên bản đang chạy. Như vậy, nếu một phiên bản gặp vấn đề, người dùng sẽ không gặp phải thời gian ngừng hoạt động!

7. Hiển thị quy trình triển khai GKE

Bạn đã triển khai ứng dụng của mình lên GKE, nhưng chưa có cách truy cập vào ứng dụng đó bên ngoài cụm. Theo mặc định, các vùng chứa bạn chạy trên GKE không thể truy cập được qua Internet vì các vùng chứa đó không có địa chỉ IP bên ngoài. Bạn phải hiển thị ứng dụng của mình cho lưu lượng truy cập từ Internet một cách rõ ràng thông qua tài nguyên Service (Dịch vụ). Dịch vụ hỗ trợ kết nối mạng và IP cho các Nhóm của ứng dụng. GKE tạo một IP bên ngoài và một trình cân bằng tải (tuân theo thanh toán) cho ứng dụng của bạn.

Chạy lệnh sau để hiển thị trang web của bạn với Internet:

kubectl expose deployment monolith --type=LoadBalancer --port 80 --target-port 8080

Kết quả:

service/monolith exposed

Truy cập dịch vụ

GKE chỉ định địa chỉ IP bên ngoài cho tài nguyên Dịch vụ, chứ không phải cho Triển khai. Nếu muốn tìm IP bên ngoài mà GKE đã cấp phép cho ứng dụng của mình, bạn có thể kiểm tra Dịch vụ bằng lệnh kubectl get service (Lấy dịch vụ kubectl):

kubectl get service

Kết quả:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
monolith     10.3.251.122    203.0.113.0     80:30877/TCP     3d

Sau khi bạn xác định địa chỉ IP ngoài cho ứng dụng, hãy sao chép địa chỉ đó. Hướng trình duyệt của bạn đến URL đó (chẳng hạn như http://203.0.113.0) để kiểm tra xem ứng dụng của bạn có thể truy cập được hay không.

9ed25c3f0cbe62fa.png.

Bạn sẽ thấy chính trang web mà bạn đã thử nghiệm trước đó! Xin chúc mừng! Trang web của bạn chạy hoàn toàn trên Kubernetes!

8. Mở rộng quy mô triển khai GKE

Giờ đây, khi bạn có một phiên bản ứng dụng đang chạy trong GKE và đưa ứng dụng đó lên Internet, trang web của bạn đã trở nên cực kỳ phổ biến! Bạn cần một cách để mở rộng ứng dụng cho nhiều thực thể để có thể xử lý lưu lượng truy cập. Tìm hiểu cách mở rộng ứng dụng lên tối đa 3 bản sao.

Chạy lệnh sau để mở rộng quy mô triển khai lên 3 bản sao:

kubectl scale deployment monolith --replicas=3

Kết quả:

deployment.apps/monolith scaled

Xác minh quy trình triển khai trên quy mô lớn

Để xác minh rằng Triển khai đã được điều chỉnh theo tỷ lệ thành công, hãy chạy lệnh sau:

kubectl get all

Kết quả:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-7d8bc7bf68-2bxts   1/1     Running   0          36m
pod/monolith-7d8bc7bf68-7ds7q   1/1     Running   0          45s
pod/monolith-7d8bc7bf68-c5kxk   1/1     Running   0          45s

NAME                 TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.27.240.1    <none>         443/TCP        25h
service/monolith     LoadBalancer   10.27.253.64   XX.XX.XX.XX   80:32050/TCP   6m7s

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   3         3         3            3           61m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   3         3         3       61m

Bạn sẽ thấy 3 thực thể của Nhóm đang chạy. Ngoài ra, hãy lưu ý rằng Deployment và ReplicaSet của bạn hiện có số lượng là 3 mong muốn.

9. 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. Họ cho rằng trang web nên cung cấp nhiều thông tin hơn bằng cách giải thích về công ty và sản phẩm/dịch vụ mà bạn thực sự bán. Trong phần này, bạn sẽ thêm một số nội dung 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 chúng tôi đã tạo các thay đổi với tên tệp index.js.new. Bạn có thể sao chép tệp này vào index.js và các thay đổi của bạn sẽ được phản ánh. Hãy làm theo hướng dẫn bên dưới để 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 .

Nhấn Control+C (Windows hoặc Mac) trong cửa sổ dòng lệnh để dừng quá trình máy chủ web.

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ị ngừng hoạt động.

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

Các thay đổi đã hoàn tất 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. Hãy làm theo hướng dẫn dưới đây để cập nhật trang web của bạn.

Các bản cập nhật định kỳ của GKE đảm bảo rằng ứng dụng của bạn vẫn hoạt động và hoạt động ngay cả khi hệ thống thay thế các bản sao của hình ảnh vùng chứa cũ bằng hình ảnh vùng chứa mới trên tất cả các bản sao đang hoạt động.

Từ dòng lệnh, bạn có thể dùng lệnh sau để cho Kubernetes biết rằng bạn muốn cập nhật hình ảnh cho quy trình Triển khai của mình lên một phiên bản mới:

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

Kết quả:

deployment.apps/monolith image updated

Xác minh việc triển khai

Bạn có thể xác thực bản cập nhật Triển khai bằng cách chạy lệnh sau:

kubectl get pods

Kết quả:

NAME                        READY   STATUS              RESTARTS   AGE
monolith-584fbc994b-4hj68   1/1     Terminating         0          60m
monolith-584fbc994b-fpwdw   1/1     Running             0          60m
monolith-584fbc994b-xsk8s   1/1     Terminating         0          60m
monolith-75f4cf58d5-24cq8   1/1     Running             0          3s
monolith-75f4cf58d5-rfj8r   1/1     Running             0          5s
monolith-75f4cf58d5-xm44v   0/1     ContainerCreating   0          1s

Bạn thấy 3 Nhóm mới được tạo và các nhóm cũ bị tắt. Bạn có thể nhận biết theo độ tuổi mới và cũ. Cuối cùng, bạn sẽ chỉ thấy lại 3 Nhóm, tức là 3 Nhóm được cập nhật.

Để xác minh các thay đổi, hãy chuyển đến IP ngoài của trình cân bằng tải một lần nữa và để ý rằng ứ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:

kubectl get svc

Trang web của bạn phải hiển thị văn bản mà bạn đã thêm vào thành phần trang chủ!

8006c9938dbd5aa5.pngs

11. Dọn dẹp

Xoá kho lưu trữ Git

cd ~
rm -rf monolith-to-microservices

Xoá các hình ảnh trong Container Registry

LƯU Ý: Nếu đã tạo các phiên bản khác thì bạn có thể sử dụng cú pháp tương tự để xoá các hình ảnh đó. Lớp học lập trình này giả định rằng bạn chỉ có 2 thẻ.

# 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

LƯU Ý: Nếu đã sử dụng Cloud Build cho các cấu phần phần mềm khác ngoài lớp học lập trình này, bạn sẽ phải xoá nguồn của mình theo cách thủ công khỏi bộ chứa Cloud Storage gs://<PROJECT_ID>_cloudbuild/source.

# 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ụ GKE

kubectl delete service monolith
kubectl delete deployment monolith

Xoá cụm GKE

gcloud container clusters delete fancy-cluster

LƯU Ý: Lệnh này có thể mất chút thời gian.

12. 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 trên GKE. Giờ đây, bạn đã trải nghiệm về Docker và Kubernetes!

Tài nguyên khác