1. บทนำ
การเรียกใช้เว็บไซต์และแอปพลิเคชันนั้นเป็นเรื่องยาก
การพบปัญหาเมื่อไม่ควร เซิร์ฟเวอร์ขัดข้อง ความต้องการที่เพิ่มขึ้นจะทำให้มีการใช้ทรัพยากรมากขึ้น และการเปลี่ยนแปลงโดยไม่เกิดช่วงพักเป็นเรื่องยุ่งยากและน่าเครียด
ลองนึกภาพเครื่องมือที่จะช่วยให้คุณทำทุกอย่างนี้ได้และแม้กระทั่งทำให้เครื่องมือทำงานอัตโนมัติ GKE ทั้งหมดนี้ไม่เพียงแค่เป็นไปได้ เป็นเรื่องง่ายๆ ใน Codelab นี้ คุณจะรับหน้าที่เป็นนักพัฒนาซอฟต์แวร์ที่ดูแลเว็บไซต์อีคอมเมิร์ซให้กับบริษัทสมมติ ซึ่งก็คือร้านค้าแฟนซี เนื่องจากปัญหาเกี่ยวกับการปรับขนาดและการหยุดทำงาน คุณจึงได้รับมอบหมายให้ทำให้แอปพลิเคชันของคุณใช้งานได้ใน GKE
แบบฝึกหัดนี้จัดทำขึ้นเพื่อแสดงให้เห็นถึงประสบการณ์ที่พบได้ทั่วไปของนักพัฒนาซอฟต์แวร์ระบบคลาวด์ ดังนี้
- สร้างคลัสเตอร์ GKE
- สร้างคอนเทนเนอร์ Docker
- ทำให้คอนเทนเนอร์ใช้งานได้กับ GKE
- แสดงคอนเทนเนอร์ผ่านบริการ
- ปรับขนาดคอนเทนเนอร์ให้เป็นตัวจำลองหลายรายการ
- แก้ไขเว็บไซต์
- เปิดตัวเวอร์ชันใหม่ที่ไม่มีช่วงพัก
แผนภาพสถาปัตยกรรม
สิ่งที่คุณจะได้เรียนรู้
- วิธีสร้างคลัสเตอร์ GKE
- วิธีสร้างอิมเมจ Docker
- วิธีทำให้อิมเมจ Docker ใช้งานได้กับ Kubernetes
- วิธีปรับขนาดแอปพลิเคชันบน Kubernetes
- วิธีดำเนินการอัปเดตทีละส่วนบน Kubernetes
ข้อกำหนดเบื้องต้น
- บัญชี Google ที่มีสิทธิ์การเข้าถึงระดับผู้ดูแลระบบเพื่อสร้างโปรเจ็กต์หรือโปรเจ็กต์ที่มีบทบาทเจ้าของโปรเจ็กต์
- ความเข้าใจเบื้องต้นเกี่ยวกับ Docker และ Kubernetes (หากคุณไม่มีความเข้าใจพื้นฐาน โปรดอ่าน Docker และ Kubernetes ทันที)
2. การตั้งค่าสภาพแวดล้อม
การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก
หากยังไม่มีบัญชี Google คุณจะต้องสร้างบัญชี ลงชื่อเข้าใช้คอนโซล Google Cloud และสร้างโปรเจ็กต์ใหม่
โปรดทราบว่ารหัสโปรเจ็กต์เป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ 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)
- หากต้องการเปิดใช้งาน 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 ที่เหมาะสมแล้ว เรียกใช้คำสั่งต่อไปนี้เพื่อเปิดใช้ 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
ยินดีด้วย คุณสร้างคลัสเตอร์แรกแล้ว
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
ซึ่งจะเป็นการเปิดหน้าต่างใหม่ที่คุณจะเห็น Fancy Store ของคุณ
คุณจะปิดหน้าต่างดังกล่าวได้หลังจากที่ดูเว็บไซต์แล้ว กด 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 แล้วคลิก "ประวัติ" จากจุดนี้ คุณจะเห็นรายการงานสร้างก่อนหน้านี้ แต่ควรมีเฉพาะงานที่สร้างขึ้นเท่านั้น
หากคลิกรหัสบิลด์ คุณจะเห็นรายละเอียดทั้งหมดสำหรับบิลด์นั้น รวมถึงเอาต์พุตบันทึก
ในหน้ารายละเอียดบิลด์ คุณจะดูอิมเมจคอนเทนเนอร์ที่สร้างขึ้นได้โดยคลิกชื่ออิมเมจในส่วนข้อมูลบิลด์
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) เพื่อตรวจสอบว่าแอปของคุณสามารถเข้าถึงได้หรือไม่
คุณควรเห็นเว็บไซต์เดียวกับที่ทดสอบไปก่อนหน้านี้ ยินดีด้วย เว็บไซต์ทำงานบน 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 & 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
เว็บไซต์ควรแสดงข้อความที่คุณเพิ่มไว้ในคอมโพเนนต์หน้าแรก
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 ได้แล้ว