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 โดยใช้การจัดสรรภาระงานที่ถ่วงน้ำหนัก
การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก
- ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
- ชื่อโครงการคือชื่อที่แสดงของผู้เข้าร่วมโปรเจ็กต์นี้ เป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะไม่ซ้ำกันในทุกโปรเจ็กต์ของ Google Cloud และจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ปกติแล้วคุณไม่สนว่าอะไรเป็นอะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น
PROJECT_ID
) หากคุณไม่ชอบรหัสที่สร้างขึ้น คุณสามารถสร้างรหัสแบบสุ่มอื่นได้ หรือคุณจะลองดำเนินการเองแล้วดูว่าพร้อมให้บริการหรือไม่ และไม่สามารถเปลี่ยนแปลงได้หลังจากขั้นตอนนี้และจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - สำหรับข้อมูลของคุณ ค่าที่ 3 คือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 ค่าได้ในเอกสารประกอบ
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของระบบคลาวด์ การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่คุณสร้างหรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD
เริ่มต้น Cloud Shell
แม้ว่าคุณจะดำเนินการ Google Cloud จากระยะไกลได้จากแล็ปท็อป แต่คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมแบบบรรทัดคำสั่งที่ทำงานในระบบคลาวด์ใน Codelab นี้
จากคอนโซล Google Cloud ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน ดังนี้
การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมนี้ควรใช้เวลาเพียงครู่เดียว เมื่อเสร็จแล้ว คุณจะเห็นข้อมูลต่อไปนี้
เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่ใช้งานได้ต่อเนื่องและทำงานบน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานทั้งหมดใน Codelab นี้ทำได้ในเบราว์เซอร์ คุณไม่จำเป็นต้องติดตั้งอะไรเลย
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