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

1. บทนำ

ยินดีต้อนรับสู่ LB ของ HTTP ภายนอกที่มี Advanced Traffic Management (Envoy) Codelab

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

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

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

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

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

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

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

dd8bd5e8e1341878.png

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

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

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

การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

เริ่มต้น Cloud Shell

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

จากคอนโซล GCP ให้คลิกไอคอน Cloud Shell บนแถบเครื่องมือด้านขวาบนดังนี้

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

ก่อนเริ่มต้น

ตรวจสอบว่าตั้งค่ารหัสโปรเจ็กต์ใน Cloud Shell แล้ว

โปรเจ็กต์รายการการกำหนดค่า gcloud

โปรเจ็กต์ชุดการกำหนดค่า gcloud [YOUR-PROJECT-NAME]

PROJECT_ID=[YOUR-PROJECT-NAME]

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

อินสแตนซ์ที่มีการจัดการจะเป็นระดับโซนหรือระดับภูมิภาคก็ได้ สำหรับแบบฝึกหัดในห้องทดลองนี้ เราจะสร้างอินสแตนซ์ที่มีการจัดการระดับภูมิภาค 3 กลุ่ม คือ กลุ่มใน us-east1, กลุ่ม us-west1 และ 1 ใน 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-9 \
   --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-9 \
   --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-9 \
   --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) ตามคำจำกัดความของอินสแตนซ์แล้ว

ทีนี้ให้สร้างคำขอเว็บในเบราว์เซอร์เพื่อตรวจสอบว่าเว็บเซิร์ฟเวอร์ทำงานอยู่ (การดำเนินการนี้อาจใช้เวลาสักครู่ในการเริ่มต้น) ในหน้าอินสแตนซ์ 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

สร้างบริการแบ็กเอนด์

ตอนนี้เราต้องสร้างบริการแบ็กเอนด์สำหรับกลุ่มอินสแตนซ์ที่มีการจัดการแต่ละกลุ่มที่เราสร้างไว้ก่อนหน้านี้ พื้นที่หนึ่งสำหรับฝั่งตะวันออก ตะวันตก และตอนกลาง

การสร้างบริการแบ็กเอนด์สำหรับกลุ่มอินสแตนซ์ที่มีการจัดการแบบตะวันออก

จาก 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

การสร้างบริการแบ็กเอนด์สำหรับกลุ่มอินสแตนซ์ที่มีการจัดการโดย Central

จาก 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 ไปยังบริการแบ็กเอนด์

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

เพิ่ม East 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

เพิ่ม West 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

เพิ่ม Central 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

แมป URL คือส่วนที่ฟีเจอร์การจัดการการรับส่งข้อมูลขั้นสูงสำหรับห้องทดลองนี้จะให้บริการอยู่ เราต้องสร้างไฟล์ .yaml ซึ่งจะมีการกำหนดค่า ภายในไฟล์ .yaml เราได้สร้างการจับคู่คำนำหน้าใน /roundrobbin ไว้ ดังนั้นมีเพียงการรับส่งที่ตรงกับ /roundrobbin เท่านั้นที่จะได้รับผลกระทบจากการกำหนดค่าเหล่านี้ เราได้ระบุว่า 50% ของการเข้าชมควรไปที่บริการด้านแบ็กเอนด์ และ 50% ควรไปที่บริการแบ็กเอนด์ทางตะวันตก นอกจากนี้ เราได้เพิ่มค่าส่วนหัวของการตอบกลับ {test} ซึ่งจะแสดงในการตอบกลับทั้งหมด สุดท้าย เราได้เพิ่มว่าการรับส่งข้อมูลทั้งหมดควรมิเรอร์ไปยังบริการแบ็กเอนด์ส่วนกลาง การรับส่งข้อมูลจะทำสำเนาและส่งมาที่นี่เพื่อการทดสอบเท่านั้น

บันทึกตัวอย่างเป็นไฟล์ .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 Map เพื่อนำเข้าเอกสารจากเครื่องของคุณ โปรดทราบว่าเส้นทางแหล่งที่มาจะแตกต่างออกไป ขึ้นอยู่กับตำแหน่งที่คุณบันทึกไฟล์ .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 ให้คลิกบริการเครือข่าย > ในเมนูการนำทาง การจัดสรรภาระงาน เลือก Web-map-http ของตัวจัดสรรภาระงาน ไปที่แท็บการตรวจสอบ คุณจะเห็นแผนภูมิด้านล่าง

f4d6803db44be253.png

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

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

cf25e44d511529e7.png

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

หยุดยั้ง

ตอนนี้คุณได้แสดงให้เห็นว่าการแยกการเข้าชมขั้นสูงใช้ได้ผลแล้ว ตอนนี้ก็ถึงเวลาที่จะหยุดการโจมตี หากต้องการดำเนินการดังกล่าว ให้กลับไปที่เทอร์มินัล SSH ของ siege-vm แล้วกด Ctrl+C เพื่อหยุดการป้องกัน

ตรวจสอบส่วนหัวของการตอบกลับที่ส่ง

ก่อนทำความสะอาด คุณจะตรวจสอบได้อย่างรวดเร็วว่าตัวจัดสรรภาระงาน 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. ทำความสะอาดห้องปฏิบัติการ

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

จาก 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. ยินดีด้วย

คุณได้ทำ LB ของ HTTP ภายนอกด้วย Advanced Traffic Management (Envoy) Codelab เรียบร้อยแล้ว

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

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

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

  • ลองใช้ฟีเจอร์การกำหนดเส้นทางขั้นสูงอื่นๆ เช่น การเขียน URL ใหม่, การเพิ่มส่วนหัว CORS และอีกมากมาย ( ลิงก์)