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

Khó khăn khi chạy các trang web và ứng dụng.

Mọi thứ sẽ trở nên tồi tệ khi không nên, máy chủ gặp sự cố, nhu cầu tăng lên khiến nhiều tài nguyên được sử dụng hơn và việc thực hiện các thay đổi mà không bị gián đoạn là điều phức tạp và căng thẳng.

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

Các bài tập được sắp xếp theo trình tự phản ánh trải nghiệm thường gặp của nhà phát triển đám mây:

  1. Tạo một cụm GKE.
  2. Tạo một vùng chứa Docker.
  3. Triển khai vùng chứa vào 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. Ra mắt phiên bản mới mà không bị gián đoạn.

Sơ đồ kiến trúc

ddba666bd2b02d0d.png

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

  • Cách tạo một cụm GKE
  • Cách tạo một hình ảnh Docker
  • Cách triển khai hình ảnh Docker vào Kubernetes
  • Cách mở rộng quy mô ứng dụng trên Kubernetes
  • Cách thực hiện quy trình cập nhật từng phần 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 một dự án có vai trò chủ sở hữu dự án
  • Có kiến thức cơ bản về Docker và Kubernetes (Nếu bạn chưa có kiến thức cơ bản, vui lòng xem lại DockerKubernetes ngay bây giờ).

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

53dad2cefdae71da.png

Ả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 duy nhất trên tất cả các dự á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, chúng ta sẽ 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. Người dùng mới của Google Cloud đủ điều kiện dùng thử miễn phí 300 USD. Nếu không phải là người dùng mới, bạn không cần lo lắng vì lớp học lập trình này sẽ không tốn của bạn quá vài đô la. Tuy nhiên, lớp học lập trình này có thể tốn nhiều tiền hơn nếu bạn sử dụng nhiều tài nguyên hơn hoặc để 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 Đị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 Cloud) cho lớp học lập trình này.

Máy ảo dựa trên Debian 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. Điều này có nghĩa là bạn chỉ cần một trình duyệt (có, trình duyệt này hoạt động trên Chromebook) cho lớp học lập trình này.

  1. Để kích hoạt Cloud Shell từ Bảng điều khiển Cloud, bạn chỉ cần nhấp vào Kích hoạt Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (mất vài phút để cung cấp và kết nối với môi trường).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

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 PROJECT_ID.

gcloud auth list

Đầu ra của lệnh

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Nếu vì lý do nào đó mà dự án chưa được thiết lập, 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 bạn đã dùng trong các bước thiết lập hoặc tìm mã nhận dạng đó trong trang tổng quan của 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, có thể hữu ích khi bạn chạy các lệnh trong tương lai.

echo $GOOGLE_CLOUD_PROJECT

Đầu ra của lệnh

<PROJECT_ID>
  1. Cuối cùng, hãy đặ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 múi giờ khác nhau. Để biết thêm thông tin, hãy xem phần Khu vực và vùng.

3. Tạo một cụm GKE

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

gcloud services enable container.googleapis.com

Giờ đây, bạn có thể tạo cụm của mình! Làm theo các bước bên dưới để tạo một cụm có tên là fancy-cluster với 3 nút:

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

Có thể mất vài phút để tạo cụm. Sau đó, hãy chạy lệnh sau và xem 3 phiên bản máy ảo (VM) của worker trong 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 và thông tin liên quan trong Cloud Console. 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 Cụm. Bạn sẽ thấy cụm có tên là fancy-cluster.

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

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

4. Sao chép kho lưu trữ nguồn

Vì đây là một trang web hiện có, 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 phiên bản Cloud Shell của bạn 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 của bạn trên thiết bị. Có thể mất vài phút để tập lệnh đó chạy.

Hãy nỗ lực hết mình 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 biểu tượng xem trước trên web trong trình đơn Cloud Shell rồi chọn Xem trước trên cổng 8080.

5869738f0e9ec386.png

Thao tác này sẽ mở ra một cửa sổ mới để bạn có thể xem Cửa hàng riêng của mình đang 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 quy trình máy chủ web.

5. Tạo vùng chứa Docker bằng Cloud Build

Giờ đây, các tệp nguồn của bạn đã sẵn sàng hoạt động, đã đến lúc bạn cần Dockerize ứng dụng của mình!

Thông thường, bạn sẽ phải thực hiện theo quy trình gồm 2 bước, đó là 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 kéo từ đó. Tuy nhiên, bạn có thể đơn giản hoá mọi việc bằng cách sử dụng Cloud Build để tạo vùng chứa Docker và đưa hình ảnh vào Container Registry chỉ bằng một lệnh! (Để xem quy trình tạo tệp docker và đẩy tệp theo cách thủ công, hãy xem phần Hướng dẫn bắt đầu nhanh cho Container Registry.)

Cloud Build nén các tệp trong thư mục và di chuyển chúng 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ừ nhóm và dùng tệp Docker để 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 kết quả sẽ được chuyển đến 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 đầu ra sau đây trong thiết bị đầu cuối:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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 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 Ci/CD, sau đó nhấp vào Cloud Build và cuối cùng nhấp vào Nhật ký. Tại đây, bạn có thể xem danh sách các bản dựng trước đây, nhưng chỉ nên có bản dựng mà bạn đã tạo.

4c753ede203255f6.png

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ả đầu ra nhật ký.

Trên trang thông tin 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.png

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

Giờ đây, sau khi tạo vùng chứa cho trang web và chuyển vùng chứa đó đến Container Registry, bạn có thể triển khai vùng chứa đó đến 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 Kubernetes. Bạn thường làm việc đó 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 Pod. Đây là những đơn vị biểu thị một vùng chứa (hoặc nhóm các vùng chứa được liên kết chặt chẽ). Pod là đơn vị triển khai nhỏ nhất trong Kubernetes. Ở đây, mỗi Pod chỉ chứa vùng chứa đơn khối của bạn.

Để triển khai ứng dụng, bạn cần tạo một Deployment (Triển khai). Deployment quản lý nhiều bản sao của ứng dụng (gọi là bản sao) và lên lịch để chạy trên các nút riêng lẻ trong cụm. Trong trường hợp này, Deployment sẽ chỉ chạy một Pod của ứng dụng. Việc triển khai đảm bảo rằng 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 Deployment có tên là monolith trên cụm của bạn với 1 bản sao.

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 bạn đã tạo thành công Deployment, hãy chạy lệnh sau (Có thể mất vài phút để trạng thái Pod chuyển thành "Running"):

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

Đầu ra đó cho bạn thấy một số điều. Bạn có thể thấy Deployment (Triển khai) hiện tại; ReplicaSet (Nhóm bản sao) với số lượng Pod mong muốn là một; và Pod đang chạy. Có vẻ như bạn đã tạo thành công 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

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

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

kubectl delete pod/<POD_NAME>

Nếu đủ nhanh, bạn có thể chạy lệnh trước đó để xem lại tất cả và bạn sẽ thấy 2 Pod, một Pod đang kết thúc và một Pod đang tạo hoặc 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 pod đang kết thúc và kích hoạt một pod mới để duy trì số lượng bản sao mong muốn. Sau đó, bạn sẽ thấy cách mở rộng quy mô để đảm bảo rằng bạn có một số phiên bản đang chạy để nếu một phiên bản ngừng hoạt động, người dùng sẽ không thấy thời gian ngừng hoạt động!

7. Hiển thị việc triển khai GKE

Bạn đã triển khai ứng dụng của mình cho GKE, nhưng không có cách nào để truy cập vào ứng dụng đó bên ngoài cụm. Theo mặc định, các vùng chứa mà bạn chạy trên GKE không thể truy cập được từ Internet vì chúng không có địa chỉ IP ngoài. Bạn phải công khai ứng dụng của mình cho lưu lượng truy cập từ Internet thông qua tài nguyên Dịch vụ. Dịch vụ này cung cấp khả năng hỗ trợ mạng và IP cho các Pod của ứng dụng. GKE sẽ tạo một IP ngoài và một trình cân bằng tải (chịu phí) cho ứng dụng của bạn.

Chạy lệnh sau để đưa trang web của bạn lên Internet:

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

Kết quả:

service/monolith exposed

Truy cập vào dịch vụ

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

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 xác định địa chỉ IP ngoài cho ứng dụng, hãy sao chép địa chỉ đó. Chuyển 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ó truy cập được hay không.

9ed25c3f0cbe62fa.png

Bạn sẽ thấy trang web mà bạn đã kiểm thử 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 đang chạy của ứng dụng trong GKE và đã cung cấp phiên bản đó cho Internet, trang web của bạn đã trở nên cực kỳ phổ biến! Bạn cần có cách để mở rộng quy mô ứng dụng thành nhiều phiên bản để có thể xử lý lưu lượng truy cập. Tìm hiểu cách mở rộng quy mô ứng dụng của bạn 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 việc triển khai theo quy mô

Để xác minh rằng Deployment đã đượ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 phiên bản Pod đ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 mong muốn là 3.

9. Chỉnh sửa 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 bạn nên cung cấp nhiều thông tin hơn bằng cách giải thích về công ty của bạn và những gì bạn thực sự bán. Trong phần này, bạn sẽ thêm một số văn bản vào trang chủ để nhóm tiếp thị hài lòng! 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 bằng tên tệp index.js.new. Bạn có thể sao chép tệp 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 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 &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 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 của monolith:

cd ~/monolith-to-microservices/react-app
npm run build:monolith

Bây giờ, khi mã của bạn đã được cập nhật, bạn cần tạo lại vùng chứa Docker và xuất bản vùng chứa đó lên Container Registry. Bạn có thể dùng lệnh tương tự như trước, chỉ khác là 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 Cloud Build mới có phiên bản hình ảnh 2.0.0 mới cập nhật:

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 quy trình máy chủ web.

Trong phần tiếp theo, bạn sẽ dùng hình ảnh đó để cập nhật ứng dụng mà không bị gián đoạn.

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ị 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 bên dưới để cập nhật trang web của bạn.

Các bản cập nhật từng bước của GKE đảm bảo rằng ứng dụng của bạn vẫn hoạt động và có sẵn ngay cả khi hệ thống thay thế các phiên bản 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 chạy.

Qua dòng lệnh, bạn có thể cho Kubernetes biết rằng bạn muốn cập nhật hình ảnh cho Deployment của mình lên một phiên bản mới bằng lệnh sau:

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 quá trình 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 sẽ thấy 3 Pod mới được tạo và các Pod cũ bị tắt. Bạn có thể biết được độ tuổi nào là mới và độ tuổi nào là cũ. Cuối cùng, bạn sẽ chỉ thấy 3 Pod nữa, đó sẽ là 3 Pod mới cập nhật của bạn.

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

kubectl get svc

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ủ!

8006c9938dbd5aa5.png

11. Dọn dẹp

Xoá kho lưu trữ Git

cd ~
rm -rf monolith-to-microservices

Xoá hình ảnh trong Container Registry

LƯU Ý: Nếu đã tạo các phiên bản khác, bạn cũng có thể dùng cú pháp tương tự để xoá những 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 đã 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 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 đã có kinh nghiệm sử dụng Docker và Kubernetes!

Tài nguyên khác