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 ที่เราต้องใช้เพื่อยืนยันว่าเว็บเซิร์ฟเวอร์ของเราจะทำงานในภายหลัง
เมื่ออินสแตนซ์พร้อมใช้งานแล้ว เราสามารถ SSH เข้าสู่อินสแตนซ์จาก Cloud Shell เพื่อติดตั้ง nginx และเริ่มเว็บเซิร์ฟเวอร์ได้ ดังนี้
gcloud compute ssh --zone us-central1-a webserver
เมื่อเข้าสู่ระบบอินสแตนซ์การประมวลผลของเราแล้ว ให้ติดตั้ง nginx ดังนี้
sudo apt install nginx
ออกจากระบบเซสชัน SSH ด้วยคำสั่ง logout
มายืนยันว่าเว็บเซิร์ฟเวอร์ของเรากำลังทำงานโดยป้อน IP ภายนอกของอินสแตนซ์จากเวอร์ชันก่อนหน้านี้ในเบราว์เซอร์ของเรา คุณควรเห็นหน้าจอต้อนรับเริ่มต้นของ nginx ดังนี้
เว็บเซิร์ฟเวอร์นี้จะทำหน้าที่เป็นเว็บแอปเดิมที่เราจะย้ายข้อมูลไปยัง 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 นาทีเพื่อให้คำสั่งนี้เสร็จสมบูรณ์ เมื่อสร้างคลัสเตอร์แล้ว คุณจะได้รับผลลัพธ์บางส่วนพร้อมรายละเอียดของคลัสเตอร์
ถัดไป ให้ไปที่ GCP Marketplace เพื่อทำให้ Migrate for Anthos ใช้งานได้ โดยทำดังนี้
ในหน้ามาร์เก็ตเพลสสำหรับ Migrate for Anthos ให้คลิกกำหนดค่า และเลือกโปรเจ็กต์จากรายการหากได้รับข้อความแจ้ง หน้าดำเนินการต่อจะแสดงแบบฟอร์มที่มีค่าเริ่มต้นที่ป้อนไว้ ตรวจสอบว่าคลัสเตอร์ที่เลือกคือคลัสเตอร์ที่เราเพิ่งสร้างแล้วคลิกทำให้ใช้งานได้
ตอนนี้ Migrate for Anthos ควรใช้งานได้ในคลัสเตอร์ Kubernetes ของเรา เมื่อสิ้นสุดการทำให้ใช้งานได้ คุณจะเห็นสถานะ "ตกลง" ใน หน้าแอปพลิเคชัน Kubernetes Engine
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 เริ่มต้นเดียวกันจากก่อนหน้านี้:
เราทำสำเร็จแล้ว! ตอนนี้เว็บเซิร์ฟเวอร์ GCE ของเราโฮสต์อยู่บน Kubernetes แล้ว เยี่ยมไปเลย
6. Stackdriver Monitoring
เมตริก
ในฐานะบริการ Kubernetes ที่มีการจัดการ Kubernetes Engine จะมีการวัดคุมโดยอัตโนมัติสำหรับทั้งการบันทึกและการตรวจสอบด้วย Stackdriver มาดูเมตริกบางส่วนที่ Stackdriver บันทึกไว้โดยอัตโนมัติกัน
คลิกลิงก์ "การตรวจสอบ" ในเมนูผลิตภัณฑ์ การเข้าถึงการดำเนินการนี้เป็นครั้งแรกจากโปรเจ็กต์อาจใช้เวลาสักครู่ขณะตั้งค่าพื้นที่ทำงาน
เมื่อโหลดแล้ว ให้วางเมาส์เหนือ ทรัพยากร ในแผงด้านซ้าย แล้วเลือก "Kubernetes Engine ใหม่" จากเมนู
แต่ละแถวในหน้าแดชบอร์ดที่แสดงที่นี่แสดงถึงทรัพยากร Kubernetes คุณสลับระหว่างมุมมองโครงสร้างพื้นฐาน ภาระงาน หรือบริการได้ด้วยลิงก์ด้านบนแดชบอร์ด
ในมุมมองภาระงาน ให้ขยาย "my-gke-cluster" และเจาะลึกไปที่ค่าเริ่มต้น > เว็บเซิร์ฟเวอร์ statefulset > เว็บเซิร์ฟเวอร์-statefulset-0 > เว็บเซิร์ฟเวอร์-statefulset คลิกคอนเทนเนอร์ชุดสถานะของเว็บเซิร์ฟเวอร์ ที่นี่คุณจะเห็นเมตริกที่พร้อมใช้งานทันทีบางส่วนที่ Stackdriver บันทึกไว้ รวมถึงการใช้งานหน่วยความจำและการใช้งาน CPU
แผนภูมิที่แสดงในแดชบอร์ดนี้คือแผนภูมิที่เราสามารถใช้เพื่อสร้างแดชบอร์ดที่กำหนดเองได้
แดชบอร์ดที่กำหนดเอง
Stackdriver ช่วยให้เราสร้างแดชบอร์ดที่กำหนดเองซึ่งสามารถใช้เพื่อจัดระเบียบแผนภูมิและกราฟสำหรับข้อมูลเมตริกที่มีให้เรา เรามาสร้างแดชบอร์ดที่กำหนดเองเพื่อนำเสนอมุมมองคร่าวๆ ของเมตริกบางส่วนของเว็บเซิร์ฟเวอร์กัน
ในแผงด้านซ้าย ให้วางเมาส์เหนือหน้าแดชบอร์ด แล้วคลิกสร้างหน้าแดชบอร์ด
เนื่องจากตอนนี้เราไม่มีแดชบอร์ดแล้ว เราจึงเพิ่มเมตริกที่เราต้องการเฝ้าติดตามได้ เราจะตั้งชื่อที่เป็นประโยชน์ให้กับหน้าแดชบอร์ดที่ไม่มีชื่อ เช่น "คอนเทนเนอร์เว็บเซิร์ฟเวอร์ของฉัน" และคลิก "เพิ่มแผนภูมิ" ที่ด้านขวาบน
ยังจำเมตริกที่พร้อมใช้งานได้ทันทีไหม มาเพิ่มแผนภูมิการใช้งาน CPU ของคอนเทนเนอร์กัน ในช่องชื่อแผนภูมิ ให้ป้อน "CPU Utilization" ในช่อง "ค้นหาประเภททรัพยากรและเมตริก" ให้พิมพ์ request_utilization และเลือกการใช้งานคำขอ CPU จากรายการที่กรอง การเลือกนี้จะป้อนข้อมูลทั้งช่องประเภททรัพยากรและเมตริกให้กับเรา
ต่อไป เราจะกรองด้วย project_id ของเรา (หากเรามีหลายโปรเจ็กต์) และcontainer_name ในช่องตัวกรอง ให้พิมพ์ project_id แล้วเลือกโปรเจ็กต์จากรายการที่กรอง แล้วเลือกโปรเจ็กต์ในช่อง "ค่า" เราต้องกรองตาม Container_name ด้วย ในช่องตัวกรอง ให้พิมพ์ container_name เลือกรายการดังกล่าวจากรายการที่กรอง แล้วเลือก webserver-statefulset ในช่อง Value คลิกบันทึก
ตอนนี้เรามีแดชบอร์ดที่แสดงแผนภูมิแรก
7. นโยบายการตรวจสอบระยะเวลาทำงานและการแจ้งเตือน
เราสามารถตั้งการแจ้งเตือนด้วย Stackdriver เพื่อแจ้งให้เราทราบเมื่อเมตริกใดก็ตามมีค่าถึงเกณฑ์ที่เราระบุไว้ เช่น เราอาจให้ Stackdriver ส่งอีเมลหาเราเมื่อการใช้งาน CPU จากขั้นตอนสุดท้ายสูงกว่าเกณฑ์ที่กำหนดไว้เป็นระยะเวลานาน ซึ่งอาจบ่งบอกถึงปัญหาเกี่ยวกับแอปของเรา หากต้องการแสดงให้เห็นว่าการแจ้งเตือนเหล่านี้มีลักษณะเป็นอย่างไร ให้ตั้งค่าการตรวจสอบระยะเวลาทำงานและจำลองการหยุดทำงาน
จากแผงด้านซ้าย ให้เลือกการตรวจสอบระยะเวลาทำงาน จากนั้นเลือกภาพรวมการตรวจสอบระยะเวลาทำงาน
อย่างที่หน้าการตรวจสอบระยะเวลาทำงาน มาลองตั้งค่าการตรวจสอบระยะเวลาทำงานครั้งแรกกัน คลิกปุ่มเพิ่มการตรวจสอบระยะเวลาทำงานที่ด้านขวาบนของหน้า
ป้อน "ระยะเวลาทำงานปลายทาง" ในแบบฟอร์มที่ดำเนินการต่อ เป็นชื่อและที่อยู่ IP ภายนอกของตัวจัดสรรภาระงานเป็นชื่อโฮสต์
คลิกบันทึก แล้วคุณจะได้รับข้อความแจ้งให้สร้างนโยบายการแจ้งเตือนประกอบดังนี้
คลิกสร้างนโยบายการแจ้งเตือน
เราจะตั้งชื่อว่า "นโยบายระยะเวลาทำงานปลายทาง" ในส่วนการกําหนดค่า ให้ตั้งค่า "ระบบจะทริกเกอร์เงื่อนไขหาก" เป็น "อนุกรมเวลาใดๆ ที่ละเมิด" แล้วคลิกบันทึก
เรายังดำเนินการไม่เสร็จสิ้น ถัดไป เราจะระบุช่องทางการแจ้งเตือนเพื่อรับการแจ้งเตือนเมื่อมีการละเมิดนโยบายการแจ้งเตือนของเรา ในเมนูแบบเลื่อนลง ประเภทช่องทางการแจ้งเตือน ให้เลือก อีเมล ตามด้วยที่อยู่อีเมลที่ถูกต้อง
คลิกเพิ่มช่องทางการแจ้งเตือน สุดท้าย ที่ด้านล่างของแบบฟอร์ม ให้ตั้งชื่อนโยบายว่า "ระยะเวลาทำงานของเว็บแอป" แล้วคลิก "บันทึก"
หากต้องการดูว่าการแจ้งเตือนมีลักษณะอย่างไร ให้เปิด Cloud Shell อีกครั้งใน Cloud Console คำสั่งต่อไปนี้จะหยุดบริการ nginx ที่ทำงานอยู่ในพ็อดเว็บเซิร์ฟเวอร์
kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx -s stop"
หลังจากนั้นสักครู่ คุณจะได้รับอีเมลแจ้งเตือนเกี่ยวกับการหยุดทำงาน ดังนี้
เรามาเลิกทำกัน กลับไปที่ Cloud Shell มารีสตาร์ท nginx กัน
kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx"
หลังจากผ่านไป 2-3 นาที คุณจะได้รับอีเมลของ Stackdriver อีกฉบับ ซึ่งในครั้งนี้จะมีข่าวที่ดียิ่งกว่าเดิม:
8. ล้างข้อมูล
ตอนนี้เราได้ย้ายข้อมูลจาก GCE ไปยัง GKE ด้วย Migrate for Anthos แล้ว เรามาล้างโปรเจ็กต์จากทรัพยากรทั้งหมดที่สร้างขึ้นกัน
ลบโปรเจ็กต์
คุณลบทั้งโปรเจ็กต์ได้หากต้องการ ในคอนโซล GCP ให้ไปที่หน้า Cloud Resource Manager
ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ที่เรากำลังดำเนินการอยู่ แล้วคลิกลบ ระบบจะแจ้งให้คุณพิมพ์รหัสโปรเจ็กต์ ป้อนรหัสและคลิกปิด
หากคุณต้องการลบคอมโพเนนต์ต่างๆ ทีละรายการ ให้ดำเนินการต่อในส่วนถัดไป
Stackdriver
หน้าแดชบอร์ด
จากแดชบอร์ด ให้คลิกไอคอนการตั้งค่า ที่ด้านบนของหน้า แล้วเลือกลบแดชบอร์ด
นโยบายการแจ้งเตือน
จากหน้านโยบาย ให้เลือกลบจากเมนูการทำงาน ทางด้านขวาของแต่ละนโยบายที่คุณสร้างขึ้น
การตรวจสอบระยะเวลาทำงาน
จากหน้าการตรวจสอบระยะเวลาทำงาน ให้เลือกลบจากเมนูการทำงานที่ด้านขวาของการตรวจสอบแต่ละรายการที่คุณสร้างขึ้น
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 และสร้างแดชบอร์ดที่กำหนดเองแล้ว
- เราได้กำหนดค่าการตรวจสอบระยะเวลาทำงานพร้อมกับนโยบายการแจ้งเตือน เพื่อแจ้งให้เราทราบเมื่อเว็บเซิร์ฟเวอร์หยุดทำงาน