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

1. บทนำ

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

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

ลองนึกถึงเครื่องมือที่จะช่วยคุณทำทุกอย่างที่กล่าวมาและยังช่วยให้คุณทำงานโดยอัตโนมัติได้ด้วย GKE ไม่เพียงแต่ทำให้สิ่งเหล่านี้เป็นไปได้ แต่ยังทำให้ง่ายอีกด้วย ในโค้ดแล็บนี้ คุณจะสวมบทบาทเป็นนักพัฒนาซอฟต์แวร์ที่ดูแลเว็บไซต์อีคอมเมิร์ซของบริษัทสมมติชื่อ Fancy Store เนื่องจากปัญหาเกี่ยวกับการปรับขนาดและการหยุดทำงาน คุณจึงได้รับมอบหมายให้ติดตั้งใช้งานแอปพลิเคชันใน 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 Console แล้วสร้างโปรเจ็กต์ใหม่

53dad2cefdae71da.png

ภาพหน้าจอจาก 2016-02-10 12:45:26.png

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

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

Cloud Shell

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

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

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

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

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

เมื่อเชื่อมต่อกับ 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 ที่เหมาะสมแล้ว เรียกใช้คำสั่งต่อไปนี้เพื่อเปิดใช้ Containers API

gcloud services enable container.googleapis.com

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

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

การสร้างคลัสเตอร์อาจใช้เวลาหลายนาที หลังจากนั้น ให้เรียกใช้คำสั่งต่อไปนี้และดูอินสแตนซ์เครื่องเสมือน (VM) ของ Worker ทั้ง 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 และเปลี่ยนเป็นไดเรกทอรีที่เหมาะสม นอกจากนี้ คุณยังจะติดตั้งการอ้างอิง Node.js เพื่อให้ทดสอบแอปพลิเคชันก่อนที่จะนำไปใช้งานได้

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

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

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

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

เอาต์พุต:

Monolith listening on port 8080!

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

5869738f0e9ec386.png

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

9ed25c3f0cbe62fa.png

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

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

เมื่อไฟล์ต้นฉบับพร้อมแล้ว ก็ถึงเวลา Dockerize แอปพลิเคชันของคุณ

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

Cloud Build จะบีบอัดไฟล์จากไดเรกทอรีและย้ายไปยัง Bucket ของ 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 .

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

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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 ในที่นี้ Pod แต่ละรายการจะมีเพียงคอนเทนเนอร์ Monolith เท่านั้น

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

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

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

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

ยืนยันการติดตั้งใช้งาน

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

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 ที่มีจำนวน Pod ที่ต้องการเป็น 1 และ Pod ที่กำลังทำงาน ดูเหมือนว่าคุณสร้างทุกอย่างเรียบร้อยแล้ว

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

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

หากคุณดำเนินการได้เร็วพอ คุณจะเรียกใช้คำสั่งก่อนหน้าเพื่อดูทั้งหมดอีกครั้งได้ และควรเห็น Pod 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 ภายนอก คุณต้องเปิดเผยแอปพลิเคชันต่อการเข้าชมจากอินเทอร์เน็ตอย่างชัดเจนผ่านทรัพยากร Service บริการจะให้การสนับสนุนด้านเครือข่ายและ IP สำหรับพ็อดของแอป GKE จะสร้าง IP ภายนอกและตัวจัดสรรภาระงาน (ขึ้นอยู่กับการเรียกเก็บเงิน) สำหรับแอป

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

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

เอาต์พุต:

service/monolith exposed

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

GKE จะกำหนดที่อยู่ IP ภายนอกให้กับทรัพยากร Service ไม่ใช่ Deployment หากต้องการค้นหา 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 รายการที่ทำงานอยู่ นอกจากนี้ โปรดทราบว่าตอนนี้การติดตั้งใช้งานและ ReplicaSet มีจำนวนที่ต้องการเป็น 3

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 และคัดลอกแอปไปยังไดเรกทอรีสาธารณะของ Monolith

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 พ็อดและปิดพ็อดเก่า คุณสามารถดูได้จากอายุว่าวิดีโอใดเป็นวิดีโอใหม่และวิดีโอใดเป็นวิดีโอเก่า ในที่สุด คุณจะเห็นเฉพาะ Pod 3 ตัวอีกครั้ง ซึ่งจะเป็น Pod ที่อัปเดตแล้ว 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 นี้ คุณจะต้องลบแหล่งที่มาออกจาก Bucket ของ 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 แล้ว

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