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 โดยใช้การจัดสรรภาระงานแบบถ่วงน้ำหนัก
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ 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 ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานทั้งหมดในโค้ดแล็บนี้ได้ภายในเบราว์เซอร์ คุณไม่จำเป็นต้องติดตั้งอะไร
2. เริ่มการกำหนดค่า
Codelab ต้องใช้โปรเจ็กต์เดียว
ในบทแนะนำนี้ คุณจะสร้างกลุ่มอินสแตนซ์ที่มีอินสแตนซ์ VM 3 รายการและกำหนดน้ำหนักสำหรับแต่ละอินสแตนซ์ คุณสร้างการตรวจสอบประสิทธิภาพการทำงานของ HTTP เพื่อรายงานน้ำหนักของอินสแตนซ์แบ็กเอนด์ ระบบจะเปิดใช้ตัวจัดสรรภาระงานเครือข่ายแบบถ่วงน้ำหนักในบริการแบ็กเอนด์ที่มีนโยบายการจัดสรรภาระงานภายในเป็น WEIGHTED_MAGLEV
ก่อนเริ่มต้น
- อ่านภาพรวมการจัดสรรภาระงานของเครือข่ายภายนอกที่อิงตามบริการแบ็กเอนด์
- ติดตั้ง Google Cloud CLI ดูภาพรวมทั้งหมดของเครื่องมือได้ที่ภาพรวม gcloud CLI คุณดูคำสั่งที่เกี่ยวข้องกับการปรับสมดุลโหลดได้ในเอกสารอ้างอิง API และ gcloud CLI หากคุณไม่เคยเรียกใช้ Google Cloud CLI มาก่อน ให้เรียกใช้ gcloud init ก่อนเพื่อตรวจสอบสิทธิ์
- เปิดใช้ Compute API
gcloud services enable compute.googleapis.com
หมายเหตุ: คุณใช้ Google Cloud Console เพื่อกำหนดค่านโยบายเครื่องมือจัดสรรภาระงานตามสถานที่ตั้งและกำหนดน้ำหนักให้กับอินสแตนซ์ VM ไม่ได้ โปรดใช้ Google Cloud CLI แทน
สร้างเครือข่าย VPC, ซับเน็ต และกฎไฟร์วอลล์
สร้างเครือข่าย VPC, ซับเน็ต และกฎไฟร์วอลล์ที่อนุญาตให้มีการรับส่งข้อมูลขาเข้าเพื่ออนุญาตการเชื่อมต่อกับ VM แบ็กเอนด์ของตัวจัดสรรภาระงาน
- สร้างเครือข่าย 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
: ชื่อของเครือข่ายย่อยที่จะสร้าง
- สร้างกฎไฟร์วอลล์ที่อนุญาตให้ใช้ข้อมูลขาเข้าเพื่ออนุญาตให้ส่งแพ็กเก็ตไปยังพอร์ต 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 รายการและกำหนดน้ำหนักดังนี้
- กำหนดค่าอินสแตนซ์ 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
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 ที่จะสร้าง
สร้างบริการแบ็กเอนด์
ตัวอย่างต่อไปนี้แสดงวิธีการสร้างบริการแบ็กเอนด์ภายนอกระดับภูมิภาคที่กำหนดค่าให้ใช้การจัดสรรภาระงานแบบถ่วงน้ำหนัก
- สร้างบริการแบ็กเอนด์ด้วยการตรวจสอบประสิทธิภาพการทำงานของ 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
ด้วยชื่อของบริการแบ็กเอนด์ที่จะสร้าง
- เพิ่มกลุ่มอินสแตนซ์ลงในบริการแบ็กเอนด์
- หากต้องการเพิ่มกลุ่มอินสแตนซ์ ให้เรียกใช้คำสั่ง
gcloud compute backend-services add-backend
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --instance-group=INSTANCE_GROUP \ --instance-group-zone=us-central1-a \ --region=us-central1
- จองที่อยู่ 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
- สร้างกฎการส่งต่อโดยใช้ที่อยู่ 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