LB ของ HTTP ภายนอกที่มี Advanced Traffic Management (Envoy) Codelab

1. บทนำ

ยินดีต้อนรับสู่ Codelab ตัวจัดสรรภาระงาน HTTP ภายนอกที่มีการจัดการการรับส่งข้อมูลขั้นสูง (Envoy)

ตัวจัดสรรภาระงาน HTTP(S) ภายนอกเวอร์ชันล่าสุดที่มีการจัดการการรับส่งข้อมูลขั้นสูงมีฟีเจอร์ทั้งหมดของตัวจัดสรรภาระงาน HTTP(S) ภายนอกแบบคลาสสิกที่มีอยู่ แต่มีรายการความสามารถในการจัดการการรับส่งข้อมูลขั้นสูงที่เพิ่มขึ้นเรื่อยๆ ความสามารถบางอย่างเป็นความสามารถใหม่สำหรับ Load Balancer ของเรา และบางอย่างก็เป็นฟีเจอร์ที่ได้รับการปรับปรุงสำหรับความสามารถที่มีอยู่ ความสามารถบางส่วนมีดังนี้

  • การแยกการรับส่งข้อมูลแบบระบุน้ำหนัก
  • ขอการมิเรอร์
  • การตรวจจับค่าผิดปกติ
  • การส่งคำขอซ้ำ
  • Fault Injection
  • ตัวเลือกเพิ่มเติมสำหรับเซสชันแอฟฟินิตี้ของแบ็กเอนด์
  • ตัวเลือกการเปลี่ยนรูปแบบส่วนหัวเพิ่มเติม
  • กลไกการแชร์ทรัพยากรข้ามโดเมน (CORS)
  • อัลกอริทึมการจัดสรรภาระงานใหม่

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

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

สิ่งที่ต้องมี

  • ความรู้พื้นฐานด้านเครือข่ายและความรู้เกี่ยวกับ HTTP
  • ความรู้พื้นฐานเกี่ยวกับบรรทัดคำสั่ง Unix/Linux

โทโพโลยีและกรณีการใช้งาน Codelab

dd8bd5e8e1341878.png

รูปที่ 1 - โทโพโลยีการกำหนดเส้นทางการจัดสรรภาระงาน HTTP

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

2. การตั้งค่าและข้อกำหนด

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

  1. ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณอาจลองใช้ชื่อของคุณเองและดูว่ามีชื่อนั้นหรือไม่ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้จะไม่เสียค่าใช้จ่ายมากนัก หรืออาจไม่เสียเลย หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

เริ่มต้น Cloud Shell

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

จาก Google Cloud Console ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 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 แบบง่ายที่แสดงผลดังนี้

c87ca81d3125ac61.png

หากต้องการให้เว็บเซิร์ฟเวอร์ทำงานอย่างถูกต้อง ให้ไปที่ 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 ไปที่แท็บการตรวจสอบ แล้วคุณจะเห็นแผนภูมิด้านล่าง

f4d6803db44be253.png

คุณจะเห็นการแยกการเข้าชมแบบเรียลไทม์ไปยัง MIG นี้ การเข้าชมจะแยกออกเป็นจำนวนเท่ากันเนื่องจากคุณกำหนดค่าการแยกแบบ Round Robin 50/50

หากต้องการตรวจสอบว่านโยบายการมิเรอร์การรับส่งข้อมูลที่คุณสร้างใช้งานได้หรือไม่ คุณต้องตรวจสอบการใช้งานกลุ่มอินสแตนซ์ที่จัดการของ central-backend-service โดยไปที่ Compute, Compute Engine, กลุ่มอินสแตนซ์ แล้วเลือก us-central1-mig จากนั้นไปที่แท็บการตรวจสอบ

cf25e44d511529e7.png

คุณจะเห็นแผนภูมิที่แสดงว่ามีการจำลองการเข้าชมไปยังกลุ่มอินสแตนซ์ที่มีการจัดการนี้

หยุดการปิดล้อม

ตอนนี้คุณได้แสดงให้เห็นแล้วว่าการแยกการเข้าชมขั้นสูงใช้งานได้แล้ว ก็ถึงเวลาหยุดการโจมตี หากต้องการทำเช่นนั้น ให้กลับไปที่เทอร์มินัล 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 และอื่นๆ อีกมากมาย ( ลิงก์)