การจัดสรรภาระงานเครือข่ายแบบถ่วงน้ำหนักต่ออินสแตนซ์

1. บทนำ

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

การจัดสรรภาระงานแบบถ่วงน้ำหนักกำหนดให้คุณต้องกำหนดค่าทั้ง 2 อย่างต่อไปนี้

  • คุณต้องตั้งค่านโยบายการจัดสรรภาระงานภายใน (localityLbPolicy) ของบริการแบ็กเอนด์เป็น WEIGHTED_MAGLEV
  • คุณต้องกำหนดค่าบริการแบ็กเอนด์ด้วยการตรวจสอบสถานะ HTTP/HTTP2/HTTPS การตอบกลับการตรวจสอบสถานะ HTTP ต้องมีฟิลด์ส่วนหัวการตอบกลับ HTTP ที่กำหนดเอง X-Load-Balancing-Endpoint-Weight เพื่อระบุน้ำหนักด้วยค่าจำนวนเต็มตั้งแต่ 0 ถึง 1,000 ในการแสดงทศนิยมสำหรับอินสแตนซ์แบ็กเอนด์แต่ละรายการ

หากคุณใช้กลุ่มอินสแตนซ์เดียวกันเป็นแบ็กเอนด์สำหรับ Network Load Balancer ที่อิงตามบริการแบ็กเอนด์หลายรายการโดยใช้การปรับสมดุลโหลดแบบถ่วงน้ำหนัก ขอแนะนำให้ใช้เส้นทางคำขอที่ไม่ซ้ำกันสำหรับการตรวจสอบสถานะแต่ละครั้งของบริการแบ็กเอนด์ ดูข้อมูลเพิ่มเติมได้ที่เกณฑ์ความสำเร็จสำหรับการตรวจสอบสถานะ HTTP, HTTPS และ HTTP/2

การตรวจสอบประสิทธิภาพการทำงานของ HTTP ควรส่งการตอบกลับ HTTP 200 (OK) เพื่อให้การตรวจสอบประสิทธิภาพการทำงานผ่านและถือว่าอินสแตนซ์แบ็กเอนด์มีประสิทธิภาพ ในกรณีที่อินสแตนซ์แบ็กเอนด์ทั้งหมดผ่านการตรวจสอบประสิทธิภาพการทำงานและส่ง X-Load-Balancing-Endpoint-Weight ที่มีน้ำหนักเป็น 0 ตัวจัดสรรภาระงานจะกระจายการเชื่อมต่อใหม่ไปยังแบ็กเอนด์ที่มีประสิทธิภาพดีโดยถือว่ามีน้ำหนักเท่ากัน นอกจากนี้ ตัวจัดสรรภาระงานยังกระจายการเชื่อมต่อใหม่ๆ ไปยังแบ็กเอนด์ที่ไม่สมบูรณ์ได้ด้วย ดูข้อมูลเพิ่มเติมได้ที่การกระจายการเข้าชม

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

การจัดสรรภาระงานแบบถ่วงน้ำหนักสามารถใช้ได้ในสถานการณ์ต่อไปนี้

  • หากการเชื่อมต่อบางรายการประมวลผลข้อมูลมากกว่ารายการอื่นๆ หรือการเชื่อมต่อบางรายการใช้งานได้นานกว่ารายการอื่นๆ การกระจายภาระงานของแบ็กเอนด์อาจไม่สม่ำเสมอ การส่งสัญญาณน้ำหนักต่ออินสแตนซ์ที่ต่ำกว่าจะช่วยให้อินสแตนซ์ที่มีโหลดสูงลดสัดส่วนของการเชื่อมต่อใหม่ได้ ในขณะที่ยังคงให้บริการการเชื่อมต่อที่มีอยู่
  • หากแบ็กเอนด์มีภาระงานมากเกินไปและการกำหนดการเชื่อมต่อเพิ่มเติมอาจทำให้การเชื่อมต่อที่มีอยู่หยุดทำงาน แบ็กเอนด์ดังกล่าวจะกำหนดน้ำหนักเป็น 0 ให้กับตัวเอง การส่งสัญญาณว่าไม่มีน้ำหนัก อินสแตนซ์แบ็กเอนด์จะหยุดให้บริการการเชื่อมต่อใหม่ แต่จะยังคงให้บริการการเชื่อมต่อที่มีอยู่ต่อไป
  • หากแบ็กเอนด์กำลังระบายการเชื่อมต่อที่มีอยู่ก่อนการบำรุงรักษา แบ็กเอนด์จะกำหนดน้ำหนักเป็น 0 ให้กับตัวเอง การส่งสัญญาณว่าไม่มีน้ำหนักทำให้อินสแตนซ์แบ็กเอนด์หยุดให้บริการการเชื่อมต่อใหม่ แต่ยังคงให้บริการการเชื่อมต่อที่มีอยู่ต่อไป

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

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

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

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

2. เริ่มการกำหนดค่า

Codelab ต้องใช้โปรเจ็กต์เดียว

ในบทแนะนำนี้ คุณจะสร้างกลุ่มอินสแตนซ์ที่มีอินสแตนซ์ VM 3 รายการและกำหนดน้ำหนักสำหรับแต่ละอินสแตนซ์ คุณสร้างการตรวจสอบประสิทธิภาพการทำงานของ HTTP เพื่อรายงานน้ำหนักของอินสแตนซ์แบ็กเอนด์ ระบบจะเปิดใช้ตัวจัดสรรภาระงานเครือข่ายแบบถ่วงน้ำหนักในบริการแบ็กเอนด์ที่มีนโยบายการจัดสรรภาระงานภายในเป็น WEIGHTED_MAGLEV

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

gcloud services enable compute.googleapis.com

หมายเหตุ: คุณใช้ Google Cloud Console เพื่อกำหนดค่านโยบายเครื่องมือจัดสรรภาระงานตามสถานที่ตั้งและกำหนดน้ำหนักให้กับอินสแตนซ์ VM ไม่ได้ โปรดใช้ Google Cloud CLI แทน

สร้างเครือข่าย VPC, ซับเน็ต และกฎไฟร์วอลล์

สร้างเครือข่าย VPC, ซับเน็ต และกฎไฟร์วอลล์ที่อนุญาตให้มีการรับส่งข้อมูลขาเข้าเพื่ออนุญาตการเชื่อมต่อกับ VM แบ็กเอนด์ของตัวจัดสรรภาระงาน

  1. สร้างเครือข่าย VPC และซับเน็ต ก. หากต้องการสร้างเครือข่าย VPC ให้เรียกใช้คำสั่ง gcloud compute networks create :
gcloud compute networks create NETWORK_NAME --subnet-mode custom

ข. ในตัวอย่างนี้ ช่วงที่อยู่ IPv4 หลักของเครือข่ายย่อยคือ 10.10.0.0/24

หากต้องการสร้างซับเน็ต ให้เรียกใช้คำสั่ง gcloud compute networks subnets create

gcloud compute networks subnets create SUBNET_NAME \
  --network=NETWORK_NAME \
  --range=10.10.0.0/24 \
  --region=us-central1

แทนที่ค่าต่อไปนี้

  • NETWORK_NAME: ชื่อเครือข่าย VPC ที่จะสร้าง
  • SUBNET_NAME: ชื่อของเครือข่ายย่อยที่จะสร้าง
  1. สร้างกฎไฟร์วอลล์ที่อนุญาตให้ใช้ข้อมูลขาเข้าเพื่ออนุญาตให้ส่งแพ็กเก็ตไปยังพอร์ต TCP ปลายทาง 80 และ 443 ไปยัง VM แบ็กเอนด์ ในตัวอย่างนี้ กฎไฟร์วอลล์อนุญาตการเชื่อมต่อจากที่อยู่ IP ต้นทางใดก็ได้ กฎไฟร์วอลล์มีผลกับ VM ที่มีแท็กเครือข่าย network-lb-tag หากต้องการสร้างกฎไฟร์วอลล์ ให้เรียกใช้คำสั่ง gcloud compute firewall-rules create
gcloud compute firewall-rules create FIREWALL_RULE_NAME \
   --direction=INGRESS \
   --priority=1000 \
   --network=NETWORK_NAME \
   --action=ALLOW \
   --rules=tcp:80,tcp:443 \
   --source-ranges=0.0.0.0/0 \
   --target-tags=network-lb-tag

แทนที่ FIREWALL_RULE_NAME ด้วยชื่อของกฎไฟร์วอลล์ที่จะสร้าง

สร้างอินสแตนซ์ VM และกำหนดน้ำหนัก

สร้างอินสแตนซ์ VM 3 รายการและกำหนดน้ำหนักดังนี้

  1. กำหนดค่าอินสแตนซ์ VM ของแบ็กเอนด์ 3 รายการให้แสดงน้ำหนักในส่วนหัว X-Load-Balancing-Endpoint-Weight พร้อมการตอบกลับ HTTP ในบทแนะนำนี้ คุณจะกำหนดค่าอินสแตนซ์แบ็กเอนด์ 1 รายการให้รายงานน้ำหนักเป็น 0, อินสแตนซ์แบ็กเอนด์ที่ 2 ให้รายงานน้ำหนักเป็น 100 และอินสแตนซ์แบ็กเอนด์ที่ 3 ให้รายงานน้ำหนักเป็น 900 หากต้องการสร้างอินสแตนซ์ ให้เรียกใช้คำสั่ง gcloud compute instances create
gcloud compute instances create instance-0 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=0,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  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
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-100 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=SUBNET_NAME \
  --metadata=load-balancing-weight=100,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  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
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-900 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=900,startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
    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
    lb_weight="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
    echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
    tee /etc/apache2/conf-enabled/headers.conf
    systemctl restart apache2'

สร้างกลุ่มอินสแตนซ์

ในบทแนะนำนี้ คุณจะระบุวิธีการสร้างกลุ่มอินสแตนซ์ที่ไม่มีการจัดการซึ่งมีอินสแตนซ์ VM ทั้ง 3 รายการ(instance-0, instance-100, and instance-900)

gcloud compute instance-groups unmanaged create
INSTANCE_GROUP --zone=us-central1-a
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP \
  --zone=us-central1-a \
  --instances=instance-0,instance-100,instance-900

แทนที่ INSTANCE_GROUP ด้วยชื่อของกลุ่มอินสแตนซ์ที่จะสร้าง

สร้างการตรวจสอบสถานะ HTTP

ในบทแนะนำนี้ คุณจะระบุวิธีการสร้างการตรวจสอบประสิทธิภาพการทำงานของ HTTP เพื่ออ่านการตอบสนอง HTTP ที่มีน้ำหนักของ VM ในแบ็กเอนด์"

  • หากต้องการสร้างการตรวจสอบประสิทธิภาพการทำงานของ HTTP ให้เรียกใช้คำสั่ง gcloud compute health-checks create
gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

แทนที่ HTTP_HEALTH_CHECK_NAME ด้วยชื่อของการตรวจสอบประสิทธิภาพการทำงานของ HTTP ที่จะสร้าง

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

ตัวอย่างต่อไปนี้แสดงวิธีการสร้างบริการแบ็กเอนด์ภายนอกระดับภูมิภาคที่กำหนดค่าให้ใช้การจัดสรรภาระงานแบบถ่วงน้ำหนัก

  1. สร้างบริการแบ็กเอนด์ด้วยการตรวจสอบประสิทธิภาพการทำงานของ HTTP และตั้งค่านโยบายตัวจัดสรรภาระงานตามสถานที่ตั้งเป็น WEIGHTED_MAGLEV
gcloud compute backend-services create BACKEND_SERVICE_NAME \
  --load-balancing-scheme=external \
  --protocol=tcp \
  --region=us-central1 \
  --health-checks=HTTP_HEALTH_CHECK_NAME \
  --health-checks-region=us-central1 \
  --locality-lb-policy=WEIGHTED_MAGLEV
  • แทนที่ BACKEND_SERVICE_NAME ด้วยชื่อของบริการแบ็กเอนด์ที่จะสร้าง
  1. เพิ่มกลุ่มอินสแตนซ์ลงในบริการแบ็กเอนด์
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
  --instance-group=INSTANCE_GROUP \
  --instance-group-zone=us-central1-a \
  --region=us-central1
  1. จองที่อยู่ IP ภายนอกระดับภูมิภาคสำหรับตัวจัดสรรภาระงาน
  • หากต้องการจองที่อยู่ IP อย่างน้อย 1 รายการ ให้เรียกใช้คำสั่ง gcloud compute addresses create
gcloud compute addresses create ADDRESS_NAME \
 --region us-central1

แทนที่ ADDRESS_NAME ด้วยชื่อของที่อยู่ IP ที่จะสร้าง ใช้คำสั่ง compute addresses describe เพื่อดูผลลัพธ์ จดที่อยู่ IP ภายนอกแบบคงที่ที่สำรองไว้ ("IP_ADDRESS')

gcloud compute addresses describe ADDRESS_NAME
  1. สร้างกฎการส่งต่อโดยใช้ที่อยู่ IP ภายนอกระดับภูมิภาคที่สงวนไว้ "IP_ADDRESS" เชื่อมต่อกฎการส่งต่อกับบริการแบ็กเอนด์
gcloud compute forwarding-rules create FORWARDING_RULE \
  --region=us-central1 \
  --ports=80 \
  --address=IP_ADDRESS \
  --backend-service=BACKEND_SERVICE_NAME
  • แทนที่รายการต่อไปนี้ FORWARDING_RULE: ชื่อของกฎการส่งต่อที่จะสร้าง IP_ADDRESS: ที่อยู่ IP ที่จะกำหนดให้กับอินสแตนซ์ ใช้ที่อยู่ IP ภายนอกแบบคงที่ที่สงวนไว้ ไม่ใช่ชื่อที่อยู่

ยืนยันน้ำหนักของแบ็กเอนด์โดยใช้ API ของบริการแบ็กเอนด์

ตรวจสอบว่ามีการรายงานน้ำหนักของแบ็กเอนด์ไปยังการตรวจสอบสถานะ HTTP อย่างถูกต้อง

  • หากต้องการรับน้ำหนักของแบ็กเอนด์ (พร้อมสถานะความสมบูรณ์) จากบริการแบ็กเอนด์ ให้เรียกใช้คำสั่ง gcloud compute backend-services get-health
gcloud compute backend-services get-health HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

เอาต์พุตควรมีลักษณะดังนี้

backend: https://www.googleapis.com/compute/projects/project-name/{project}/zones/us-central1-a/instanceGroups/{instance-group-name}
status:
  healthStatus:
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-0
    ipAddress: 10.10.0.5
    port: 80
    weight: '0'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-100
    ipAddress: 10.10.0.6
    port: 80
    weight: '100'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-900
    ipAddress: 10.10.0.7
    port: 80
    weight: '900'
  kind: compute#backendServiceGroupHealth