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

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


โปรดทราบว่ารหัสโปรเจ็กต์เป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ 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)
- หากต้องการเปิดใช้งาน Cloud Shell จาก Cloud Console เพียงคลิกเปิดใช้งาน Cloud Shell
(ระบบจะใช้เวลาเพียงไม่กี่นาทีในการจัดสรรและเชื่อมต่อกับสภาพแวดล้อม)
เมื่อเชื่อมต่อกับ 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
นอกจากนี้ Cloud Shell ยังตั้งค่าตัวแปรสภาพแวดล้อมบางอย่างโดยค่าเริ่มต้น ซึ่งอาจมีประโยชน์เมื่อคุณเรียกใช้คำสั่งในอนาคต
echo $GOOGLE_CLOUD_PROJECT
เอาต์พุตของคำสั่ง
<PROJECT_ID>
- สุดท้าย ให้ตั้งค่าโซนเริ่มต้นและการกำหนดค่าโปรเจ็กต์
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


ยินดีด้วย คุณสร้างคลัสเตอร์แรกแล้ว
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"

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

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

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

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) เพื่อตรวจสอบว่าแอปเข้าถึงได้หรือไม่

คุณควรเห็นเว็บไซต์เดียวกันกับที่ทดสอบก่อนหน้านี้ ยินดีด้วย เว็บไซต์ของคุณทำงานบน 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 & 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
เว็บไซต์ควรแสดงข้อความที่คุณเพิ่มลงในคอมโพเนนต์หน้าแรก

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 แล้ว