เกี่ยวกับ Codelab นี้
1 บทนำ
ยินดีต้อนรับสู่ Codelab ของการเพิ่มประสิทธิภาพการจัดสรรภาระงานขั้นสูง
ในโค้ดแล็บนี้ คุณจะได้เรียนรู้วิธีกำหนดค่าตัวเลือกการจัดสรรภาระงานขั้นสูงสำหรับตัวจัดสรรภาระงานแอปพลิเคชันภายนอกทั่วโลก ก่อนเริ่มต้น เราขอแนะนำให้อ่านเอกสารเกี่ยวกับการจัดสรรภาระงานบนระบบคลาวด์ก่อน ( https://cloud.google.com/load-balancing/docs/load-balancing-overview)
รูปที่ 1 เวิร์กโฟลว์ในการเลือกปลายทางด้วยตัวจัดสรรภาระงานแอปพลิเคชันภายนอกทั่วโลก
โทโปโลยีและกรณีการใช้งานของ Codelab
รูปที่ 2 โทโพโลยีการกำหนดเส้นทางของตัวจัดสรรภาระงาน HTTP
ระหว่างห้องทดลองโค้ดนี้ คุณจะตั้งค่าอินสแตนซ์ที่มีการจัดการ 2 กลุ่ม คุณจะสร้างตัวจัดสรรภาระงาน https ภายนอกทั่วโลก ตัวจัดสรรภาระงานจะใช้ฟีเจอร์หลายอย่างจากรายการความสามารถขั้นสูงที่ตัวจัดสรรภาระงานแบบ Envoy รองรับ เมื่อติดตั้งใช้งานแล้ว คุณจะต้องสร้างการจําลองการโหลดบางส่วนและยืนยันว่าการกําหนดค่าที่คุณตั้งไว้ทํางานอย่างเหมาะสม
สิ่งที่คุณจะได้เรียนรู้
- วิธีกำหนดค่า ServiceLbPolicy เพื่อปรับแต่งตัวจัดสรรภาระงาน
สิ่งที่ต้องมี
- ความรู้เกี่ยวกับการจัดสรรภาระงาน HTTPS ภายนอก ส่วนแรกของ Codelab นี้คล้ายกับ Codelab เกี่ยวกับ HTTPs LB ภายนอกที่มีการจัดการการรับส่งข้อมูลขั้นสูง (Envoy) (https://codelabs.developers.google.com/codelabs/externalhttplb-adv) เราขอแนะนำให้อ่านคู่มือดังกล่าวก่อน
2 ก่อนเริ่มต้น
ตรวจสอบว่าตั้งค่ารหัสโปรเจ็กต์ใน Cloud Shell แล้ว
gcloud config list project gcloud config set project [YOUR-PROJECT-NAME] prodproject=YOUR-PROJECT-NAME echo $prodproject
เปิดใช้ API
เปิดใช้บริการที่จำเป็นทั้งหมด
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com gcloud services enable networkservices.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 SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 httplbs AUTO REGIONAL
สร้างกฎไฟร์วอลล์ 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 NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED httplb-allow-http-rule httplbs INGRESS 700 tcp:80 False
ในโค้ดแล็บนี้ เราจะปรับประสิทธิภาพของ VM ดังนั้นเราจะสร้างกฎไฟร์วอลล์เพื่ออนุญาต SSH ด้วย
จาก Cloud Shell
gcloud compute firewall-rules create fw-allow-ssh \ --network=httplbs \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --rules=tcp:22
เอาต์พุต
Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/fw-allow-ssh]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED fw-allow-ssh httplbs INGRESS 1000 tcp:22 False
4 ตั้งค่ากลุ่มอินสแตนซ์ที่มีการจัดการ
คุณจะต้องตั้งค่าอินสแตนซ์ที่มีการจัดการ ซึ่งรวมถึงรูปแบบของทรัพยากรแบ็กเอนด์ที่ตัวจัดสรรภาระงาน HTTP ใช้ ก่อนอื่น เราจะสร้างเทมเพลตอินสแตนซ์ซึ่งกำหนดการกำหนดค่าสำหรับ VM ที่จะสร้างสำหรับแต่ละภูมิภาค ถัดไป เราจะสร้างกลุ่มอินสแตนซ์ที่มีการจัดการซึ่งอ้างอิงเทมเพลตอินสแตนซ์สําหรับแบ็กเอนด์ในแต่ละภูมิภาค
กลุ่มอินสแตนซ์ที่มีการจัดการอาจมีขอบเขตระดับโซนหรือระดับภูมิภาค สำหรับแบบฝึกหัดในห้องทดลองนี้ เราจะสร้างกลุ่มอินสแตนซ์ที่มีการจัดการในระดับโซน
ในส่วนนี้ คุณจะเห็นสคริปต์เริ่มต้นที่สร้างไว้ล่วงหน้าซึ่งจะอ้างอิงเมื่อสร้างอินสแตนซ์ สคริปต์เริ่มต้นนี้จะติดตั้งและเปิดใช้ความสามารถของเว็บเซิร์ฟเวอร์ที่เราจะใช้จำลองเว็บแอปพลิเคชัน คุณลองใช้สคริปต์นี้ได้
สร้างเทมเพลตอินสแตนซ์
ขั้นตอนแรกคือการสร้างเทมเพลตอินสแตนซ์
จาก Cloud Shell
gcloud compute instance-templates create test-template \ --network=httplbs \ --tags=allow-ssh,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'
เอาต์พุต
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP test-template n1-standard-1 2021-11-09T09:24:35.275-08:00
ตอนนี้คุณสามารถยืนยันว่าสร้างเทมเพลตอินสแตนซ์สำเร็จแล้วด้วยคำสั่ง gcloud ต่อไปนี้
จาก Cloud Shell
gcloud compute instance-templates list
เอาต์พุต
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP test-template n1-standard-1 2021-11-09T09:24:35.275-08:00
สร้างอินสแตนซ์
ตอนนี้เราต้องสร้างกลุ่มอินสแตนซ์ที่มีการจัดการจากเทมเพลตอินสแตนซ์ที่เราสร้างไว้ก่อนหน้านี้
จาก Cloud Shell
gcloud compute instance-groups managed create us-east1-a-mig \ --size=1 \ --template=test-template \ --zone=us-east1-a
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instanceGroupManagers/us-east1-a-mig]. NAME LOCATION SCOPE BASE_INSTANCE_NAME SIZE TARGET_SIZE INSTANCE_TEMPLATE AUTOSCALED us-east1-a-mig us-east1-a zone us-east1-a-mig 0 1 test-template no
จาก Cloud Shell
gcloud compute instance-groups managed create us-east1-b-mig \ --size=5 \ --template=test-template \ --zone=us-east1-b
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-b/instanceGroupManagers/us-east1-b-mig]. NAME LOCATION SCOPE BASE_INSTANCE_NAME SIZE TARGET_SIZE INSTANCE_TEMPLATE AUTOSCALED us-east1-b-mig us-east1-b zone us-east1-b-mig 0 5 test-template no
เรายืนยันได้ว่ากลุ่มอินสแตนซ์สร้างขึ้นสําเร็จด้วยคําสั่ง gcloud ต่อไปนี้
จาก Cloud Shell
gcloud compute instance-groups list
เอาต์พุต
NAME LOCATION SCOPE NETWORK MANAGED INSTANCES us-east1-a-mig us-east1-a zone httplbs Yes 1 us-east1-b-mig us-east1-b zone httplbs Yes 5
ยืนยันฟังก์ชันการทํางานของเว็บเซิร์ฟเวอร์
อินสแตนซ์แต่ละรายการได้รับการกําหนดค่าให้เรียกใช้เว็บเซิร์ฟเวอร์ Apache ด้วยสคริปต์ PHP แบบง่ายที่แสดงผลดังตัวอย่างด้านล่าง
หน้าที่แสดงจาก: us-east1-a-mig-ww2h
หากต้องการตรวจสอบว่าเว็บเซิร์ฟเวอร์ทำงานอย่างถูกต้อง ให้ไปที่ Compute Engine -> อินสแตนซ์ VM ตรวจสอบว่าได้สร้างอินสแตนซ์ใหม่ (เช่น us-east1-a-mig-xxx) ตามคําจํากัดความของกลุ่มอินสแตนซ์แล้ว
จากนั้นส่งคำขอเว็บในเบราว์เซอร์เพื่อตรวจสอบว่าเว็บเซิร์ฟเวอร์ทำงานอยู่ (อาจใช้เวลา 1 นาทีในการเริ่มต้น) ในหน้าอินสแตนซ์ VM ในส่วน Compute Engine ให้เลือกอินสแตนซ์ที่สร้างโดยกลุ่มอินสแตนซ์ แล้วคลิก IP ภายนอก (สาธารณะ) ของอินสแตนซ์นั้น
หรือไปที่ http://<IP_Address> ในเบราว์เซอร์
5 ตั้งค่าตัวจัดสรรภาระงาน
สร้างการตรวจสอบประสิทธิภาพการทำงาน
ก่อนอื่นเราต้องสร้างการตรวจสอบประสิทธิภาพพื้นฐานเพื่อให้แน่ใจว่าบริการของเราทำงานได้อย่างถูกต้อง เราจะสร้างการตรวจสอบประสิทธิภาพการทำงานพื้นฐาน แต่คุณปรับแต่งขั้นสูงได้อีกมากมาย
จาก Cloud Shell
gcloud compute health-checks create http http-basic-check \ --port 80
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/healthChecks/http-basic-check]. NAME PROTOCOL http-basic-check HTTP
จองที่อยู่ IP ภายนอก
ในขั้นตอนนี้ คุณจะต้องจองที่อยู่ IP แบบคงที่ที่พร้อมใช้งานทั่วโลกซึ่งจะแนบกับตัวจัดสรรภาระงานในภายหลัง
จาก Cloud Shell
gcloud compute addresses create lb-ipv4-2 \ --ip-version=IPV4 \ --global
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses/lb-ipv4-2].
อย่าลืมจดที่อยู่ 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
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/east-backend-service]. NAME BACKENDS PROTOCOL east-backend-service HTTP
เพิ่ม MIG ไปยังบริการแบ็กเอนด์
เมื่อสร้างบริการแบ็กเอนด์แล้ว เราต้องเพิ่มกลุ่มอินสแตนซ์ที่มีการจัดการซึ่งสร้างไว้ก่อนหน้านี้ลงในบริการแบ็กเอนด์แต่ละรายการ
จาก Cloud Shell
gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-a-mig --instance-group-zone us-east1-a --global
จาก Cloud Shell
gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-b-mig --instance-group-zone us-east1-b --global
คุณสามารถยืนยันว่าเพิ่มแบ็กเอนด์แล้วโดยเรียกใช้คําสั่งต่อไปนี้
จาก Cloud Shell
gcloud compute backend-services list
เอาต์พุต
NAME BACKENDS PROTOCOL east-backend-service us-east1-a/instanceGroups/us-east1-a-mig,us-east1-b/instanceGroups/us-east1-b-mig HTTP
สร้างแมป URL
ตอนนี้เราจะสร้างแผนที่ URL
gcloud compute url-maps create web-map-http \ --default-service=east-backend-service \ --global
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http]. NAME DEFAULT_SERVICE web-map-http backendServices/east-backend-service
สร้างฟรอนต์เอนด์ HTTP
ขั้นตอนสุดท้ายในการสร้างตัวจัดสรรภาระงานคือการสร้างส่วนหน้า ซึ่งจะแมปที่อยู่ IP ที่คุณจองไว้ก่อนหน้านี้กับแผนที่ URL ของตัวจัดสรรภาระงานที่คุณสร้างขึ้น
จาก Cloud Shell
gcloud compute target-http-proxies create http-lb-proxy-adv \ --url-map=web-map-http
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetHttpProxies/http-lb-proxy-adv]. NAME URL_MAP http-lb-proxy-adv 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
เมื่อถึงจุดนี้ คุณสามารถตรวจสอบว่าตัวจัดสรรภาระงานทํางานกับที่อยู่ IP ที่คุณจดไว้ก่อนหน้านี้
6 ตรวจสอบว่าตัวจัดสรรภาระงานใช้งานได้
คุณต้องสร้างโหลดบางส่วนเพื่อยืนยันว่าฟีเจอร์การกระจายโหลดทํางาน โดยเราจะสร้าง VM ใหม่เพื่อจำลองการโหลด
Create Siege-vm
ตอนนี้คุณจะสร้าง siege-vm ที่จะใช้ในการสร้างโหลด
จาก Cloud Shell
gcloud compute instances create siege-vm \ --network=httplbs \ --zone=us-east1-a \ --machine-type=e2-medium \ --tags=allow-ssh,http-server \ --metadata=startup-script='sudo apt-get -y install siege'
เอาต์พุต
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instances/siege-vm]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS siege-vm us-central1-ir1 e2-medium 10.132.0.15 34.143.20.68 RUNNING
จากนั้นคุณสามารถ SSH เข้าสู่ VM ที่สร้างไว้ เมื่อสร้างแล้ว ให้คลิก SSH เพื่อเปิดใช้งานเทอร์มินัลและเชื่อมต่อ
เมื่อเชื่อมต่อแล้ว ให้เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างโหลด ใช้ที่อยู่ IP ที่คุณจองไว้ก่อนหน้านี้สำหรับตัวจัดสรรภาระงาน HTTP ภายนอก
จาก Cloud Shell
siege -c 20 http://$lb-ipv4-2
เอาต์พุต
New configuration template added to /home/cloudcurriculumdeveloper/.siege Run siege -C to view the current settings in that file
ตรวจสอบการกระจายโหลด
เมื่อ Siege ทำงานแล้ว ก็ได้เวลาตรวจสอบว่ามีการกระจายการเข้าชมไปยังกลุ่มอินสแตนซ์ที่จัดการ 2 กลุ่มอย่างเท่าๆ กัน
หยุดการปิดล้อม
เมื่อพิสูจน์แล้วว่าการแยกการเข้าชมขั้นสูงทํางานได้ ก็ถึงเวลาหยุดการจู่โจม โดยให้กลับไปที่เทอร์มินัล SSH ของ siege-vm แล้วกด CTRL+C เพื่อหยุดการเรียกใช้ siege
7 กำหนดค่านโยบาย LB ของบริการ
สร้างนโยบาย LB ของบริการ
เมื่อตั้งค่าพื้นฐานเสร็จแล้ว เราจะสร้างนโยบาย LB ของบริการและลองใช้ฟีเจอร์ขั้นสูง ตัวอย่างเช่น เราจะกำหนดค่าบริการให้ใช้การตั้งค่าการจัดสรรภาระงานขั้นสูงบางอย่าง ในตัวอย่างนี้ เราจะสร้างนโยบายเพื่อใช้ฟีเจอร์การระบายความจุอัตโนมัติ แต่คุณสามารถลองใช้ฟีเจอร์อื่นๆ ได้
จาก Cloud Shell
gcloud beta network-services service-lb-policies create http-policy \ --auto-capacity-drain --location=global
เรายืนยันได้ว่าสร้างนโยบายเรียบร้อยแล้วด้วยคำสั่ง gcloud ต่อไปนี้
จาก Cloud Shell
gcloud beta network-services service-lb-policies list --location=global
เอาต์พุต
NAME http-policy
แนบนโยบาย LB ของบริการกับบริการแบ็กเอนด์
ตอนนี้เราจะแนบนโยบายใหม่ไปกับบริการแบ็กเอนด์ที่มีอยู่ด้านบน
จาก Cloud Shell
gcloud beta compute backend-services update east-backend-service \ --service-lb-policy=http-policy --global
8 ปรับแต่งประสิทธิภาพของแบ็กเอนด์
เมื่อถึงจุดนี้ นโยบาย lb บริการใหม่จะมีผลกับบริการแบ็กเอนด์ของคุณ ซึ่งในทางเทคนิคแล้วคุณก็สามารถล้างข้อมูลได้โดยตรง แต่เราจะทำการปรับเปลี่ยนเพิ่มเติมในเวอร์ชันที่ใช้งานจริงเพื่อแสดงให้คุณเห็นวิธีการทํางานของนโยบายใหม่ด้วย
ฟีเจอร์การลดขีดจํากัดอัตโนมัติจะนำ MIG แบ็กเอนด์ออกจากโหลดบาลานเซอร์โดยอัตโนมัติเมื่อจำนวนแบ็กเอนด์ที่ทำงานได้อย่างสมบูรณ์ทั้งหมดลดลงต่ำกว่าเกณฑ์ (25%) ในการทดสอบฟีเจอร์นี้ เราจะ SSH เข้าสู่ VM ใน us-east1-b-mig และทำให้ VM ไม่ทำงาน เมื่อมีเกณฑ์ 25% คุณจะต้อง SSH ลงใน VM 4 รายการและปิดเซิร์ฟเวอร์ Apache
โดยเลือก VM 4 เครื่องแล้ว SSH เข้าไปโดยคลิก SSH เพื่อเปิดเทอร์มินัลและเชื่อมต่อ จากนั้นเรียกใช้คำสั่งต่อไปนี้
sudo apachectl stop
เมื่อถึงจุดนี้ ระบบจะเรียกใช้ฟีเจอร์การลดกำลังการผลิตอัตโนมัติและ us-east1-b-mig จะไม่ได้รับการร้องขอใหม่
9 ตรวจสอบว่าฟีเจอร์การลดกำลังการผลิตอัตโนมัติทำงานอยู่
เริ่ม Siege อีกครั้ง
เราจะนำ VM ปิดมาใช้ซ้ำอีกครั้งเพื่อยืนยันฟีเจอร์ใหม่ ลองใช้ SSH เพื่อเข้าถึง VM ที่คุณสร้างในขั้นตอนก่อนหน้ากัน เมื่อสร้างแล้ว ให้คลิก SSH เพื่อเปิดเทอร์มินัลและเชื่อมต่อ
เมื่อเชื่อมต่อแล้ว ให้เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างโหลด ใช้ที่อยู่ IP ที่คุณจองไว้ก่อนหน้านี้สำหรับตัวจัดสรรภาระงาน HTTP ภายนอก
จาก Cloud Shell
siege -c 20 http://$lb-ipv4-2
เอาต์พุต
New configuration template added to /home/cloudcurriculumdeveloper/.siege Run siege -C to view the current settings in that file
เมื่อถึงจุดนี้ คุณจะเห็นคําขอทั้งหมดที่ส่งไปยัง us-east1-a-mig
หยุดการปิดล้อม
เมื่อพิสูจน์แล้วว่าการแยกการเข้าชมขั้นสูงทํางานได้ ก็ถึงเวลาหยุดการจู่โจม โดยให้กลับไปที่เทอร์มินัล SSH ของ siege-vm แล้วกด CTRL+C เพื่อหยุดการเรียกใช้ siege
10 ขั้นตอนการล้างข้อมูล
เมื่อสร้างสภาพแวดล้อมการทดสอบเสร็จแล้ว ก็ถึงเวลารื้อถอน โปรดเรียกใช้คําสั่งต่อไปนี้เพื่อลบสภาพแวดล้อมการทดสอบ
จาก Cloud Shell
gcloud compute instances delete siege-vm --zone=us-east1-a 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 addresses delete lb-ipv4-2 --global gcloud compute health-checks delete http-basic-check gcloud beta network-services service-lb-policies delete http-policy --location=global gcloud compute instance-groups managed delete us-east1-a-mig --zone=us-east1-a gcloud compute instance-groups managed delete us-east1-b-mig --zone=us-east1-b gcloud compute instance-templates delete test-template gcloud compute firewall-rules delete httplb-allow-http-rule gcloud compute firewall-rules delete fw-allow-ssh gcloud compute networks delete httplbs
11 ยินดีด้วย
ยินดีด้วยที่ทํา Codelab จนเสร็จสมบูรณ์
สิ่งที่เราได้พูดถึง
- การสร้างตัวจัดสรรภาระงานแอปพลิเคชันภายนอกที่มีนโยบาย lb ของบริการ
- กำหนดค่าบริการแบ็กเอนด์ของคุณด้วยฟีเจอร์การระบายความจุอัตโนมัติ
ขั้นตอนถัดไป
- ลองใช้ฟีเจอร์อื่นๆ ที่นโยบาย LB ของบริการมีให้