การย้ายข้อมูลเว็บไซต์โมโนลิธไปยัง Microservice บน Google Kubernetes Engine

1. บทนำ

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

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

ข้อเสียบางประการเมื่อเทียบกับ Monolith มีดังนี้

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

ใน Lab นี้ เราจะเรียกใช้ Microservice ใน Google Kubernetes Engine (GKE) Kubernetes เป็นแพลตฟอร์มสำหรับจัดการ โฮสต์ ปรับขนาด และติดตั้งใช้งานคอนเทนเนอร์ คอนเทนเนอร์เป็นวิธีที่พกพาสะดวกในการแพ็กเกจและเรียกใช้โค้ด ซึ่งเหมาะกับรูปแบบของ Microservice ที่แต่ละ Microservice สามารถทำงานในคอนเทนเนอร์ของตัวเองได้

สำหรับแล็บนี้ เราจะทำให้แอปพลิเคชัน Monolithic ที่มีอยู่ใช้งานได้ในคลัสเตอร์ Google Kubernetes Engine จากนั้นจะแยกแอปพลิเคชันออกเป็น Microservice

แผนภาพสถาปัตยกรรมของ Microservice

เราจะเริ่มด้วยการแบ่งโมโนลิธออกเป็น 3 Microservice ทีละรายการ ซึ่งประกอบด้วย Orders, Products และ Frontend เราสร้างอิมเมจ Docker สำหรับแต่ละไมโครเซอร์วิสโดยใช้ Cloud Build ซึ่งเราทริกเกอร์จากภายใน Cloud Shell จากนั้นเราจะทำให้ Microservice ใช้งานได้และแสดง Microservice บน Google Kubernetes Engine (GKE) ด้วยประเภทบริการ LoadBalancer ของ Kubernetes เราจะดำเนินการนี้กับแต่ละบริการพร้อมกับปรับโครงสร้างบริการเหล่านั้นออกจาก Monolith ในระหว่างกระบวนการนี้ เราจะเรียกใช้ทั้ง Monolith และ Microservice จนกว่าจะถึงจุดสิ้นสุดเมื่อเราลบ Monolith ได้

636a2d58588b2b87.png

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

  • วิธีแยกโมโนลิธออกเป็น Microservice
  • วิธีสร้างคลัสเตอร์ Google Kubernetes Engine
  • วิธีสร้างอิมเมจ Docker
  • วิธีทําให้อิมเมจ Docker ใช้งานได้ใน Kubernetes

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

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

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

การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง

หากยังไม่มีบัญชี Google (Gmail หรือ Google Apps) คุณต้องสร้างบัญชี ลงชื่อเข้าใช้คอนโซล Google Cloud Platform ( console.cloud.google.com) แล้วสร้างโปรเจ็กต์ใหม่โดยทำดังนี้

53dad2cefdae71da.png

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

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

จากนั้น คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Developers Console เพื่อใช้ทรัพยากร Google Cloud และเปิดใช้ Container Engine API

การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายเกิน 2-3 ดอลลาร์ แต่ก็อาจมีค่าใช้จ่ายมากกว่านี้หากคุณตัดสินใจใช้ทรัพยากรเพิ่มเติมหรือปล่อยให้ทรัพยากรทำงานต่อไป (ดูส่วน "การล้างข้อมูล" ที่ท้ายเอกสารนี้) คุณสามารถดูข้อมูลราคาของ Google Kubernetes Engine ได้ที่นี่

ผู้ใช้ใหม่ของ Google Cloud Platform มีสิทธิ์รับช่วงทดลองใช้ฟรีมูลค่า$300

Google Cloud Shell

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

เครื่องเสมือนที่ใช้ 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. โคลนที่เก็บซอร์ส

เราใช้แอปพลิเคชันแบบ Monolithic ที่มีอยู่ของเว็บไซต์อีคอมเมิร์ซสมมติ โดยมีหน้าต้อนรับ หน้าผลิตภัณฑ์ และหน้าประวัติการสั่งซื้อที่เรียบง่าย เราเพียงแค่ต้องโคลนแหล่งที่มาจากที่เก็บ Git เพื่อให้เรามุ่งเน้นที่การแบ่งออกเป็น Microservice และการติดตั้งใช้งานใน Google Kubernetes Engine (GKE) ได้

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

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

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

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

ตอนนี้คุณมีสภาพแวดล้อมการพัฒนาที่ใช้งานได้แล้ว เราจึงต้องมีคลัสเตอร์ Kubernetes เพื่อนำ Monolith และในที่สุดก็คือ Microservices ไปใช้งาน ก่อนที่จะสร้างคลัสเตอร์ได้ เราต้องตรวจสอบว่าได้เปิดใช้ API ที่เหมาะสมแล้ว เรียกใช้คำสั่งต่อไปนี้เพื่อเปิดใช้ Containers API เพื่อให้เราใช้ Google Kubernetes Engine ได้

gcloud services enable container.googleapis.com

ตอนนี้เราก็พร้อมที่จะสร้างคลัสเตอร์แล้ว เรียกใช้คำสั่งด้านล่างเพื่อสร้างคลัสเตอร์ GKE ชื่อ 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

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

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

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

5. ทำให้โมโนลิธที่มีอยู่ใช้งานได้

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

cd ~/monolith-to-microservices
./deploy-monolith.sh

การเข้าถึงโมโนลิธ

หากต้องการค้นหาที่อยู่ IP ภายนอกสำหรับแอปพลิเคชัน Monolith ให้เรียกใช้คำสั่งต่อไปนี้

kubectl get service monolith

คุณควรเห็นเอาต์พุตคล้ายกับตัวอย่างต่อไปนี้

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

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

<pending> โปรดรอสักครู่แล้วลองอีกครั้ง

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

9ed25c3f0cbe62fa.png

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

6. ย้ายข้อมูลคำสั่งซื้อไปยัง Microservice

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

สร้างไมโครเซอร์วิสคำสั่งซื้อใหม่

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

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

เนื่องจากเราได้ย้ายข้อมูลโค้ดเบสให้คุณแล้ว ขั้นตอนแรกของเราคือการสร้างคอนเทนเนอร์ Docker ของบริการ Order โดยใช้ Google Cloud Build

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

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

เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างคอนเทนเนอร์ Docker และพุชคอนเทนเนอร์ไปยัง Google Container Registry

cd ~/monolith-to-microservices/microservices/src/orders
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/orders: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>/orders:1.0.0  SUCCESS

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

4c753ede203255f6.png

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

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

6e88ed1643dfe629.png

ทำให้คอนเทนเนอร์ใช้งานได้ใน GKE

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

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

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

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

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

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

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

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

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

kubectl get all

เอาต์พุต:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-779c8d95f5-dxnzl   1/1     Running   0          15h
pod/orders-5bc6969d76-kdxkk     1/1     Running   0          21s
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.39.240.1     <none>         443/TCP        19d
service/monolith     LoadBalancer   10.39.241.130   34.74.209.57   80:30412/TCP   15h
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1/1     1            1           15h
deployment.apps/orders     1/1     1            1           21s
NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-779c8d95f5   1         1         1       15h
replicaset.apps/orders-5bc6969d76     1         1         1       21s

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

เปิดเผยคอนเทนเนอร์ GKE

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

เมื่อเราทำให้บริการคำสั่งซื้อใช้งานได้ เราได้เปิดเผยบริการดังกล่าวบนพอร์ต 8081 ภายในผ่านการติดตั้งใช้งาน Kubernetes หากต้องการแสดงบริการนี้ภายนอก เราต้องสร้างบริการ Kubernetes ประเภท LoadBalancer เพื่อกำหนดเส้นทางการรับส่งข้อมูลจากพอร์ต 80 ภายนอกไปยังพอร์ต 8081 ภายในสำหรับบริการ Orders เรียกใช้คำสั่งต่อไปนี้เพื่อแสดงเว็บไซต์ต่ออินเทอร์เน็ต

kubectl expose deployment orders --type=LoadBalancer --port 80 --target-port 8081

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

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

kubectl get service orders

เอาต์พุต:

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

เมื่อทราบที่อยู่ IP ภายนอกของแอปพลิเคชันแล้ว ให้คัดลอกที่อยู่ IP โปรดบันทึกไว้สำหรับขั้นตอนถัดไปเมื่อเราเปลี่ยน Monolith ให้ชี้ไปยังบริการคำสั่งซื้อใหม่

กำหนดค่าโมโนลิธใหม่

เนื่องจากเรานำบริการคำสั่งซื้อออกจากโมโนลิธแล้ว เราจึงต้องแก้ไขโมโนลิธให้ชี้ไปยัง Microservice คำสั่งซื้อภายนอกใหม่

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

เราต้องอัปเดตไฟล์การกำหนดค่าใน Monolith เพื่อชี้ไปยังที่อยู่ IP ของไมโครเซอร์วิสคำสั่งซื้อใหม่ ใช้โปรแกรมแก้ไข nano เพื่อแทนที่ URL ในเครื่องด้วยที่อยู่ IP ของไมโครเซอร์วิสคำสั่งซื้อใหม่ของเรา เรียกใช้คำสั่งต่อไปนี้เพื่อแก้ไข

cd ~/monolith-to-microservices/react-app
nano .env.monolith

เมื่อเปิดโปรแกรมแก้ไข ไฟล์ควรมีลักษณะดังนี้

REACT_APP_ORDERS_URL=/service/orders
REACT_APP_PRODUCTS_URL=/service/products

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

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

กด CTRL+O กด ENTER แล้วกด CTRL+X เพื่อบันทึกไฟล์ในโปรแกรมแก้ไข nano

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

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

สร้างไฟล์การกำหนดค่า Monolith อีกครั้ง

npm run build:monolith

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

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

ทำให้คอนเทนเนอร์ใช้งานได้ใน GKE

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

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

1cdd60bb0d4d1148.png

7. ย้ายข้อมูลผลิตภัณฑ์ไปยัง Microservice

สร้างไมโครเซอร์วิสผลิตภัณฑ์ใหม่

เราจะแยกบริการต่อไปได้โดยการย้ายข้อมูลบริการผลิตภัณฑ์ในขั้นตอนถัดไป เราจะทำตามกระบวนการเดียวกับขั้นตอนก่อนหน้า เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างคอนเทนเนอร์ Docker, ทำให้คอนเทนเนอร์ใช้งานได้ และแสดงคอนเทนเนอร์ผ่านบริการ Kubernetes

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

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

ทำให้คอนเทนเนอร์ใช้งานได้ใน GKE

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

เปิดเผยคอนเทนเนอร์ GKE

kubectl expose deployment products --type=LoadBalancer --port 80 --target-port 8082

ค้นหา IP สาธารณะของบริการผลิตภัณฑ์ในลักษณะเดียวกับที่เราทำสำหรับบริการคำสั่งซื้อโดยใช้คำสั่งต่อไปนี้

kubectl get service products

เอาต์พุต:

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

บันทึกที่อยู่ IP สำหรับขั้นตอนถัดไปเมื่อเรากำหนดค่า Monolith ใหม่ให้ชี้ไปยัง Microservice ของผลิตภัณฑ์ใหม่

กำหนดค่าโมโนลิธใหม่

ใช้โปรแกรมแก้ไข nano เพื่อแทนที่ URL ในเครื่องด้วยที่อยู่ IP ของไมโครเซอร์วิสผลิตภัณฑ์ใหม่ของเรา

cd ~/monolith-to-microservices/react-app
nano .env.monolith

เมื่อเปิดโปรแกรมแก้ไข ไฟล์ควรมีลักษณะดังนี้

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

แทนที่ REACT_APP_PRODUCTS_URL ด้วยรูปแบบใหม่ขณะแทนที่ด้วยที่อยู่ IP ของไมโครเซอร์วิสผลิตภัณฑ์เพื่อให้ตรงกับด้านล่าง

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=http://<PRODUCTS_IP_ADDRESS>/api/products

กด CTRL+O กด ENTER แล้วกด CTRL+X เพื่อบันทึกไฟล์ในโปรแกรมแก้ไข nano

คุณทดสอบไมโครเซอร์วิสใหม่ได้โดยไปที่ URL ที่เพิ่งตั้งค่าในไฟล์นี้ หน้าเว็บควรแสดงผลการตอบกลับเป็น JSON จาก Microservice ของผลิตภัณฑ์

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

สร้างไฟล์การกำหนดค่า Monolith อีกครั้ง

npm run build:monolith

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

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

ทำให้คอนเทนเนอร์ใช้งานได้ใน GKE

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

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

5389b29f4b8c7c69.png

8. ย้ายข้อมูลส่วนหน้าไปยัง Microservice

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

สร้าง Microservice ส่วนหน้าใหม่

มาทำตามขั้นตอนเดียวกันกับ 2 ขั้นตอนสุดท้ายเพื่อสร้างไมโครเซอร์วิสส่วนหน้าใหม่กัน

ก่อนหน้านี้เมื่อเราสร้าง Monolith ใหม่ เราได้อัปเดตการกำหนดค่าให้ชี้ไปยัง Monolith แต่ตอนนี้เราต้องใช้การกำหนดค่าเดียวกันสำหรับ Microservice ของส่วนหน้า เรียกใช้คำสั่งต่อไปนี้เพื่อคัดลอกไฟล์กำหนดค่า URL ของ Microservice ไปยังโค้ดเบสของ Microservice ส่วนหน้า

cd ~/monolith-to-microservices/react-app
cp .env.monolith .env
npm run build

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

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

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

ทำให้คอนเทนเนอร์ใช้งานได้ใน GKE

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

เปิดเผยคอนเทนเนอร์ GKE

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

ลบโมโนลิธ

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

kubectl delete deployment monolith
kubectl delete service monolith

ทดสอบงาน

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

kubectl get services

เอาต์พุตควรมีลักษณะคล้ายกับเอาต์พุตต่อไปนี้

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
frontend     LoadBalancer   10.39.246.135   35.227.21.154    80:32663/TCP   12m
kubernetes   ClusterIP      10.39.240.1     <none>           443/TCP        18d
orders       LoadBalancer   10.39.243.42    35.243.173.255   80:32714/TCP   31m
products     LoadBalancer   10.39.250.16    35.243.180.23    80:32335/TCP   21m

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

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

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

gcloud projects delete [PROJECT_ID]

ยืนยันการลบโดยป้อน "Y" เมื่อได้รับข้อความแจ้ง

10. ยินดีด้วย

คุณแยกแอปพลิเคชันแบบ Monolithic ออกเป็น Microservice และทำให้ใช้งานได้ใน Google Kubernetes Engine เรียบร้อยแล้ว

ขั้นตอนถัดไป

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Kubernetes ได้จาก Codelab ต่อไปนี้

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