การย้ายข้อมูลจาก Compute Engine ไปยัง Kubernetes Engine ด้วย Migrate for Anthos

1. ภาพรวม

การเขียนใหม่หรือการปรับวิศวกรรมแอปพลิเคชันที่มีอยู่เพื่อให้ทำงานบน Kubernetes ไม่ได้เสมอไปหรือดำเนินการด้วยตนเองไม่ได้ Migrate for Anthos สามารถช่วยปรับแอปพลิเคชันที่มีอยู่ให้ทันสมัยและทำให้แอปพลิเคชันเหล่านั้นทำงานใน Kubernetes ได้ คุณจะต้องย้ายข้อมูลเว็บแอปที่มีอยู่ที่โฮสต์บน Compute Engine ไปยัง Kubernetes Engine โดยใช้ Migrate for Anthos ใน Codelab นี้

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

  • วิธีทำให้ Migrate for Anthos ใช้งานได้บนคลัสเตอร์ Kubernetes
  • วิธีสร้างคอนเทนเนอร์ในชุดการเก็บสถานะจากอินสแตนซ์ Compute Engine ที่มีอยู่
  • วิธีทำให้คอนเทนเนอร์ใช้งานได้กับ Kubernetes และกำหนดค่าด้วยตัวจัดสรรภาระงาน

สิ่งที่คุณต้องมี

  • โปรเจ็กต์ Google Cloud ที่มีการตั้งค่าการเรียกเก็บเงิน หากยังไม่มีบัญชี คุณจะต้องสร้างบัญชี

2. การตั้งค่า

Codelab นี้สามารถทำงานบน Google Cloud Platform ได้โดยสมบูรณ์โดยไม่ต้องมีการติดตั้งหรือกำหนดค่าภายในเครื่อง

เปิดใช้ API

ก่อนเริ่มต้น ให้เปิดใช้ API ที่จำเป็นในโปรเจ็กต์ Google Cloud ดังนี้

สร้างเว็บเซิร์ฟเวอร์อินสแตนซ์ Compute

มาลองสร้างอินสแตนซ์การประมวลผลที่เราจะใช้โฮสต์เว็บเซิร์ฟเวอร์ nginx เริ่มต้น พร้อมกับกฎของไฟร์วอลล์ที่จะช่วยให้ดูหน้า Landing Page เริ่มต้นของเว็บเซิร์ฟเวอร์ได้ ซึ่งมีวิธีทำอยู่ 2-3 วิธี แต่เราจะใช้ Cloud Shell เพื่อการใช้งานที่ง่าย

ใน Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้

gcloud compute instances create webserver --zone=us-central1-a && \
gcloud compute firewall-rules create default-allow-http --allow=tcp:80 

ส่วนครึ่งแรกของคำสั่งนี้จะสร้างอินสแตนซ์ Google Cloud ในโซน us-central1-a ขณะที่ครึ่งหลังจะสร้างกฎไฟร์วอลล์ชื่อ "default-allow-http" ซึ่งจะอนุญาตให้มีการเข้าชมแบบ http เข้ามาในเครือข่ายของเรา

เมื่อสร้างอินสแตนซ์เรียบร้อยแล้ว อินสแตนซ์จะแสดงตารางที่มีรายละเอียดอินสแตนซ์ โปรดจดจำ External IP ที่เราต้องใช้เพื่อยืนยันว่าเว็บเซิร์ฟเวอร์ของเราจะทำงานในภายหลัง

a08aa5bf924b107d.png

เมื่ออินสแตนซ์พร้อมใช้งานแล้ว เราสามารถ SSH เข้าสู่อินสแตนซ์จาก Cloud Shell เพื่อติดตั้ง nginx และเริ่มเว็บเซิร์ฟเวอร์ได้ ดังนี้

gcloud compute ssh --zone us-central1-a webserver

เมื่อเข้าสู่ระบบอินสแตนซ์การประมวลผลของเราแล้ว ให้ติดตั้ง nginx ดังนี้

sudo apt install nginx

ออกจากระบบเซสชัน SSH ด้วยคำสั่ง logout

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

5c08e3b2bd17e03.png

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

3. คลัสเตอร์ Kubernetes ที่มี Migrate for Anthos

ถัดไป เราจะสร้างคลัสเตอร์ GKE ซึ่งเป็นที่ที่เราจะย้ายข้อมูลเว็บเซิร์ฟเวอร์ Compute Engine ในท้ายที่สุด ใน Cloud Console ให้เรียกใช้คำสั่งต่อไปนี้

gcloud container clusters create my-gke-cluster \
  --zone us-central1-a \
  --cluster-version 1.13 \
  --machine-type n1-standard-4 \
  --image-type "UBUNTU" \
  --num-nodes 1 \
  --enable-stackdriver-kubernetes

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

c69778b8fb8ac72b.png

ถัดไป ให้ไปที่ GCP Marketplace เพื่อทำให้ Migrate for Anthos ใช้งานได้ โดยทำดังนี้

45f5753cae53ccb5.png

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

94dc6238b2affd16.png

ตอนนี้ Migrate for Anthos ควรใช้งานได้ในคลัสเตอร์ Kubernetes ของเรา เมื่อสิ้นสุดการทำให้ใช้งานได้ คุณจะเห็นสถานะ "ตกลง" ใน หน้าแอปพลิเคชัน Kubernetes Engine

5bf601103a5335cf.png

4. จากอินสแตนซ์การประมวลผลไปยังชุดการเก็บสถานะ

เรามีคลัสเตอร์ Kubernetes ที่เรียกใช้ Migrate for Anthos ตอนนี้เราสามารถเริ่มกระบวนการย้ายข้อมูลได้ ในการทำให้อินสแตนซ์การประมวลผลใช้งานได้กับคลัสเตอร์ Kubenetes เราจะปิดระบบอินสแตนซ์ Compute Engine เพื่อให้เราสามารถถ่ายสแนปชอตของดิสก์ได้ ก่อนที่จะดำเนินการต่อ ให้จดรหัสอินสแตนซ์ ซึ่งเราจะต้องใช้ในภายหลัง

gcloud compute instances describe webserver --zone us-central1-a | grep ^id

เราจะปิดอินสแตนซ์ Compute

gcloud compute instances stop webserver --zone us-central1-a

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

python3 /google/migrate/anthos/gce-to-gke/clone_vm_disks.py \
  -p <project-id>   -i <instance-id> \
  -z us-central1-a \
  -T us-central1-a \
  -A webserver-statefulset \
  -o containerized-webserver.yaml

ด้วยการแฟล็กเหล่านั้น clone_vm_disks.py จะทำสิ่งต่อไปนี้

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

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

kubectl apply -f containerized-webserver.yaml

ตรวจสอบสถานะของ Webserver-statefulset ในหน้าภาระงาน ดังนี้

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

5. แสดงคลัสเตอร์ไปยังตัวจัดสรรภาระงาน

ณ จุดนี้ คลัสเตอร์ Kubenetes ควรเรียกใช้เว็บเซิร์ฟเวอร์ของเราเป็นชุดเก็บสถานะ แต่เราจะต้องแสดงคอนเทนเนอร์ของคลัสเตอร์ดังกล่าวกับตัวจัดสรรภาระงานด้วยเพื่อเข้าถึงเว็บเซิร์ฟเวอร์ของเราผ่านที่อยู่ IP ภายนอก ใน Cloud Shell ให้สร้างไฟล์ใหม่ชื่อ loadbalancer.yaml ที่มีเนื้อหาต่อไปนี้

loadbalancer.yaml

apiVersion: v1
kind: Service
metadata:
  name: webserver-loadbalancer
spec:
  type: LoadBalancer
  selector:
    app: webserver-statefulset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

และตอนนี้นำไปใช้กับ kubectl:

kubectl apply -f loadbalancer.yaml

เราสามารถใช้ kubectl เพื่อเรียกข้อมูลที่อยู่ IP ภายนอกของบริการคอนเทนเนอร์เว็บเซิร์ฟเวอร์ได้ดังนี้

kubectl get services

หากเราป้อนที่อยู่ IP ภายนอกในเบราว์เซอร์ เราควรได้รับหน้าจอต้อนรับ nginx เริ่มต้นเดียวกันจากก่อนหน้านี้:

5c08e3b2bd17e03.png

เราทำสำเร็จแล้ว! ตอนนี้เว็บเซิร์ฟเวอร์ GCE ของเราโฮสต์อยู่บน Kubernetes แล้ว เยี่ยมไปเลย

6. Stackdriver Monitoring

เมตริก

ในฐานะบริการ Kubernetes ที่มีการจัดการ Kubernetes Engine จะมีการวัดคุมโดยอัตโนมัติสำหรับทั้งการบันทึกและการตรวจสอบด้วย Stackdriver มาดูเมตริกบางส่วนที่ Stackdriver บันทึกไว้โดยอัตโนมัติกัน

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

เมื่อโหลดแล้ว ให้วางเมาส์เหนือ ทรัพยากร ในแผงด้านซ้าย แล้วเลือก "Kubernetes Engine ใหม่" จากเมนู

4e62c8ad3f2b3fe9.png

แต่ละแถวในหน้าแดชบอร์ดที่แสดงที่นี่แสดงถึงทรัพยากร Kubernetes คุณสลับระหว่างมุมมองโครงสร้างพื้นฐาน ภาระงาน หรือบริการได้ด้วยลิงก์ด้านบนแดชบอร์ด

62066a9251d19843.png

ในมุมมองภาระงาน ให้ขยาย "my-gke-cluster" และเจาะลึกไปที่ค่าเริ่มต้น > เว็บเซิร์ฟเวอร์ statefulset > เว็บเซิร์ฟเวอร์-statefulset-0 > เว็บเซิร์ฟเวอร์-statefulset คลิกคอนเทนเนอร์ชุดสถานะของเว็บเซิร์ฟเวอร์ ที่นี่คุณจะเห็นเมตริกที่พร้อมใช้งานทันทีบางส่วนที่ Stackdriver บันทึกไว้ รวมถึงการใช้งานหน่วยความจำและการใช้งาน CPU

d054778de301429e.png

แผนภูมิที่แสดงในแดชบอร์ดนี้คือแผนภูมิที่เราสามารถใช้เพื่อสร้างแดชบอร์ดที่กำหนดเองได้

แดชบอร์ดที่กำหนดเอง

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

ในแผงด้านซ้าย ให้วางเมาส์เหนือหน้าแดชบอร์ด แล้วคลิกสร้างหน้าแดชบอร์ด

56a0513efe60de3e.png

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

bd66ba91f3125028.png

ยังจำเมตริกที่พร้อมใช้งานได้ทันทีไหม มาเพิ่มแผนภูมิการใช้งาน CPU ของคอนเทนเนอร์กัน ในช่องชื่อแผนภูมิ ให้ป้อน "CPU Utilization" ในช่อง "ค้นหาประเภททรัพยากรและเมตริก" ให้พิมพ์ request_utilization และเลือกการใช้งานคำขอ CPU จากรายการที่กรอง การเลือกนี้จะป้อนข้อมูลทั้งช่องประเภททรัพยากรและเมตริกให้กับเรา

ต่อไป เราจะกรองด้วย project_id ของเรา (หากเรามีหลายโปรเจ็กต์) และcontainer_name ในช่องตัวกรอง ให้พิมพ์ project_id แล้วเลือกโปรเจ็กต์จากรายการที่กรอง แล้วเลือกโปรเจ็กต์ในช่อง "ค่า" เราต้องกรองตาม Container_name ด้วย ในช่องตัวกรอง ให้พิมพ์ container_name เลือกรายการดังกล่าวจากรายการที่กรอง แล้วเลือก webserver-statefulset ในช่อง Value คลิกบันทึก

ตอนนี้เรามีแดชบอร์ดที่แสดงแผนภูมิแรก

3d3d45e4357454e0.png

7. นโยบายการตรวจสอบระยะเวลาทำงานและการแจ้งเตือน

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

จากแผงด้านซ้าย ให้เลือกการตรวจสอบระยะเวลาทำงาน จากนั้นเลือกภาพรวมการตรวจสอบระยะเวลาทำงาน

49368e5700274cf2.png

อย่างที่หน้าการตรวจสอบระยะเวลาทำงาน มาลองตั้งค่าการตรวจสอบระยะเวลาทำงานครั้งแรกกัน คลิกปุ่มเพิ่มการตรวจสอบระยะเวลาทำงานที่ด้านขวาบนของหน้า

d884560f91011009.png

ป้อน "ระยะเวลาทำงานปลายทาง" ในแบบฟอร์มที่ดำเนินการต่อ เป็นชื่อและที่อยู่ IP ภายนอกของตัวจัดสรรภาระงานเป็นชื่อโฮสต์

568a8f1e27ae8417.png

คลิกบันทึก แล้วคุณจะได้รับข้อความแจ้งให้สร้างนโยบายการแจ้งเตือนประกอบดังนี้

f89d53a106a709f4.png

คลิกสร้างนโยบายการแจ้งเตือน

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

74609849348bd03e.png

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

44c474e28a497659.png

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

หากต้องการดูว่าการแจ้งเตือนมีลักษณะอย่างไร ให้เปิด Cloud Shell อีกครั้งใน Cloud Console คำสั่งต่อไปนี้จะหยุดบริการ nginx ที่ทำงานอยู่ในพ็อดเว็บเซิร์ฟเวอร์

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx -s stop"

หลังจากนั้นสักครู่ คุณจะได้รับอีเมลแจ้งเตือนเกี่ยวกับการหยุดทำงาน ดังนี้

808ac1d75ce3681f.png

เรามาเลิกทำกัน กลับไปที่ Cloud Shell มารีสตาร์ท nginx กัน

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx"

หลังจากผ่านไป 2-3 นาที คุณจะได้รับอีเมลของ Stackdriver อีกฉบับ ซึ่งในครั้งนี้จะมีข่าวที่ดียิ่งกว่าเดิม:

5b8262fbbc4877c.png

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

ตอนนี้เราได้ย้ายข้อมูลจาก GCE ไปยัง GKE ด้วย Migrate for Anthos แล้ว เรามาล้างโปรเจ็กต์จากทรัพยากรทั้งหมดที่สร้างขึ้นกัน

ลบโปรเจ็กต์

คุณลบทั้งโปรเจ็กต์ได้หากต้องการ ในคอนโซล GCP ให้ไปที่หน้า Cloud Resource Manager

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

หากคุณต้องการลบคอมโพเนนต์ต่างๆ ทีละรายการ ให้ดำเนินการต่อในส่วนถัดไป

Stackdriver

หน้าแดชบอร์ด

จากแดชบอร์ด ให้คลิกไอคอนการตั้งค่า dc259295eb33cb42.png ที่ด้านบนของหน้า แล้วเลือกลบแดชบอร์ด

นโยบายการแจ้งเตือน

จากหน้านโยบาย ให้เลือกลบจากเมนูการทำงาน 2ef75d82e76accaa.png ทางด้านขวาของแต่ละนโยบายที่คุณสร้างขึ้น

การตรวจสอบระยะเวลาทำงาน

จากหน้าการตรวจสอบระยะเวลาทำงาน ให้เลือกลบจากเมนูการทำงานที่ด้านขวาของการตรวจสอบแต่ละรายการที่คุณสร้างขึ้น

GCE และ Kubernetes

อินสแตนซ์ของ Google Compute Engine

gcloud compute instances delete webserver --zone=us-central1-a

คลัสเตอร์ Kubernetes (รวมถึง Migrate for Anthos, ชุดการเก็บสถานะ และบริการตัวจัดสรรภาระงาน)

gcloud container clusters delete my-gke-cluster --zone=us-central1-a

ดิสก์

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

gcloud compute disks list --filter=webserver

ใช้ชื่อดิสก์ของคุณแทนชื่อของฉัน ลบดิสก์ด้วย:

gcloud compute disks delete vls-690d-webserver --zone=us-central1-a

ล้างข้อมูลทั้งหมดแล้ว

9. ยินดีด้วย

เยี่ยมไปเลย คุณย้ายข้อมูลเว็บเซิร์ฟเวอร์จากอินสแตนซ์ GCE ไปยังคลัสเตอร์ Kubernetes โดยใช้ Migrate for Anthos แล้ว

หัวข้อที่ครอบคลุม

  • เราย้ายข้อมูลเว็บเซิร์ฟเวอร์จาก GCE ไปยังคลัสเตอร์ Kubernetes โดยใช้ Migrate for Anthos แล้ว
  • เราได้เปิดเว็บเซิร์ฟเวอร์ชุดการเก็บสถานะของเราไปทั่วโลกด้วยการแสดงเซิร์ฟเวอร์ดังกล่าวผ่านบริการตัวจัดสรรภาระงาน Kubernetes
  • เราเปิดใช้ Stackdriver และสร้างแดชบอร์ดที่กำหนดเองแล้ว
  • เราได้กำหนดค่าการตรวจสอบระยะเวลาทำงานพร้อมกับนโยบายการแจ้งเตือน เพื่อแจ้งให้เราทราบเมื่อเว็บเซิร์ฟเวอร์หยุดทำงาน