ติดตั้งใช้งาน ปรับขนาด และอัปเดตเว็บไซต์ด้วย Google Kubernetes Engine (GKE)

1. บทนำ

การเรียกใช้เว็บไซต์และแอปพลิเคชันนั้นเป็นเรื่องยาก

การพบปัญหาเมื่อไม่ควร เซิร์ฟเวอร์ขัดข้อง ความต้องการที่เพิ่มขึ้นจะทำให้มีการใช้ทรัพยากรมากขึ้น และการเปลี่ยนแปลงโดยไม่เกิดช่วงพักเป็นเรื่องยุ่งยากและน่าเครียด

ลองนึกภาพเครื่องมือที่จะช่วยให้คุณทำทุกอย่างนี้ได้และแม้กระทั่งทำให้เครื่องมือทำงานอัตโนมัติ GKE ทั้งหมดนี้ไม่เพียงแค่เป็นไปได้ เป็นเรื่องง่ายๆ ใน Codelab นี้ คุณจะรับหน้าที่เป็นนักพัฒนาซอฟต์แวร์ที่ดูแลเว็บไซต์อีคอมเมิร์ซให้กับบริษัทสมมติ ซึ่งก็คือร้านค้าแฟนซี เนื่องจากปัญหาเกี่ยวกับการปรับขนาดและการหยุดทำงาน คุณจึงได้รับมอบหมายให้ทำให้แอปพลิเคชันของคุณใช้งานได้ใน GKE

แบบฝึกหัดนี้จัดทำขึ้นเพื่อแสดงให้เห็นถึงประสบการณ์ที่พบได้ทั่วไปของนักพัฒนาซอฟต์แวร์ระบบคลาวด์ ดังนี้

  1. สร้างคลัสเตอร์ GKE
  2. สร้างคอนเทนเนอร์ Docker
  3. ทำให้คอนเทนเนอร์ใช้งานได้กับ GKE
  4. แสดงคอนเทนเนอร์ผ่านบริการ
  5. ปรับขนาดคอนเทนเนอร์ให้เป็นตัวจำลองหลายรายการ
  6. แก้ไขเว็บไซต์
  7. เปิดตัวเวอร์ชันใหม่ที่ไม่มีช่วงพัก

แผนภาพสถาปัตยกรรม

ddba666bd2b02d0d.png

สิ่งที่คุณจะได้เรียนรู้

  • วิธีสร้างคลัสเตอร์ GKE
  • วิธีสร้างอิมเมจ Docker
  • วิธีทำให้อิมเมจ Docker ใช้งานได้กับ Kubernetes
  • วิธีปรับขนาดแอปพลิเคชันบน Kubernetes
  • วิธีดำเนินการอัปเดตทีละส่วนบน Kubernetes

ข้อกำหนดเบื้องต้น

  • บัญชี Google ที่มีสิทธิ์การเข้าถึงระดับผู้ดูแลระบบเพื่อสร้างโปรเจ็กต์หรือโปรเจ็กต์ที่มีบทบาทเจ้าของโปรเจ็กต์
  • ความเข้าใจเบื้องต้นเกี่ยวกับ Docker และ Kubernetes (หากคุณไม่มีความเข้าใจพื้นฐาน โปรดอ่าน Docker และ Kubernetes ทันที)

2. การตั้งค่าสภาพแวดล้อม

การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก

หากยังไม่มีบัญชี Google คุณจะต้องสร้างบัญชี ลงชื่อเข้าใช้คอนโซล Google Cloud และสร้างโปรเจ็กต์ใหม่

53dad2cefdae71da.png

ภาพหน้าจอจากวันที่ 10-02-2016 เวลา 12:45:26.png

โปรดทราบว่ารหัสโปรเจ็กต์เป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีคนใช้แล้ว และจะใช้ไม่ได้ ขออภัย) เราจะเรียกผลิตภัณฑ์นี้ว่า PROJECT_ID ในภายหลัง

ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากรของ Google Cloud ผู้ใช้ใหม่ของ Google Cloud มีสิทธิ์รับช่วงทดลองใช้ฟรี$300 หากคุณไม่ใช่ผู้ใช้ใหม่ ไม่ต้องกังวล เพราะ Codelab ไม่ควรมีค่าใช้จ่ายเกินเงินไม่กี่ดอลลาร์ อย่างไรก็ตาม Codelab อาจมีค่าใช้จ่ายมากกว่าหากคุณใช้ทรัพยากรมากขึ้นหรือปล่อยให้ทรัพยากรทำงานต่อไป (ดูส่วน "ล้างข้อมูล" ในตอนท้าย) ดูข้อมูลเพิ่มเติมได้ที่ราคา

Cloud Shell

แม้ว่าคุณจะควบคุม Google Cloud และ GKE จากระยะไกลด้วยแล็ปท็อปได้ แต่คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่กำลังทำงานในระบบคลาวด์สำหรับ Codelab ได้

เครื่องเสมือนแบบ Debian นี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่ทำงานอย่างต่อเนื่องใน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก ซึ่งหมายความว่าสิ่งที่คุณต้องมีสำหรับ Codelab นี้คือเบราว์เซอร์ (ใช่แล้ว ทั้งหมดนี้ทำงานได้บน Chromebook)

  1. หากต้องการเปิดใช้งาน Cloud Shell จาก Cloud Console เพียงคลิกเปิดใช้งาน Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (จะใช้เวลาเพียงไม่นานในการจัดสรรและเชื่อมต่อกับสภาพแวดล้อม)

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 14-06-2017 เวลา 22.13.43 น.

เมื่อเชื่อมต่อกับ Cloud Shell คุณควรเห็นว่าตนเองผ่านการตรวจสอบสิทธิ์แล้วและโปรเจ็กต์ได้รับการตั้งค่าเป็น PROJECT_ID แล้ว

gcloud auth list

เอาต์พุตจากคำสั่ง

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

เอาต์พุตจากคำสั่ง

[core]
project = <PROJECT_ID>

หากโปรเจ็กต์ไม่ได้ตั้งค่าไว้ด้วยเหตุผลบางประการ ให้ใช้คำสั่งต่อไปนี้

gcloud config set project <PROJECT_ID>

กำลังมองหา PROJECT_ID ของคุณอยู่ใช่ไหม ตรวจสอบรหัสที่คุณใช้ในขั้นตอนการตั้งค่าหรือดูในแดชบอร์ด Cloud Console

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell ยังตั้งค่าตัวแปรสภาพแวดล้อมโดยค่าเริ่มต้นด้วย ซึ่งอาจเป็นประโยชน์เมื่อคุณเรียกใช้คำสั่งในอนาคต

echo $GOOGLE_CLOUD_PROJECT

เอาต์พุตจากคำสั่ง

<PROJECT_ID>
  1. สุดท้าย ให้ตั้งค่าโซนและการกำหนดค่าโปรเจ็กต์เริ่มต้น
gcloud config set compute/zone us-central1-f

คุณเลือกโซนต่างๆ ได้หลากหลาย ดูข้อมูลเพิ่มเติมได้ที่ภูมิภาคและ โซน

3. สร้างคลัสเตอร์ GKE

เมื่อคุณมีสภาพแวดล้อมสำหรับนักพัฒนาซอฟต์แวร์ที่ทำงานอยู่แล้ว คุณต้องมีคลัสเตอร์ GKE เพื่อทำให้เว็บไซต์ใช้งานได้ ก่อนสร้างคลัสเตอร์ คุณต้องตรวจสอบว่าได้เปิดใช้ API ที่เหมาะสมแล้ว เรียกใช้คำสั่งต่อไปนี้เพื่อเปิดใช้ API ของคอนเทนเนอร์

gcloud services enable container.googleapis.com

ตอนนี้คุณสร้างคลัสเตอร์ได้แล้ว ทำตามขั้นตอนด้านล่างเพื่อสร้างคลัสเตอร์ชื่อ fancy-cluster ที่มี 3 โหนด

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

การสร้างคลัสเตอร์อาจใช้เวลาหลายนาที หลังจากนั้น ให้เรียกใช้คำสั่งต่อไปนี้และดูอินสแตนซ์เครื่องเสมือน (VM) ของผู้ปฏิบัติงาน 3 รายการของคลัสเตอร์

gcloud compute instances list

เอาต์พุต:

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

คุณยังดูคลัสเตอร์และข้อมูลที่เกี่ยวข้องใน Cloud Console ได้ด้วย คลิกปุ่มเมนูที่มุมซ้ายบน เลื่อนลงไปที่ Kubernetes Engine แล้วคลิกคลัสเตอร์ คุณควรเห็นคลัสเตอร์ที่ชื่อ fancy-cluster

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

ยินดีด้วย คุณสร้างคลัสเตอร์แรกแล้ว

4. โคลนที่เก็บซอร์ส

เนื่องจากนี่คือเว็บไซต์ที่มีอยู่ คุณเพียงต้องโคลนแหล่งที่มาจากที่เก็บเท่านั้น เพื่อที่คุณจะได้มุ่งเน้นไปที่การสร้างอิมเมจ Docker และทำให้ใช้งานได้กับ GKE

เรียกใช้คำสั่งต่อไปนี้เพื่อโคลนที่เก็บต้นทางไปยังอินสแตนซ์ Cloud Shell แล้วเปลี่ยนเป็นไดเรกทอรีที่เหมาะสม นอกจากนี้ คุณยังต้องติดตั้งทรัพยากร Dependency ของ Node.js เพื่อให้คุณทดสอบแอปพลิเคชันก่อนทำให้ใช้งานได้

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

ซึ่งจะเป็นการโคลนที่เก็บ เปลี่ยนไดเรกทอรี และติดตั้งทรัพยากร Dependency ที่จำเป็นในการเรียกใช้แอปพลิเคชันในเครื่อง สคริปต์นั้นอาจใช้เวลา 2-3 นาทีจึงจะทำงาน

ทำการสอบทานธุรกิจและทดสอบการสมัครของคุณ เรียกใช้คำสั่งต่อไปนี้เพื่อเริ่มเว็บเซิร์ฟเวอร์

cd ~/monolith-to-microservices/monolith
npm start

เอาต์พุต:

Monolith listening on port 8080!

คุณดูตัวอย่างแอปพลิเคชันได้โดยคลิกไอคอนตัวอย่างเว็บในเมนู Cloud Shell แล้วเลือก "แสดงตัวอย่าง" บนพอร์ต 8080

5869738f0e9ec386.png

ซึ่งจะเป็นการเปิดหน้าต่างใหม่ที่คุณจะเห็น Fancy Store ของคุณ

9ed25c3f0cbe62fa.png

คุณจะปิดหน้าต่างดังกล่าวได้หลังจากที่ดูเว็บไซต์แล้ว กด Control+C (Windows หรือ Mac) ในหน้าต่างเทอร์มินัลเพื่อหยุดกระบวนการของเว็บเซิร์ฟเวอร์

5. สร้างคอนเทนเนอร์ Docker ด้วย Cloud Build

เมื่อไฟล์ต้นฉบับของคุณพร้อมใช้งานแล้ว ได้เวลาที่จะ Dockerize แอปพลิเคชันของคุณ!

ตามปกติแล้ว คุณจะต้องใช้แนวทาง 2 ขั้นตอน ได้แก่ การสร้างคอนเทนเนอร์ Docker และพุชไปยังรีจิสทรีเพื่อจัดเก็บอิมเมจที่ GKE ดึงมา อย่างไรก็ตาม คุณทำให้ชีวิตง่ายขึ้นได้โดยใช้ Cloud Build เพื่อสร้างคอนเทนเนอร์ Docker และวางอิมเมจลงใน Container Registry ด้วยคำสั่งเดียว (หากต้องการดูขั้นตอนการสร้างไฟล์ Docker ด้วยตนเองและพุชไฟล์ โปรดดูการเริ่มต้นอย่างรวดเร็วสำหรับ Container Registry)

Cloud Build จะบีบอัดไฟล์จากไดเรกทอรีและย้ายไฟล์ไปยังที่เก็บข้อมูล Cloud Storage จากนั้นกระบวนการสร้างจะนำไฟล์จากที่เก็บข้อมูลและใช้ Dockerfile เพื่อเรียกใช้กระบวนการบิลด์ของ Docker เนื่องจากคุณระบุแฟล็ก --tag ด้วยโฮสต์เป็น gcr.io สำหรับอิมเมจ Docker อิมเมจ Docker ที่ได้จะส่งไปยัง Container Registry

ก่อนอื่น คุณต้องเปิดใช้ Cloud Build API โดยเรียกใช้คำสั่งต่อไปนี้

gcloud services enable cloudbuild.googleapis.com

หลังจากเปิดใช้ API แล้ว ให้เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อเริ่มกระบวนการบิลด์

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .

กระบวนการดังกล่าวจะใช้เวลา 2-3 นาที แต่หลังจากที่ดำเนินการเสร็จสิ้น คุณจะเห็นผลลัพธ์ต่อไปนี้ในเทอร์มินัล

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

หากต้องการดูประวัติบิลด์หรือดูกระบวนการแบบเรียลไทม์ ให้ไปที่ Cloud Console คลิกปุ่มเมนูที่มุมซ้ายบน แล้วเลื่อนลงไปที่ Ci/CD จากนั้นคลิก Cloud Build แล้วคลิก "ประวัติ" จากจุดนี้ คุณจะเห็นรายการงานสร้างก่อนหน้านี้ แต่ควรมีเฉพาะงานที่สร้างขึ้นเท่านั้น

4c753ede203255f6.png

หากคลิกรหัสบิลด์ คุณจะเห็นรายละเอียดทั้งหมดสำหรับบิลด์นั้น รวมถึงเอาต์พุตบันทึก

ในหน้ารายละเอียดบิลด์ คุณจะดูอิมเมจคอนเทนเนอร์ที่สร้างขึ้นได้โดยคลิกชื่ออิมเมจในส่วนข้อมูลบิลด์

6e88ed1643dfe629.png

6. ทำให้คอนเทนเนอร์ใช้งานได้กับ GKE

ตอนนี้คุณสร้างคอนเทนเนอร์เว็บไซต์และพุชคอนเทนเนอร์ไปยัง Container Registry แล้ว คุณสามารถทำให้ใช้งานได้กับ Kubernetes ได้เลย

หากต้องการทำให้แอปพลิเคชันใช้งานได้และจัดการบนคลัสเตอร์ GKE คุณต้องสื่อสารกับระบบการจัดการคลัสเตอร์ Kubernetes ซึ่งโดยทั่วไปทำได้โดยใช้เครื่องมือบรรทัดคำสั่ง kubectl

Kubernetes จะแสดงแอปพลิเคชันในฐานะ Pod ซึ่งเป็นหน่วยที่แสดงถึงคอนเทนเนอร์ (หรือกลุ่มคอนเทนเนอร์ที่มีการเชื่อมต่อแบบแน่น) พ็อดเป็นหน่วยที่นำไปใช้ได้ที่มีขนาดเล็กที่สุดใน Kubernetes ในที่นี้ พ็อดแต่ละรายการจะมีเพียงคอนเทนเนอร์ขนาดโมโนลิธเท่านั้น

หากต้องการทำให้แอปพลิเคชันใช้งานได้ คุณต้องสร้างการทำให้ใช้งานได้ การทำให้ใช้งานได้จะจัดการสำเนาของแอปพลิเคชันหลายรายการ ซึ่งเรียกว่าตัวจำลอง และกำหนดเวลาให้ทำงานในแต่ละโหนดในคลัสเตอร์ ในกรณีนี้ การทำให้ใช้งานได้จะเรียกใช้พ็อดแอปพลิเคชันเพียง 1 พ็อด การทำให้ใช้งานได้จะช่วยให้มั่นใจได้ว่าเมื่อคุณสร้าง ReplicaSet ReplicaSet มีหน้าที่ในการตรวจสอบว่าจำนวนของตัวจำลองที่ระบุทำงานอยู่เสมอ

คำสั่ง kubectl create deployment จะทำให้ Kubernetes สร้างการทำให้ใช้งานได้ที่มีชื่อว่า monolith บนคลัสเตอร์ที่มีตัวจำลอง 1

เรียกใช้คำสั่งต่อไปนี้เพื่อทำให้แอปพลิเคชันของคุณใช้งานได้

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

ยืนยันการทำให้ใช้งานได้

หากต้องการยืนยันว่าสร้างการทำให้ใช้งานได้เรียบร้อยแล้ว ให้เรียกใช้คำสั่งต่อไปนี้ (อาจใช้เวลาสักครู่เพื่อให้สถานะพ็อดเป็น "กำลังทำงาน")

kubectl get all

เอาต์พุต:

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

ผลลัพธ์นี้แสดงสิ่งต่างๆ มากมาย คุณจะดูการทำให้ใช้งานได้ซึ่งเป็นข้อมูลปัจจุบันได้ ReplicaSet ของคุณ โดยมีจำนวนพ็อดที่ต้องการเป็น 1 และพ็อดที่กำลังทำงานอยู่ ดูเหมือนว่าคุณจะสร้างทุกอย่างเสร็จเรียบร้อยแล้ว

หากต้องการดูทรัพยากรแต่ละรายการ คุณเรียกใช้คำสั่งต่อไปนี้

# 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

หากต้องการดูประโยชน์ทั้งหมดของ Kubernetes ให้จำลองข้อขัดข้องของเซิร์ฟเวอร์ ลบพ็อด แล้วดูว่าจะเกิดอะไรขึ้น

คัดลอกชื่อพ็อดจากคำสั่งก่อนหน้าและเรียกใช้คำสั่งต่อไปนี้เพื่อลบพ็อด

kubectl delete pod/<POD_NAME>

หากเร็วพอ คุณสามารถเรียกใช้คำสั่งก่อนหน้าเพื่อดูทั้งหมดอีกครั้ง และคุณจะเห็นพ็อด 2 พ็อด พ็อดหนึ่งกำลังจะสิ้นสุดและอีกพ็อดหนึ่งกำลังสร้างหรือกำลังทำงาน:

kubectl get all

เอาต์พุต:

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

เหตุใดจึงเป็นเช่นนั้น ReplicaSet เห็นว่าพ็อดได้สิ้นสุดการทำงานและทริกเกอร์พ็อดใหม่เพื่อรักษาจำนวนตัวจำลองที่ต้องการแล้ว หลังจากนั้น คุณจะได้เห็นวิธีปรับขนาดเพื่อให้แน่ใจว่าคุณมีอินสแตนซ์ที่ทำงานอยู่หลายอินสแตนซ์ เพื่อที่ว่าหากมีอินสแตนซ์ใดหยุดทำงาน ผู้ใช้จะไม่เห็นช่วงพักเลย

7. แสดงการทำให้ GKE ใช้งานได้

คุณทำให้แอปพลิเคชันใช้งานได้กับ GKE แล้ว แต่ไม่มีวิธีเข้าถึงแอปพลิเคชันภายนอกคลัสเตอร์ โดยค่าเริ่มต้น คอนเทนเนอร์ที่คุณเรียกใช้บน GKE จะเข้าถึงจากอินเทอร์เน็ตไม่ได้เนื่องจากไม่มีที่อยู่ IP ภายนอก คุณต้องเปิดเผยแอปพลิเคชันต่อการเข้าชมจากอินเทอร์เน็ตผ่านทรัพยากรบริการอย่างชัดแจ้ง บริการมอบเครือข่ายและการสนับสนุน IP สำหรับพ็อดของแอป GKE จะสร้าง IP ภายนอกและตัวจัดสรรภาระงาน (ขึ้นอยู่กับการเรียกเก็บเงิน) สำหรับแอปของคุณ

เรียกใช้คำสั่งต่อไปนี้เพื่อแสดงเว็บไซต์บนอินเทอร์เน็ต

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

เอาต์พุต:

service/monolith exposed

การเข้าถึงบริการ

GKE จะกำหนดที่อยู่ IP ภายนอกให้กับทรัพยากรบริการ ไม่ใช่การทำให้ใช้งานได้ หากต้องการค้นหา IP ภายนอกที่ GKE จัดสรรให้กับแอปพลิเคชัน คุณสามารถตรวจสอบบริการได้ด้วยคำสั่ง kubectl get service ดังนี้

kubectl get service

เอาต์พุต:

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

หลังจากระบุที่อยู่ IP ภายนอกของแอปแล้ว ให้คัดลอกที่อยู่ดังกล่าว เปิดเบราว์เซอร์และไปที่ URL นั้น (เช่น http://203.0.113.0) เพื่อตรวจสอบว่าแอปของคุณสามารถเข้าถึงได้หรือไม่

9ed25c3f0cbe62fa.png

คุณควรเห็นเว็บไซต์เดียวกับที่ทดสอบไปก่อนหน้านี้ ยินดีด้วย เว็บไซต์ทำงานบน Kubernetes ได้อย่างสมบูรณ์

8. ปรับขนาดการทำให้ GKE ใช้งานได้

เมื่อคุณมีอินสแตนซ์ของแอปที่ทำงานอยู่ใน GKE และแสดงอินสแตนซ์บนอินเทอร์เน็ตแล้ว เว็บไซต์ของคุณก็ได้รับความนิยมอย่างสูง คุณต้องมีวิธีปรับขนาดแอปให้ครอบคลุมอินสแตนซ์หลายรายการเพื่อให้จัดการการรับส่งข้อมูลได้ ดูวิธีปรับขนาดแอปพลิเคชันให้รองรับตัวจำลองได้สูงสุด 3 รายการ

เรียกใช้คำสั่งต่อไปนี้เพื่อปรับขนาดการติดตั้งใช้งานเป็นตัวจำลอง 3 รายการ

kubectl scale deployment monolith --replicas=3

เอาต์พุต:

deployment.apps/monolith scaled

ยืนยันการติดตั้งใช้งานที่ปรับขนาด

หากต้องการยืนยันว่าการทำให้ใช้งานได้ได้รับการปรับขนาดสำเร็จแล้ว ให้เรียกใช้คำสั่งต่อไปนี้

kubectl get all

เอาต์พุต:

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

คุณจะเห็นอินสแตนซ์ 3 อินสแตนซ์ที่พ็อดกำลังทำงาน นอกจากนี้ โปรดทราบว่าตอนนี้ Deployment และ ReplicaSet ของคุณมีจํานวนสามรายการที่ต้องการแล้ว

9. ทำการเปลี่ยนแปลงในเว็บไซต์

ทีมการตลาดขอให้คุณเปลี่ยนหน้าแรกของเว็บไซต์ พวกเขาคิดว่าข้อมูลนี้ควรให้ข้อมูลมากขึ้นโดยการอธิบายว่าบริษัทของคุณคืออะไรและขายอะไร ในส่วนนี้ คุณจะเพิ่มข้อความในหน้าแรกเพื่อให้ทีมการตลาดพึงพอใจ ดูเหมือนว่านักพัฒนาซอฟต์แวร์คนหนึ่งของเราได้สร้างการเปลี่ยนแปลงด้วยชื่อไฟล์ index.js.new แล้ว คุณคัดลอกไฟล์ไปที่ index.js ได้และการเปลี่ยนแปลงควรแสดงขึ้น ทำตามคำแนะนำด้านล่างเพื่อทำการเปลี่ยนแปลงที่เหมาะสม

เรียกใช้คำสั่งต่อไปนี้ คัดลอกไฟล์ที่อัปเดตไปยังชื่อไฟล์ที่ถูกต้อง และพิมพ์เนื้อหาเพื่อยืนยันการเปลี่ยนแปลง

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

โค้ดที่ได้ควรมีลักษณะดังนี้

/*
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>
  );
}

คุณได้อัปเดตคอมโพเนนต์ React แล้ว แต่ต้องสร้างแอป React เพื่อสร้างไฟล์แบบคงที่ เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างแอป React และคัดลอกไปยังไดเรกทอรีสาธารณะแบบโมโนลิธ

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

เมื่ออัปเดตโค้ดแล้ว คุณต้องสร้างคอนเทนเนอร์ Docker อีกครั้งและเผยแพร่ใน Container Registry คุณใช้คำสั่งเดียวกับก่อนหน้านี้ได้ ยกเว้นครั้งนี้คุณจะต้องอัปเดตป้ายกำกับเวอร์ชัน

เรียกใช้คำสั่งต่อไปนี้เพื่อทริกเกอร์ Cloud Build ใหม่ด้วยอิมเมจเวอร์ชัน 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 .

กด Control+C (Windows หรือ Mac) ในหน้าต่างเทอร์มินัลเพื่อหยุดกระบวนการของเว็บเซิร์ฟเวอร์

ในส่วนถัดไป คุณจะใช้รูปภาพดังกล่าวเพื่ออัปเดตแอปพลิเคชันของคุณโดยที่ไม่มีช่วงพักเลย

10. อัปเดตเว็บไซต์ที่มีช่วงพักเป็นศูนย์

การเปลี่ยนแปลงเสร็จสมบูรณ์แล้ว และทีมการตลาดก็พอใจกับข้อมูลอัปเดตของคุณ ถึงเวลาอัปเดตเว็บไซต์โดยไม่รบกวนผู้ใช้แล้ว ทำตามวิธีการด้านล่างเพื่ออัปเดตเว็บไซต์

การอัปเดตอย่างต่อเนื่องของ GKE ช่วยให้มั่นใจได้ว่าแอปพลิเคชันของคุณจะยังใช้งานได้แม้ว่าระบบจะแทนที่อินสแตนซ์ของอิมเมจคอนเทนเนอร์เก่าด้วยอิมเมจใหม่ในการจำลองที่ทำงานอยู่ทั้งหมด

จากบรรทัดคำสั่ง คุณจะบอก Kubernetes ได้ว่าต้องการอัปเดตอิมเมจสำหรับการทำให้ใช้งานได้เป็นเวอร์ชันใหม่ด้วยคำสั่งต่อไปนี้

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

เอาต์พุต:

deployment.apps/monolith image updated

ยืนยันการทำให้ใช้งานได้

คุณตรวจสอบการอัปเดตการทำให้ใช้งานได้โดยเรียกใช้คำสั่งต่อไปนี้

kubectl get pods

เอาต์พุต:

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

คุณจะเห็นว่าระบบกำลังสร้างพ็อดใหม่ 3 รายการและพ็อดเก่าของคุณกำลังจะปิดลง คุณสามารถดูได้จากอายุทั้งแบบเก่าและใหม่ สุดท้ายแล้วคุณจะเห็นเพียง 3 พ็อดอีกครั้ง ซึ่งจะเป็นพ็อดที่อัปเดต 3 รายการของคุณ

หากต้องการยืนยันการเปลี่ยนแปลง ให้ไปที่ IP ภายนอกของตัวจัดสรรภาระงานอีกครั้งและสังเกตเห็นว่าแอปได้รับการอัปเดตแล้ว

เรียกใช้คำสั่งต่อไปนี้เพื่อแสดงรายการบริการและดูที่อยู่ IP หากคุณลืม

kubectl get svc

เว็บไซต์ควรแสดงข้อความที่คุณเพิ่มไว้ในคอมโพเนนต์หน้าแรก

8006c9938dbd5aa5.png

11. ล้างข้อมูล

ลบที่เก็บ Git

cd ~
rm -rf monolith-to-microservices

ลบอิมเมจ Container Registry

หมายเหตุ: หากสร้างเวอร์ชันอื่น คุณก็ใช้ไวยากรณ์เดียวกันเพื่อลบรูปภาพเหล่านั้นได้ด้วย Codelab นี้จะสมมติว่าคุณมีแท็กเพียง 2 รายการ

# 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

ลบอาร์ติแฟกต์ Cloud Build ออกจาก Cloud Storage

หมายเหตุ: หากใช้ Cloud Build สำหรับอาร์ติแฟกต์อื่นๆ ที่ไม่ใช่ Codelab คุณจะต้องลบต้นทางออกจากที่เก็บข้อมูล 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

ลบบริการ GKE

kubectl delete service monolith
kubectl delete deployment monolith

ลบคลัสเตอร์ GKE

gcloud container clusters delete fancy-cluster

หมายเหตุ: คำสั่งนี้อาจใช้เวลาสักครู่

12. ยินดีด้วย

คุณทำให้เว็บไซต์ใช้งานได้ ปรับขนาด และอัปเดตเว็บไซต์บน GKE แล้ว ตอนนี้คุณลองใช้ Docker และ Kubernetes ได้แล้ว

แหล่งข้อมูลเพิ่มเติม