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

1. บทนำ

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

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

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

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

เริ่มต้น Cloud Shell

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

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 ดังนี้
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 ดังนี้
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