1. บทนำ
ยินดีต้อนรับสู่ Codelab ตัวจัดสรรภาระงาน HTTP ภายนอกที่มีการจัดการการรับส่งข้อมูลขั้นสูง (Envoy)
ตัวจัดสรรภาระงาน HTTP(S) ภายนอกเวอร์ชันล่าสุดที่มีการจัดการการรับส่งข้อมูลขั้นสูงมีฟีเจอร์ทั้งหมดของตัวจัดสรรภาระงาน HTTP(S) ภายนอกแบบคลาสสิกที่มีอยู่ แต่มีรายการความสามารถในการจัดการการรับส่งข้อมูลขั้นสูงที่เพิ่มขึ้นเรื่อยๆ ความสามารถบางอย่างเป็นความสามารถใหม่สำหรับ Load Balancer ของเรา และบางอย่างก็เป็นฟีเจอร์ที่ได้รับการปรับปรุงสำหรับความสามารถที่มีอยู่ ความสามารถบางส่วนมีดังนี้
- การแยกการรับส่งข้อมูลแบบระบุน้ำหนัก
- ขอการมิเรอร์
- การตรวจจับค่าผิดปกติ
- การส่งคำขอซ้ำ
- Fault Injection
- ตัวเลือกเพิ่มเติมสำหรับเซสชันแอฟฟินิตี้ของแบ็กเอนด์
- ตัวเลือกการเปลี่ยนรูปแบบส่วนหัวเพิ่มเติม
- กลไกการแชร์ทรัพยากรข้ามโดเมน (CORS)
- อัลกอริทึมการจัดสรรภาระงานใหม่
สิ่งที่คุณจะได้เรียนรู้
- วิธีกำหนดค่ากลุ่มอินสแตนซ์ที่มีการจัดการ รวมถึง VPC และกฎไฟร์วอลล์ที่เชื่อมโยง
- วิธีใช้ฟีเจอร์การจัดการการรับส่งข้อมูลขั้นสูงของตัวปรับสมดุลภาระงานใหม่
- วิธีตรวจสอบว่าฟีเจอร์การจัดการการรับส่งข้อมูลขั้นสูงทำงานได้ตามที่ต้องการ
สิ่งที่ต้องมี
- ความรู้พื้นฐานด้านเครือข่ายและความรู้เกี่ยวกับ HTTP
- ความรู้พื้นฐานเกี่ยวกับบรรทัดคำสั่ง Unix/Linux
โทโพโลยีและกรณีการใช้งาน Codelab
รูปที่ 1 - โทโพโลยีการกำหนดเส้นทางการจัดสรรภาระงาน HTTP
ในโค้ดแล็บนี้ คุณจะได้ตั้งค่ากลุ่มอินสแตนซ์ที่มีการจัดการ 3 กลุ่ม โดยกลุ่มหนึ่งอยู่ในภาคตะวันออก ภาคตะวันตก และภาคกลาง คุณจะสร้างตัวจัดสรรภาระงาน HTTPS ภายนอกทั่วโลก ตัวจัดสรรภาระงานจะใช้ฟีเจอร์หลายอย่างจากรายการความสามารถขั้นสูงที่ตัวจัดสรรภาระงานที่อิงตาม Envoy รองรับ เมื่อติดตั้งใช้งานแล้ว คุณจะสร้างภาระงานจำลองและยืนยันว่าการกำหนดค่าที่คุณตั้งไว้ทำงานได้อย่างเหมาะสม
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น
PROJECT_ID
) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณอาจลองใช้ชื่อของคุณเองและดูว่ามีชื่อนั้นหรือไม่ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้จะไม่เสียค่าใช้จ่ายมากนัก หรืออาจไม่เสียเลย หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
เริ่มต้น Cloud Shell
แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลจากแล็ปท็อปได้ แต่ใน Codelab นี้คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
จาก Google Cloud Console ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน
การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อเสร็จแล้ว คุณควรเห็นข้อความคล้ายกับตัวอย่างนี้
เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานบน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานทั้งหมดในโค้ดแล็บนี้ได้ภายในเบราว์เซอร์ คุณไม่จำเป็นต้องติดตั้งอะไร
ก่อนเริ่มต้น
ตรวจสอบว่าได้ตั้งค่ารหัสโปรเจ็กต์ใน Cloud Shell แล้ว
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
PROJECT_ID=[YOUR-PROJECT-NAME]
echo $PROJECT_ID
เปิดใช้ API
เปิดใช้บริการทั้งหมดที่จำเป็น
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com
3. สร้างเครือข่าย VPC
สร้างเครือข่าย VPC
จาก Cloud Shell
gcloud compute networks create httplbs --subnet-mode=auto
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/httplbs]. NAME: httplbs SUBNET_MODE: AUTO BGP_ROUTING_MODE: REGIONAL IPV4_RANGE: GATEWAY_IPV4:
สร้างกฎไฟร์วอลล์ VPC
หลังจากสร้าง VPC แล้ว ตอนนี้คุณจะสร้างกฎไฟร์วอลล์ ระบบจะใช้กฎไฟร์วอลล์เพื่ออนุญาตให้ IP ทั้งหมดเข้าถึง IP ภายนอกของเว็บไซต์แอปพลิเคชันทดสอบในพอร์ต 80 สำหรับการรับส่งข้อมูล http
จาก Cloud Shell
gcloud compute firewall-rules create httplb-allow-http-rule \ --allow tcp:80 \ --network httplbs \ --source-ranges 0.0.0.0/0 \ --priority 700
เอาต์พุต
Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/httplb-allow-http-rule]. Creating firewall...done. NAME: httplb-allow-http-rule NETWORK: httplbs DIRECTION: INGRESS PRIORITY: 700 ALLOW: tcp:80 DENY: DISABLED: False
4. ตั้งค่ากลุ่มอินสแตนซ์ที่มีการจัดการ
คุณต้องตั้งค่ากลุ่มอินสแตนซ์ที่มีการจัดการซึ่งมีรูปแบบสำหรับทรัพยากรแบ็กเอนด์ที่ใช้โดยตัวจัดสรรภาระงาน HTTP ก่อนอื่นเราจะสร้างเทมเพลตอินสแตนซ์ซึ่งกำหนดค่าสำหรับ VM ที่จะสร้างขึ้นสำหรับแต่ละภูมิภาค จากนั้นสำหรับแบ็กเอนด์ในแต่ละภูมิภาค เราจะสร้างกลุ่มอินสแตนซ์ที่มีการจัดการซึ่งอ้างอิงเทมเพลตอินสแตนซ์
กลุ่มอินสแตนซ์ที่มีการจัดการอาจมีขอบเขตเป็นระดับโซนหรือระดับภูมิภาค สำหรับการฝึกปฏิบัติใน Lab นี้ เราจะสร้างกลุ่มอินสแตนซ์ที่มีการจัดการระดับภูมิภาค 3 กลุ่ม โดยกลุ่มหนึ่งอยู่ใน us-east1, อีกกลุ่มหนึ่งอยู่ใน us-west1 และอีกกลุ่มหนึ่งอยู่ใน us-central1
ในส่วนนี้ คุณจะเห็นสคริปต์เริ่มต้นที่สร้างไว้ล่วงหน้าซึ่งจะอ้างอิงเมื่อสร้างอินสแตนซ์ สคริปต์เริ่มต้นนี้จะติดตั้งและเปิดใช้ความสามารถของเว็บเซิร์ฟเวอร์ซึ่งเราจะใช้เพื่อจำลองเว็บแอปพลิเคชัน คุณสามารถสำรวจสคริปต์นี้ได้
สร้างเทมเพลตอินสแตนซ์ตะวันออก ตะวันตก และตอนกลาง
ขั้นตอนแรกคือการสร้างเทมเพลตอินสแตนซ์ us-east-1
จาก Cloud Shell
gcloud compute instance-templates create us-east1-template \ --region=us-east1 \ --network=httplbs \ --tags=http-server, \ --image-family=debian-12 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates/us-east1-template]. NAME: us-east1-template MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: CREATION_TIMESTAMP: 2021-11-11T11:02:37.511-08:00
ขั้นตอนถัดไปคือการสร้างเทมเพลตอินสแตนซ์ us-west-1
จาก Cloud Shell
gcloud compute instance-templates create us-west1-template \ --region=us-west1 \ --network=httplbs \ --tags=http-server, \ --image-family=debian-12 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates/us-west1-template]. NAME: us-west1-template MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: CREATION_TIMESTAMP: 2021-11-11T11:03:08.577-08:00
ขั้นตอนถัดไปคือการสร้างเทมเพลตอินสแตนซ์ us-central-1
จาก Cloud Shell
gcloud compute instance-templates create us-central1-template \ --region=us-central1 \ --network=httplbs \ --tags=http-server, \ --image-family=debian-12 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates/us-central1-template]. NAME: us-central1-template MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: CREATION_TIMESTAMP: 2021-11-11T11:03:44.179-08:00
ตอนนี้คุณสามารถยืนยันว่าสร้างเทมเพลตอินสแตนซ์เรียบร้อยแล้วได้ด้วยคำสั่ง gcloud ต่อไปนี้
จาก Cloud Shell
gcloud compute instance-templates list
เอาต์พุต
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP us-central1-template n1-standard-1 2021-11-09T09:25:37.263-08:00 us-east1-template n1-standard-1 2021-11-09T09:24:35.275-08:00 us-west1-template n1-standard-1 2021-11-09T09:25:08.016-08:00
สร้างกลุ่มอินสแตนซ์ที่มีการจัดการของภาคตะวันออก ตะวันตก และตอนกลาง
ตอนนี้เราต้องสร้างกลุ่มอินสแตนซ์ที่มีการจัดการจากเทมเพลตอินสแตนซ์ที่เราสร้างไว้ก่อนหน้านี้
จาก Cloud Shell
gcloud compute instance-groups managed create us-east1-mig \ --base-instance-name=us-east1-mig \ --size=1 \ --template=us-east1-template \ --zone=us-east1-b
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-b/instanceGroupManagers/us-east1-mig]. NAME: us-east1-mig LOCATION: us-east1-b SCOPE: zone BASE_INSTANCE_NAME: us-east1-mig SIZE: 0 TARGET_SIZE: 1 INSTANCE_TEMPLATE: us-east1-template AUTOSCALED: no
จาก Cloud Shell
gcloud compute instance-groups managed create us-west1-mig \ --base-instance-name=us-west1-mig \ --size=1 \ --template=us-west1-template \ --zone=us-west1-a
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroupManagers/us-west1-mig]. NAME: us-west1-mig LOCATION: us-west1-a SCOPE: zone BASE_INSTANCE_NAME: us-west1-mig SIZE: 0 TARGET_SIZE: 1 INSTANCE_TEMPLATE: us-west1-template AUTOSCALED: no
จาก Cloud Shell
gcloud compute instance-groups managed create us-central1-mig \ --base-instance-name=us-central1-mig \ --size=1 \ --template=us-central1-template \ --zone=us-central1-a
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-central1-a/instanceGroupManagers/us-central1-mig]. NAME: us-central1-mig LOCATION: us-central1-a SCOPE: zone BASE_INSTANCE_NAME: us-central1-mig SIZE: 0 TARGET_SIZE: 1 INSTANCE_TEMPLATE: us-central1-template AUTOSCALED: no
เราสามารถยืนยันว่าสร้างกลุ่มอินสแตนซ์ได้สำเร็จด้วยคำสั่ง gcloud ต่อไปนี้
จาก Cloud Shell
gcloud compute instance-groups list
เอาต์พุต
NAME LOCATION SCOPE NETWORK MANAGED INSTANCES us-central1-mig us-central1 zone httplbs Yes 1 us-west1-mig us-west1 zone httplbs Yes 1 us-east1-mig us-east1 zone httplbs Yes 1
ยืนยันฟังก์ชันการทำงานของเว็บเซิร์ฟเวอร์
อินสแตนซ์แต่ละรายการได้รับการกำหนดค่าให้เรียกใช้เว็บเซิร์ฟเวอร์ Apache ด้วยสคริปต์ PHP แบบง่ายที่แสดงผลดังนี้
หากต้องการให้เว็บเซิร์ฟเวอร์ทำงานอย่างถูกต้อง ให้ไปที่ Compute Engine -> อินสแตนซ์ VM ตรวจสอบว่าอินสแตนซ์ใหม่ (เช่น us-east1-mig-xxx) สร้างขึ้นตามคำจำกัดความของกลุ่มอินสแตนซ์
ตอนนี้ให้ส่งคำขอเว็บในเบราว์เซอร์ไปยังอินสแตนซ์เพื่อให้แน่ใจว่าเว็บเซิร์ฟเวอร์ทำงานอยู่ (อาจใช้เวลา 1 นาทีในการเริ่มต้น) ในหน้าอินสแตนซ์ VM ในส่วน Compute Engine ให้เลือกอินสแตนซ์ที่สร้างโดยกลุ่มอินสแตนซ์ แล้วคลิก IP ภายนอก (สาธารณะ) ของอินสแตนซ์นั้น
หรือในเบราว์เซอร์ ให้ไปที่ http://<IP_Address>
5. ตั้งค่าตัวจัดสรรภาระงาน
สร้างการตรวจสอบประสิทธิภาพการทำงาน
ก่อนอื่นเราต้องสร้างการตรวจสอบสถานะพื้นฐานเพื่อให้มั่นใจว่าบริการของเราพร้อมใช้งานและทำงานได้สำเร็จ เราจะสร้างการตรวจสอบประสิทธิภาพการทำงานขั้นพื้นฐาน แต่ก็มีการปรับแต่งขั้นสูงอีกมากมายให้ใช้งาน
จาก Cloud Shell
gcloud compute health-checks create http http-basic-check \ --port 80
จองที่อยู่ IP ภายนอก
สำหรับขั้นตอนนี้ คุณจะต้องจองที่อยู่ IP แบบคงที่ที่พร้อมใช้งานทั่วโลก ซึ่งจะเชื่อมต่อกับตัวจัดสรรภาระงานในภายหลัง
จาก Cloud Shell
gcloud compute addresses create lb-ipv4-2 \ --ip-version=IPV4 \ --global
อย่าลืมจดที่อยู่ IP ที่จองไว้
gcloud compute addresses describe lb-ipv4-2 \ --format="get(address)" \ --global
สร้างบริการแบ็กเอนด์
ตอนนี้เราต้องสร้างบริการแบ็กเอนด์สำหรับกลุ่มอินสแตนซ์ที่มีการจัดการแต่ละกลุ่มที่เราสร้างไว้ก่อนหน้านี้ โดยมี 1 รายการสำหรับภาคตะวันออก ภาคตะวันตก และภาคกลาง
สร้างบริการแบ็กเอนด์สำหรับกลุ่มอินสแตนซ์ที่มีการจัดการในฝั่งตะวันออก
จาก Cloud Shell
gcloud compute backend-services create east-backend-service \ --load-balancing-scheme=EXTERNAL_MANAGED \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global
สร้างบริการแบ็กเอนด์สำหรับกลุ่มอินสแตนซ์ที่มีการจัดการในภูมิภาคตะวันตก
จาก Cloud Shell
gcloud compute backend-services create west-backend-service \ --load-balancing-scheme=EXTERNAL_MANAGED \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global
การสร้างบริการแบ็กเอนด์สำหรับกลุ่มอินสแตนซ์ที่มีการจัดการส่วนกลาง
จาก Cloud Shell
gcloud compute backend-services create central-backend-service \ --load-balancing-scheme=EXTERNAL_MANAGED \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global
เพิ่ม MIG ลงในบริการแบ็กเอนด์
ตอนนี้เราได้สร้างบริการแบ็กเอนด์ที่เกี่ยวข้องสำหรับคลัสเตอร์แอปพลิเคชันแต่ละคลัสเตอร์แล้ว เราจึงต้องเพิ่มกลุ่มอินสแตนซ์ที่มีการจัดการที่เราสร้างไว้ก่อนหน้านี้ลงในบริการแบ็กเอนด์แต่ละรายการ
เพิ่ม MIG ตะวันออกไปยังบริการแบ็กเอนด์
จาก Cloud Shell
gcloud compute backend-services add-backend east-backend-service \ --balancing-mode='UTILIZATION' \ --instance-group=us-east1-mig \ --instance-group-zone=us-east1-b \ --global
เพิ่ม MIG ตะวันตกไปยังบริการแบ็กเอนด์
จาก Cloud Shell
gcloud compute backend-services add-backend west-backend-service \ --balancing-mode='UTILIZATION' \ --instance-group=us-west1-mig \ --instance-group-zone=us-west1-a \ --global
เพิ่ม MIG กลางลงในบริการแบ็กเอนด์
จาก Cloud Shell
gcloud compute backend-services add-backend central-backend-service \ --balancing-mode='UTILIZATION' \ --instance-group=us-central1-mig \ --instance-group-zone=us-central1-a \ --global
สร้าง URL Map
แผนที่ URL คือที่อยู่ของฟีเจอร์การจัดการการเข้าชมขั้นสูงสำหรับห้องทดลองนี้ เราต้องสร้างไฟล์ .yaml ซึ่งจะมีการกำหนดค่า ภายในไฟล์ .yaml เราได้สร้างการจับคู่คำนำหน้าใน /roundrobbin ดังนั้นเฉพาะการเข้าชมที่ตรงกับ /roundrobbin เท่านั้นที่จะได้รับผลกระทบจากการกำหนดค่าเหล่านี้ เราได้ระบุว่าการเข้าชม 50% ควรไปที่ east-backend-service และการเข้าชม 50% ควรไปที่ west-backend-service นอกจากนี้ เรายังได้เพิ่มค่าส่วนหัวการตอบกลับ:{test} ซึ่งจะอยู่ในคำตอบทั้งหมด สุดท้าย เราได้เพิ่มว่าควรมิเรอร์การรับส่งข้อมูลทั้งหมดไปยัง central-backend-service ระบบจะทำซ้ำการเข้าชมและส่งมาที่นี่เพื่อการทดสอบเท่านั้น
บันทึกตัวอย่างเป็นไฟล์ .yaml ในเครื่อง
defaultService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/east-backend-service kind: compute #urlMap name: web-map-http hostRules: - hosts: - '*' pathMatcher: matcher1 pathMatchers: - defaultService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/east-backend-service name: matcher1 routeRules: - matchRules: - prefixMatch: /roundrobbin priority: 2 headerAction: responseHeadersToAdd: - headerName: test headerValue: value replace: True routeAction: weightedBackendServices: - backendService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/east-backend-service weight: 50 - backendService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/west-backend-service weight: 50 retryPolicy: retryConditions: ['502', '504'] numRetries: 3 perTryTimeout: seconds: 1 nanos: 50 requestMirrorPolicy: backendService: https://www.googleapis.com/compute/v1/projects/[project_id]/global/backendServices/central-backend-service
สร้างแผนที่ URL โดยการนำเข้าเอกสารจากเครื่อง โปรดทราบว่าเส้นทางแหล่งที่มาจะแตกต่างกันไปตามตำแหน่งที่คุณบันทึกไฟล์ .yaml
จาก Cloud Shell
gcloud compute url-maps import web-map-http \ --source /Users/[USERNAME]/Documents/Codelab/lbconfig.yaml \ --global
สร้างฟรอนท์เอนด์ HTTP
ขั้นตอนสุดท้ายในการสร้างตัวจัดสรรภาระงานคือการสร้างส่วนหน้า ซึ่งจะแมปที่อยู่ IP ที่คุณจองไว้ก่อนหน้านี้กับแมป URL ของตัวจัดสรรภาระงานที่คุณสร้างขึ้น
จาก Cloud Shell
gcloud compute target-http-proxies create http-lb-proxy-adv \ --url-map=web-map-http
จากนั้นคุณต้องสร้างกฎการส่งต่อส่วนกลางซึ่งจะแมปที่อยู่ IP ที่จองไว้ก่อนหน้านี้กับพร็อกซี HTTP
จาก Cloud Shell
gcloud compute forwarding-rules create http-content-rule \ --load-balancing-scheme EXTERNAL_MANAGED \ --address=lb-ipv4-2 \ --global \ --target-http-proxy=http-lb-proxy-adv \ --ports=80
6. ตรวจสอบว่าฟีเจอร์การเข้าชมขั้นสูงทำงานอยู่
คุณต้องสร้างภาระงานบางอย่างเพื่อยืนยันว่าฟีเจอร์การแยกการเข้าชมที่ใช้งานได้นั้นทำงานได้ โดยเราจะสร้าง VM ใหม่เพื่อจำลองการโหลด
สร้างกฎไฟร์วอลล์ที่อนุญาต SSH
หากต้องการใช้ SSH เพื่อเข้าถึง VM ที่เราจะสร้างการรับส่งข้อมูลจากคุณ ก่อนอื่นคุณต้องสร้างกฎไฟร์วอลล์ที่จะอนุญาตการรับส่งข้อมูล SSH ไปยัง VM
จาก Cloud Shell
gcloud compute firewall-rules create fw-allow-ssh \ --network=httplbs \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --rules=tcp:22
เอาต์พุต
NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED fw-allow-ssh httplbs INGRESS 1000 tcp:22 False
สร้าง Siege-vm
ตอนนี้คุณจะสร้าง siege-vm ซึ่งจะใช้เพื่อสร้างโหลด
จาก Cloud Shell
gcloud compute instances create siege-vm \ --network=httplbs \ --zone=us-east4-c \ --machine-type=e2-medium \ --tags=allow-ssh,http-server \ --metadata=startup-script='sudo apt-get -y install siege'
เอาต์พุต
NAME ZONE MACHINE_TYPE INTERNAL_IP EXTERNAL_IP STATUS siege-vm us-east4-c e2-medium 10.150.0.3 34.85.218.119 RUNNING
จากนั้นคุณจะ SSH เข้าสู่ VM ที่สร้างขึ้นได้ เมื่อสร้างแล้ว ให้คลิก SSH เพื่อเปิดใช้เทอร์มินัลและเชื่อมต่อ
เมื่อเชื่อมต่อแล้ว ให้เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างโหลด ใช้ที่อยู่ IP ที่คุณจองไว้ก่อนหน้านี้สำหรับตัวจัดสรรภาระงาน HTTP ภายนอก
จาก Cloud Shell
siege -c 250 http://[$lb-ipv4-2]/roundrobbin
เอาต์พุต
New configuration template added to /home/cloudcurriculumdeveloper/.siege Run siege -C to view the current settings in that file [alert] Zip encoding disabled; siege requires zlib support to enable it: No such file or directory ** SIEGE 4.0.2 ** Preparing 250 concurrent users for battle. The server is now under siege...
ตรวจสอบการกระจายโหลด
ตอนนี้ Siege กำลังทำงานแล้ว ถึงเวลาตรวจสอบว่าการรับส่งข้อมูลได้รับการกระจายอย่างเท่าเทียมกันไปยังกลุ่มอินสแตนซ์ที่มีการจัดการทางฝั่งตะวันออกและตะวันตก นอกจากนี้ คุณยังตรวจสอบได้ว่าการมิเรอร์การรับส่งข้อมูลทำงานอยู่ และมีการส่งการรับส่งข้อมูลไปยังกลุ่มอินสแตนซ์ที่มีการจัดการส่วนกลาง
ใน Cloud Console ให้คลิกบริการเครือข่าย > การปรับสมดุลโหลดในเมนูการนำทาง เลือก load-balancer-web-map-http ไปที่แท็บการตรวจสอบ แล้วคุณจะเห็นแผนภูมิด้านล่าง
คุณจะเห็นการแยกการเข้าชมแบบเรียลไทม์ไปยัง MIG นี้ การเข้าชมจะแยกออกเป็นจำนวนเท่ากันเนื่องจากคุณกำหนดค่าการแยกแบบ Round Robin 50/50
หากต้องการตรวจสอบว่านโยบายการมิเรอร์การรับส่งข้อมูลที่คุณสร้างใช้งานได้หรือไม่ คุณต้องตรวจสอบการใช้งานกลุ่มอินสแตนซ์ที่จัดการของ central-backend-service โดยไปที่ Compute, Compute Engine, กลุ่มอินสแตนซ์ แล้วเลือก us-central1-mig จากนั้นไปที่แท็บการตรวจสอบ
คุณจะเห็นแผนภูมิที่แสดงว่ามีการจำลองการเข้าชมไปยังกลุ่มอินสแตนซ์ที่มีการจัดการนี้
หยุดการปิดล้อม
ตอนนี้คุณได้แสดงให้เห็นแล้วว่าการแยกการเข้าชมขั้นสูงใช้งานได้แล้ว ก็ถึงเวลาหยุดการโจมตี หากต้องการทำเช่นนั้น ให้กลับไปที่เทอร์มินัล SSH ของ siege-vm แล้วกด CTRL+C เพื่อหยุดการทำงานของ Siege
ตรวจสอบว่ามีการส่งส่วนหัวการตอบกลับ
ก่อนที่จะล้างข้อมูล คุณสามารถตรวจสอบได้อย่างรวดเร็วว่าตัวจัดสรรภาระงาน HTTP ส่งส่วนหัวการตอบกลับที่เหมาะสม คุณได้กำหนดค่าให้ส่งการทดสอบส่วนหัวพร้อมค่าเนื้อหา การเรียกใช้คำสั่ง curl จาก Cloud Shell จะให้การตอบกลับที่คาดไว้
จาก Cloud Shell
curl -svo /dev/null http://lb-ipv4-2/roundrobbin
เอาต์พุต
* Trying lb-ipv4-2.. * TCP_NODELAY set * Connected to lb-ipv4-2 ( lb-ipv4-2) port 80 (#0) > GET /roundrobbin HTTP/1.1 > Host: lb-ipv4-2 > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 404 Not Found < date: Wed, 10 Nov 2021 17:05:27 GMT < server: envoy < Content-Length: 273 < content-type: text/html; charset=iso-8859-1 < via: 1.1 google < test: value < { [273 bytes data] * Connection #0 to host 34.149.2.26 left intact * Closing connection 0
7. การล้างข้อมูลใน Lab
เมื่อเราใช้สภาพแวดล้อมของ Lab เสร็จแล้ว ก็ถึงเวลาปิด โปรดเรียกใช้คำสั่งต่อไปนี้เพื่อลบสภาพแวดล้อมการทดสอบ
จาก Cloud Shell
gcloud compute instances delete siege-vm --zone=us-east4-c gcloud compute forwarding-rules delete http-content-rule --global gcloud compute target-http-proxies delete http-lb-proxy-adv gcloud compute url-maps delete web-map-http gcloud compute backend-services delete east-backend-service --global gcloud compute backend-services delete west-backend-service --global gcloud compute backend-services delete central-backend-service --global gcloud compute addresses delete lb-ipv4-2 --global gcloud compute health-checks delete http-basic-check gcloud compute instance-groups managed delete us-east1-mig --zone us-east1-b gcloud compute instance-groups managed delete us-west1-mig --zone us-west1-a gcloud compute instance-groups managed delete us-central1-mig --zone us-central1-a gcloud compute instance-templates delete "us-east1-template" gcloud compute instance-templates delete "us-west1-template" gcloud compute instance-templates delete "us-central1-template" gcloud compute firewall-rules delete httplb-allow-http-rule gcloud compute firewall-rules delete fw-allow-ssh gcloud compute networks delete httplbs
8. ยินดีด้วย
คุณทำ Codelab ตัวจัดสรรภาระงาน HTTP ภายนอกที่มีการจัดการการรับส่งข้อมูลขั้นสูง (Envoy) เสร็จแล้ว
สิ่งที่เราได้พูดถึง
- วิธีกำหนดค่ากลุ่มอินสแตนซ์ที่มีการจัดการ รวมถึง VPC และกฎไฟร์วอลล์ที่เชื่อมโยง
- วิธีใช้ฟีเจอร์การจัดการการรับส่งข้อมูลขั้นสูงของตัวปรับสมดุลภาระงานใหม่
- วิธีตรวจสอบว่าฟีเจอร์การจัดการการรับส่งข้อมูลขั้นสูงทำงานได้ตามที่ต้องการ
ขั้นตอนถัดไป
- ลองใช้ฟีเจอร์การกำหนดเส้นทางขั้นสูงอื่นๆ เช่น การเขียน URL ใหม่ การเพิ่มส่วนหัว CORS และอื่นๆ อีกมากมาย ( ลิงก์)