1. مقدمة
يستكشف هذا الدرس التطبيقي حول الترميز حالة Private Service Connect (PSC) من أجل التبديل التلقائي عند حدوث عطل إقليمي. "حالة PSC" هي ميزة شبكات توفّر مرونة وتوفّرًا محسّنَين للخدمة.
تتيح حالة PSC الصحية لمقدّمي الخدمات تحديد سياسات صحية مخصّصة (الحالة التي تحدّد ما إذا كانت الخدمة سليمة أو غير سليمة) ونشر هذه الإشارات تلقائيًا إلى مستهلكي الخدمات الذين يتصلون بالخدمة باستخدام الخلفيات في PSC. تم تصميم هذه الميزة خصيصًا لدعم عملية التبديل التلقائي عند حدوث عطل في منطقة أخرى. في حال أصبحت خدمة المنتج الإقليمي غير سليمة، يتوقف موازن التحميل الخاص بالمستهلك تلقائيًا عن توجيه حركة البيانات إلى تلك المنطقة ويوجهها إلى خدمة سليمة في منطقة أخرى.
مقارنةً بالطرق السابقة لتجاوز الأعطال في مناطق متعدّدة، مثل رصد القيم الشاذة، توفّر حالة PSC إشارة أكثر دقة لتجاوز الأعطال لأنّها تستند مباشرةً إلى الحالة المجمّعة لخوادم الخلفية لخدمة المنتج (مجموعات مثيلات الأجهزة الافتراضية أو نقاط نهاية الشبكة). يمكن للمنتجين تحديد منطق الصحة الخاص بهم، ما يضمن ألا يتلقّى المنتج زيارات إلا عندما تستوفي الخدمة معايير الصحة اللازمة.
ما ستتعلمه
- مكوّنات سلامة PSC وكيفية عملها معًا لتحديد حالة سلامة خدمة منتِج
- تنفيذ حالة PSC الصحية لخدمة منتِج باستخدام أوامر gcloud
- إعداد جهاز موازنة حمل للوصول إلى مستهلك PSC في مناطق متعددة لاستخدام إشارات الصحة من سياسة الصحة الخاصة بمنتج PSC
- اختبار سيناريوهات تعذُّر الخدمة والتحقّق من إمكانية الانتقال التلقائي إلى منطقة أخرى
ما تحتاج إليه
- مشروع على السحابة الإلكترونية من Google
- أذونات "إدارة الهوية وإمكانية الوصول" الممنوحة للدور
roles/compute.adminالمحدّد مسبقًا أو دور أساسي واسع النطاق مثلroles/adminأو الدور القديمroles/owner - الإلمام بمفاهيم الشبكات في Google Cloud واستخدام واجهة سطر الأوامر في Google Cloud
2. المفاهيم
ربط PSC
يتضمّن تصميم الشبكة في هذا الدرس التطبيقي حول الترميز شبكة سحابة إلكترونية خاصة افتراضية (VPC) للمستهلك وشبكة سحابة إلكترونية خاصة افتراضية (VPC) للمنتج في منطقتَين نشطتَين من Google Cloud.
يحتوي جانب المستهلك على شبكات فرعية إقليمية مع مثيلات الأجهزة الافتراضية للعملاء المستخدَمة للوصول إلى خدمة المنتج من خلال موازنة حمل داخلية على مستوى مناطق متعددة خاصة بتطبيق مع خلفيات مجموعة نقاط نهاية شبكة PSC. هناك قاعدتا إعادة توجيه لجهاز موازنة الحمل على مستوى منطقة معيّنة، مع عناوين IP على مستوى منطقة معيّنة، لعمليات دخول العملاء على مستوى العالم (على مستوى مناطق متعدّدة). خدمة الخلفية هي مورد عالمي يتيح استخدام مجموعات NEGs في مناطق مختلفة. في سيناريو تجاوز الفشل، يمكن توجيه العميل الذي يتصل بأي من قاعدة إعادة التوجيه للواجهة الأمامية الإقليمية إلى خلفية عامة سليمة.
الشكل 1. طوبولوجيا شبكة الدرس التطبيقي حول الترميز
يتضمّن جانب مقدّم الخدمة شبكات فرعية إقليمية مع أجهزة موازنة حمل الشبكة الداخلية الإقليمية التي تسمح بمرور البيانات وتعرض خدمة من خلال مورد مرفق خدمة PSC إقليمي. تحتوي الخدمات الخلفية على مجموعات مثيلات مُدارة (MIG) إقليمية، ويتم التحقّق من سلامتها من خلال فحص طلبات http والتحقّق من صحة ردود 200 (OK).
راجِع أحدث المستندات حول توافق Private Service Connect مع إعدادات مقدّم الخدمة لمعرفة أجهزة موازنة الحمل التي تتوافق مع حالة PSC.
جودة الخدمة
تعمل عملية التحقّق من صحة خدمة الخلفية للمنتج، والتي يتم إعدادها أثناء إنشاء موازنة الحمل، كإشارة مصدر لميزة صحة PSC. يستخدم مورد مصدر الحالة الصحية هذه الإشارة بالإضافة إلى القيود الإضافية المحدّدة في مورد سياسة تجميع الحالة الصحية لتحديد حالة صحية لخدمة خلفية واحدة.
بشكلٍ تلقائي، تُعتبر الخدمة سليمة عندما يتم استيفاء هذين الشرطين:
- الحدّ الأدنى لنسبة الأنظمة الخلفية السليمة هو
x% (القيمة التلقائية هي 60) - الحد الأدنى لعدد الأنظمة الخلفية السليمة هو
y(القيمة التلقائية هي1)
يشير فحص الصحة المركّب إلى جميع مصادر الصحة لجميع خدمات الخلفية من أجل تحديد الصحة العامة لخدمة المنتج الإقليمية بأكملها. في حالة هذه الميزة الاختبارية، تحتوي كل خدمة منتِجة إقليمية على مصدر واحد فقط لبيانات سلامة خدمة الخلفية يتم تجميعه في عملية التحقق من الصحة المركّبة الواحدة.
الشكل 2. نموذج مراجع الصحة في PSC
يشير تعريف مورد فحص الصحة المركّب أيضًا إلى قاعدة إعادة التوجيه لموازن تحميل خدمة المنتج. يتم ربط مجموعة نقاط نهاية الشبكة (NEG) في PSC لخلفية موازنة الحمل الخاصة بالمستهلك منطقيًا بمرفق خدمة PSC الخاص بالمنتج وقاعدة إعادة التوجيه الخاصة بموازنة الحمل الخاصة بالمنتج. يربط ذلك موازن تحميل وصول المستهلك بحالة فحص السلامة المركّب لخدمة المنتج. بعد ذلك، يتم نشر حالة الخدمة الإجمالية لخدمة المنتج الإقليمية إلى برنامج موازنة الحمل الخاص بالمستهلك من أجل تحديد الخلفية المناسبة.
3- إعداد المشروع
الوصول إلى مشروعك
تمت كتابة هذا الدرس التطبيقي حول الترميز لاستخدام مشروع واحد على Google Cloud. تستخدم خطوات الإعداد gcloud وأوامر واجهة Linux.
ملاحظة: في عملية نشر في مرحلة الإنتاج، تكون موارد المستهلكين وخدمات المنتجين في PSC عادةً في مشاريع مختلفة.
ابدأ بالوصول إلى سطر الأوامر في مشروع على السحابة الإلكترونية باستخدام:
- Cloud Shell
http://shell.cloud.google.com/أو - Terminal محلي مع
gcloudCLI مثبَّت
تحديد رقم تعريف المشروع
gcloud config set project YOUR_PROJECT_ID_HERE
ضبط متغيرات بيئة shell
export PROJECT_ID=$(gcloud config list --format="value(core.project)")
export REGION_1="us-west1"
export ZONE_1="us-west1-c"
export REGION_2="us-east1"
export ZONE_2="us-east1-c"
echo ${PROJECT_ID}
echo ${REGION_1}
echo ${ZONE_1}
echo ${REGION_2}
echo ${ZONE_2}
تفعيل خدمات واجهة برمجة التطبيقات
gcloud services enable compute.googleapis.com
gcloud services enable dns.googleapis.com
4. خدمة المنتج
إنشاء موارد مشتركة
إنشاء شبكة
gcloud compute networks create vnet-producer --subnet-mode=custom
إنشاء شبكات فرعية
# create subnet for service workload in region 1
gcloud compute networks subnets create subnet-foo \
--network=vnet-producer \
--region=${REGION_1} \
--range=172.16.1.0/24 \
--enable-private-ip-google-access
# create subnet for psc nat in region 1
gcloud compute networks subnets create subnet-foo-pscnat \
--network=vnet-producer \
--region=${REGION_1} \
--range=192.168.1.0/29 \
--purpose=PRIVATE_SERVICE_CONNECT
# create subnet for service workload in region 2
gcloud compute networks subnets create subnet-bar \
--network=vnet-producer \
--region=${REGION_2} \
--range=172.16.2.0/24 \
--enable-private-ip-google-access
# create subnet for psc nat in region 2
gcloud compute networks subnets create subnet-bar-pscnat \
--network=vnet-producer \
--region=${REGION_2} \
--range=192.168.2.0/29 \
--purpose=PRIVATE_SERVICE_CONNECT
إنشاء مكوّنات جدار الحماية
يجب توفّر قواعد جدار الحماية للسماح بالوصول إلى موارد الجهاز الافتراضي (قواعد جدار الحماية التلقائية الضمنية هي رفض الدخول والسماح بالخروج). تُعدّ السياسات الطريقة المفضّلة لنشر قواعد جدار حماية بين الشبكات من خلال إنشاء مورد سياسة جدار حماية بين الشبكات، وإنشاء قواعد وإضافتها إلى السياسة، ثم ربط السياسة بشبكة سحابة VPC.
# create fw policy
gcloud compute network-firewall-policies create fw-policy-producer --global
# create fw policy rules
gcloud compute network-firewall-policies rules create 1001 \
--description="allow iap for ssh" \
--firewall-policy=fw-policy-producer \
--global-firewall-policy \
--action=allow \
--direction=INGRESS \
--layer4-configs=tcp:22 \
--src-ip-ranges=35.235.240.0/20
gcloud compute network-firewall-policies rules create 1002 \
--description="allow health checks" \
--firewall-policy=fw-policy-producer \
--global-firewall-policy \
--action=allow \
--direction=INGRESS \
--layer4-configs=tcp,udp,icmp \
--src-ip-ranges=130.211.0.0/22,35.191.0.0/16
gcloud compute network-firewall-policies rules create 1003 \
--description="allow psc nat clients" \
--firewall-policy=fw-policy-producer \
--global-firewall-policy \
--action=allow \
--direction=INGRESS \
--layer4-configs=tcp:80 \
--src-ip-ranges=192.168.1.0/29,192.168.2.0/29
# associate fw policy to vnet
gcloud compute network-firewall-policies associations create \
--firewall-policy=fw-policy-producer \
--network=vnet-producer \
--name=fw-policy-association-producer \
--global-firewall-policy
إنشاء أجهزة توجيه Cloud Router وبوابات NAT
# create routers for nat in each region
gcloud compute routers create cr-nat-foo \
--network=vnet-producer \
--asn=16550 \
--region=${REGION_1}
gcloud compute routers create cr-nat-bar \
--network=vnet-producer \
--asn=16550 \
--region=${REGION_2}
# create nat gateways in each region
gcloud compute routers nats create natgw-foo \
--router=cr-nat-foo \
--region=${REGION_1} \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges
gcloud compute routers nats create natgw-bar \
--router=cr-nat-bar \
--region=${REGION_2} \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges
إنشاء إعدادات بدء تشغيل جهاز افتراضي باستخدام خادم HTTP
cat > vm-server-startup.sh << 'EOF'
#! /bin/bash
apt-get update
apt-get install apache2 -y
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
vm_zone="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/zone)"
echo "Page served from: $vm_hostname in zone $vm_zone" | \
tee /var/www/html/index.html
systemctl restart apache2
EOF
إعداد الخدمة foo في المنطقة 1
إنشاء خدمة حساب
# create managed instance group template
gcloud compute instance-templates create mig-template-foo \
--machine-type=e2-micro \
--network=vnet-producer \
--region=${REGION_1} \
--subnet=subnet-foo \
--no-address \
--shielded-secure-boot \
--metadata-from-file=startup-script=vm-server-startup.sh
# create regional managed instance group
gcloud compute instance-groups managed create mig-foo \
--region=${REGION_1} \
--size=2 \
--template=mig-template-foo \
--base-instance-name=service-foo
إنشاء مكوّنات جهاز موازنة الحمل للخدمة
# create lb health check
gcloud compute health-checks create http hc-foo-http \
--region=${REGION_1} \
--port=80 \
--enable-logging
# create backend service
gcloud compute backend-services create ilb-foo \
--load-balancing-scheme=INTERNAL \
--protocol=tcp \
--region=${REGION_1} \
--health-checks=hc-foo-http \
--health-checks-region=${REGION_1}
# add managed instance group to backend service
gcloud compute backend-services add-backend ilb-foo \
--instance-group=mig-foo \
--instance-group-region=${REGION_1} \
--region=${REGION_1}
# create forwarding rule
gcloud compute forwarding-rules create fr-foo \
--region=${REGION_1} \
--load-balancing-scheme=INTERNAL \
--network=vnet-producer \
--subnet=subnet-foo \
--address=172.16.1.99 \
--ip-protocol=TCP \
--ports=80 \
--backend-service=ilb-foo \
--backend-service-region=${REGION_1} \
--allow-global-access
نشر خدمة PSC
# create psc service attachment
gcloud compute service-attachments create psc-sa-foo \
--region=${REGION_1} \
--target-service=projects/${PROJECT_ID}/regions/${REGION_1}/forwardingRules/fr-foo \
--connection-preference=ACCEPT_AUTOMATIC \
--nat-subnets=subnet-foo-pscnat
إعداد الخدمة bar في المنطقة 2
إنشاء خدمة حساب
# create managed instance group template
gcloud compute instance-templates create mig-template-bar \
--machine-type=e2-micro \
--network=vnet-producer \
--region=${REGION_2} \
--subnet=subnet-bar \
--no-address \
--shielded-secure-boot \
--metadata-from-file=startup-script=vm-server-startup.sh
# create regional managed instance group
gcloud compute instance-groups managed create mig-bar \
--region=${REGION_2} \
--size=2 \
--template=mig-template-bar \
--base-instance-name=service-bar
إنشاء مكوّنات جهاز موازنة الحمل للخدمة
# create lb health check
gcloud compute health-checks create http hc-bar-http \
--region=${REGION_2} \
--port=80 \
--enable-logging
# create backend service
gcloud compute backend-services create ilb-bar \
--load-balancing-scheme=INTERNAL \
--protocol=tcp \
--region=${REGION_2} \
--health-checks=hc-bar-http \
--health-checks-region=${REGION_2}
# add managed instance group to backend service
gcloud compute backend-services add-backend ilb-bar \
--instance-group=mig-bar \
--instance-group-region=${REGION_2} \
--region=${REGION_2}
# create forwarding rule
gcloud compute forwarding-rules create fr-bar \
--region=${REGION_2} \
--load-balancing-scheme=INTERNAL \
--network=vnet-producer \
--subnet=subnet-bar \
--address=172.16.2.99 \
--ip-protocol=TCP \
--ports=80 \
--backend-service=ilb-bar \
--backend-service-region=${REGION_2} \
--allow-global-access
نشر خدمة PSC
# create psc service attachment
gcloud compute service-attachments create psc-sa-bar \
--region=${REGION_2} \
--target-service=projects/${PROJECT_ID}/regions/${REGION_2}/forwardingRules/fr-bar \
--connection-preference=ACCEPT_AUTOMATIC \
--nat-subnets=subnet-bar-pscnat
5- وصول المستهلك
إعداد موارد العميل
إنشاء مكونات الشبكة
# create vpc network
gcloud compute networks create vnet-consumer --subnet-mode=custom
# create client subnet in each region
gcloud compute networks subnets create subnet-client-1 \
--network=vnet-consumer \
--region=${REGION_1} \
--range=10.10.1.0/24 \
--enable-private-ip-google-access
gcloud compute networks subnets create subnet-client-2 \
--network=vnet-consumer \
--region=${REGION_2} \
--range=10.10.2.0/24 \
--enable-private-ip-google-access
يتطلّب موازن الحمل لتطبيق المستهلك (المستند إلى الخادم الوكيل) شبكات فرعية للخادم الوكيل فقط. توفّر الشبكات الفرعية مجموعة من عناوين IP التي تستخدمها موازنات الحمل المستندة إلى الخادم الوكيل كعناوين مصدر داخلية عند إرسال حركة البيانات إلى الخلفيات.
# create proxy subnet in each region
gcloud compute networks subnets create subnet-proxy-1 \
--purpose=GLOBAL_MANAGED_PROXY \
--role=ACTIVE \
--network=vnet-consumer \
--region=${REGION_1} \
--range=10.10.128.0/23
gcloud compute networks subnets create subnet-proxy-2 \
--purpose=GLOBAL_MANAGED_PROXY \
--role=ACTIVE \
--network=vnet-consumer \
--region=${REGION_2} \
--range=10.10.130.0/23
إنشاء مكوّنات جدار الحماية
# create fw policy
gcloud compute network-firewall-policies create fw-policy-consumer --global
# create fw policy rules
gcloud compute network-firewall-policies rules create 1001 \
--description="allow iap for ssh" \
--firewall-policy=fw-policy-consumer \
--global-firewall-policy \
--action=allow \
--direction=INGRESS \
--layer4-configs=tcp:22 \
--src-ip-ranges=35.235.240.0/20
# associate fw policy to vnet
gcloud compute network-firewall-policies associations create \
--firewall-policy=fw-policy-consumer \
--network=vnet-consumer \
--name=fw-policy-association-consumer \
--global-firewall-policy
إنشاء مكوّنات جهاز موازنة الحمل
# create psc network endpoint group per region
gcloud compute network-endpoint-groups create neg-foo \
--network-endpoint-type=private-service-connect \
--psc-target-service=projects/${PROJECT_ID}/regions/${REGION_1}/serviceAttachments/psc-sa-foo \
--region=${REGION_1} \
--network=vnet-consumer \
--subnet=subnet-client-1
gcloud compute network-endpoint-groups create neg-bar \
--network-endpoint-type=private-service-connect \
--psc-target-service=projects/${PROJECT_ID}/regions/${REGION_2}/serviceAttachments/psc-sa-bar \
--region=${REGION_2} \
--network=vnet-consumer \
--subnet=subnet-client-2
# verify psc connections
gcloud compute network-endpoint-groups list --format="value(selfLink, pscData.pscConnectionStatus)"
# create global backend service
gcloud compute backend-services create bes-foobar \
--load-balancing-scheme=INTERNAL_MANAGED \
--protocol=HTTP \
--global
# add negs to backend service
gcloud compute backend-services add-backend bes-foobar \
--network-endpoint-group=neg-foo \
--network-endpoint-group-region=${REGION_1} \
--global
gcloud compute backend-services add-backend bes-foobar \
--network-endpoint-group=neg-bar \
--network-endpoint-group-region=${REGION_2} \
--global
# create global url map
gcloud compute url-maps create ilb-foobar \
--default-service=bes-foobar \
--global
# create global target proxy
gcloud compute target-http-proxies create proxy-foobar \
--url-map=ilb-foobar \
--global
# create global forwarding rule for region 1
gcloud compute forwarding-rules create fr-foobar-1 \
--load-balancing-scheme=INTERNAL_MANAGED \
--network=vnet-consumer \
--subnet=subnet-client-1 \
--subnet-region=${REGION_1} \
--address=10.10.1.99 \
--ports=80 \
--target-http-proxy=proxy-foobar \
--global
# create global forwarding rule for region 2
gcloud compute forwarding-rules create fr-foobar-2 \
--load-balancing-scheme=INTERNAL_MANAGED \
--network=vnet-consumer \
--subnet=subnet-client-2 \
--subnet-region=${REGION_2} \
--address=10.10.2.99 \
--ports=80 \
--target-http-proxy=proxy-foobar \
--global
إنشاء سجلّات نظام أسماء النطاقات
# create dns zone
gcloud dns managed-zones create zone-foobar \
--description="private zone for foobar" \
--dns-name=foobar.com \
--networks=vnet-consumer \
--visibility=private
# create geo dns record
gcloud dns record-sets create www.foobar.com \
--zone=zone-foobar \
--type=A \
--ttl=300 \
--routing-policy-type=GEO \
--routing-policy-item="location=${REGION_1},rrdatas=10.10.1.99" \
--routing-policy-item="location=${REGION_2},rrdatas=10.10.2.99"
إنشاء موارد حسابية
# create client vm in region 1
gcloud compute instances create client-1 \
--machine-type=e2-micro \
--zone=${ZONE_1} \
--subnet=subnet-client-1 \
--no-address \
--shielded-secure-boot
# create client vm in region 2
gcloud compute instances create client-2 \
--machine-type=e2-micro \
--zone=${ZONE_2} \
--subnet=subnet-client-2 \
--no-address \
--shielded-secure-boot
خط الأساس لخدمة الاختبار
استخدام بروتوكول النقل الآمن (SSH) للوصول إلى الجهاز الظاهري للعميل في المنطقة 1
gcloud compute ssh client-1 --zone=${ZONE_1}
# send request to service using hostname
curl -v www.foobar.com
# send request to load balancer forwarding rule region 1
curl 10.10.1.99
# send request to load balancer forwarding rule region 2
curl 10.10.2.99
# exit vm ssh
exit
اختياري: جرِّب الاختبارات نفسها من الجهاز الظاهري للعميل في المنطقة 2: gcloud compute ssh client-2 --zone=${ZONE_2}
نقطة أساسية: إنّ السلوك العادي لموازن التحميل في ما يتعلّق بطلبات العملاء التي تدخل قاعدة إعادة التوجيه في region-x هو تفضيل الخلفيات في region-x نفسه. إذا كانت جميع موارد الخلفية سليمة، ستفوز المنطقة ذات أقل وقت استجابة. سيتم التبديل التلقائي للخوادم الخلفية العالمية إلى المنطقة الأخرى التي تتضمّن إشارة الصحة المناسبة.
ولكن بما أنّ موارد خدمة المزوّد الفعلية تقع خلف موازن الحمل للمزوّد في شبكة VPC للمزوّد، كانت إشارات السلامة هذه غير شفافة سابقًا لموازن الحمل للمستهلك، وبالتالي لم يتمكّن جانب المستهلك من تحديد حالات تجاوز الفشل في الخلفية. تعالج PSC Health هذه المشكلة من خلال نشر معلومات حالة الخدمة من جهة المنتج إلى جهة المستهلك.
6. المراجع المتعلقة بالصحة
يتم إعداد موارد "فحص حالة الخدمة الخاصة" من قِبل المنتج لتمثيل الحالة العامة للخدمة الإقليمية. تستند سياسة الصحة إلى ما يحدّده مقدّم الخدمة على أنّه مناسب للحفاظ على مستوى الخدمة. يتم ضبط الحدود الدنيا لإعلام المستهلكين بالتبديل إلى نظام احتياطي عندما لا يتم استيفاء الشروط التي حدّدها المنتج.
إعداد صحة الخدمة foo في المنطقة 1
إنشاء سياسة تجميع بيانات الصحة
gcloud beta compute health-aggregation-policies create foo-health-policy \
--region=${REGION_1} \
--healthy-percent-threshold=60 \
--min-healthy-threshold=1
إنشاء مصدر معلومات صحية
gcloud beta compute health-sources create foo-health-source \
--region=${REGION_1} \
--source-type=BACKEND_SERVICE \
--sources=ilb-foo \
--health-aggregation-policy=foo-health-policy
إنشاء عملية تحقّق مركّبة من الصحة
gcloud beta compute composite-health-checks create foo-health-composite \
--region=${REGION_1} \
--health-sources=foo-health-source \
--health-destination=projects/${PROJECT_ID}/regions/${REGION_1}/forwardingRules/fr-foo
التحقّق من إعدادات foo سلامة الخدمة
يمكن عرض إعدادات موارد الصحة باستخدام أوامر القائمة (والوصف) لكل منطقة.
# show health aggregation policies
gcloud beta compute health-aggregation-policies list --regions=${REGION_1}
# show health sources
gcloud beta compute health-sources list --regions=${REGION_1}
# show composite health checks
gcloud beta compute composite-health-checks list --regions=${REGION_1}
إعداد صحة الخدمة bar في المنطقة 2
إنشاء سياسة تجميع بيانات الصحة
gcloud beta compute health-aggregation-policies create bar-health-policy \
--region=${REGION_2} \
--healthy-percent-threshold=60 \
--min-healthy-threshold=1
إنشاء مصدر معلومات صحية
gcloud beta compute health-sources create bar-health-source \
--region=${REGION_2} \
--source-type=BACKEND_SERVICE \
--sources=ilb-bar \
--health-aggregation-policy=bar-health-policy
إنشاء عملية تحقّق مركّبة من الصحة
gcloud beta compute composite-health-checks create bar-health-composite \
--region=${REGION_2} \
--health-sources=bar-health-source \
--health-destination=projects/${PROJECT_ID}/regions/${REGION_2}/forwardingRules/fr-bar
التحقّق من إعدادات bar سلامة الخدمة
# show health aggregation policies
gcloud beta compute health-aggregation-policies list --regions=${REGION_2}
# show health sources
gcloud beta compute health-sources list --regions=${REGION_2}
# show composite health checks
gcloud beta compute composite-health-checks list --regions=${REGION_2}
بهذا نكون قد انتهينا من جزء الإعدادات، وسننتقل الآن إلى الاختبار.
7. اختبار تجاوز الأعطال
سيناريو غير سليم لمنطقة 1 في الخدمة foo
يحاكي هذا السيناريو تعذُّر خدمة المنتج PSC foo في المنطقة 1 من خلال إيقاف خادم الويب على أحد مثيلَي الجهاز الافتراضي.
الحصول على تفاصيل الجهاز الافتراضي للخادم
# set env var for a foo service vm name
export FOO_FAIL_NAME=$(gcloud compute instance-groups managed list-instances mig-foo \
--limit=1 \
--region=${REGION_1} \
--format="value(name)")
echo ${FOO_FAIL_NAME}
# set env var for a foo service zone
export FOO_FAIL_ZONE=$(gcloud compute instance-groups managed list-instances mig-foo \
--limit=1 \
--region=${REGION_1} \
--format="value(ZONE)")
echo ${FOO_FAIL_ZONE}
استخدِم SSH للوصول إلى الجهاز الافتراضي للخادم وأوقِف الخادم http
gcloud compute ssh ${FOO_FAIL_NAME} --zone=${FOO_FAIL_ZONE}
# stop apache http server to fail service
sudo systemctl stop apache2
# verify service dead
sudo systemctl status apache2 | grep Active:
# exit vm ssh
exit
التحقّق من أنّ الخدمة الإقليمية غير سليمة
# check health state of backend service
gcloud compute backend-services get-health ilb-foo --region=${REGION_1}
يجب أن تبدو النتيجة مشابهة لما يلي...
backend: .../regions/<REGION_1>/instanceGroups/mig-foo
status:
healthStatus:
- forwardingRule: .../regions/<REGION_1>/forwardingRules/fr-foo
forwardingRuleIp: 172.16.1.99
healthState: UNHEALTHY
instance: .../zones/<ZONE_1x>/instances/<FOO_FAIL_NAME>
ipAddress: <FOO_FAIL_IP>
port: 80
- forwardingRule: .../regions/<REGION_1>/forwardingRules/fr-foo
forwardingRuleIp: 172.16.1.99
healthState: HEALTHY
instance: .../zones/<ZONE_1y>/instances/<FOO_OTHER_NAME>
ipAddress: <FOO_OTHER_IP>
port: 80
kind: compute#backendServiceGroupHealth
استخدام بروتوكول النقل الآمن (SSH) للوصول إلى الجهاز الافتراضي للعميل في المنطقة 1 واختبار التبديل التلقائي
gcloud compute ssh client-1 --zone=${ZONE_1}
# send request to service using hostname
curl -v www.foobar.com
# curl to ilb vip in region 1
curl 10.10.1.99
# curl to ilb vip in region 2
curl 10.10.2.99
عدّلت خدمة PSC حالة موازنة الحمل للمستهلكين ووجّهتها لتجنُّب خدمة الخلفية غير السليمة في المنطقة 1. وبدلاً من ذلك، تم توجيه الزيارات إلى الخدمة السليمة bar في المنطقة 2.
# exit client vm ssh
exit
استخدام SSH للوصول إلى الجهاز الافتراضي للخادم وإعادة تشغيل خادم http
# ssh to foo service vm
gcloud compute ssh ${FOO_FAIL_NAME} --zone=${FOO_FAIL_ZONE}
# start apache http server to return service to healthy
sudo systemctl start apache2
# verify service running
sudo systemctl status apache2 | grep Active:
# exit vm ssh
exit
تغيير السياسة الصحية
يمكن للمنتجين ضبط سياسات سلامة الخدمة استنادًا إلى معايير مختلفة. يحدّد مرجع سياسة تجميع بيانات الصحة الحد الأدنى من القيم المطلوبة للحفاظ على حالة صحية جيدة في جميع مصادر بيانات الصحة المختلفة (الخدمات الخلفية).
تعديل سياسة تجميع حالة الخدمة bar
gcloud beta compute health-aggregation-policies update bar-health-policy \
--region=${REGION_2} \
--description="min 40% threshold" \
--healthy-percent-threshold=40 \
--min-healthy-threshold=2
# verify new policy is applied
gcloud beta compute health-aggregation-policies list --regions=${REGION_2}
يحقّق هذا التغيير في سياسة الصحة للمنتجين ما يلي:
- يتم خفض الحد الأدنى لنسبة الصحة من 60% إلى 40%، وبالتالي لن يؤدي تعذّر مثيل جهاز افتراضي واحد إلى حالة غير صالحة استنادًا إلى
--healthy-percent-threshold(ستكون حالة التعذّر 50%، ولن تحتاج إلا إلى 40% لتكون صالحة). - زيادة الحد الأدنى لعدد الخلفيات السليمة من آلة افتراضية واحدة إلى آلتَين افتراضيَتَين. سيؤدي الآن تعذُّر آلة افتراضية واحدة إلى حالة غير سليمة استنادًا إلى
--min-healthy-threshold(ستكون حالة التعذُّر 1 ولكن يجب أن تكون 2 لتكون سليمة)
سيناريو غير سليم لمنطقة الخدمة bar 2
يحاكي هذا السيناريو تعذُّر خدمة المنتج PSC bar في المنطقة 2 من خلال إيقاف خادم الويب على أحد مثيلَي الجهازَين الافتراضيين.
الحصول على تفاصيل الجهاز الافتراضي للخادم
# set env var for a bar service vm name
export BAR_FAIL_NAME=$(gcloud compute instance-groups managed list-instances mig-bar \
--limit=1 \
--region=${REGION_2} \
--format="value(name)")
echo ${BAR_FAIL_NAME}
# set env var for a bar service zone
export BAR_FAIL_ZONE=$(gcloud compute instance-groups managed list-instances mig-bar \
--limit=1 \
--region=${REGION_2} \
--format="value(ZONE)")
echo ${BAR_FAIL_ZONE}
استخدِم SSH للوصول إلى الجهاز الافتراضي للخادم وأوقِف الخادم http
gcloud compute ssh ${BAR_FAIL_NAME} --zone=${BAR_FAIL_ZONE}
# stop apache http server to fail service
sudo systemctl stop apache2
# verify service dead
sudo systemctl status apache2 | grep Active:
# exit vm ssh
exit
التحقّق من أنّ الخدمة الإقليمية غير سليمة
# check health state of backend service
gcloud compute backend-services get-health ilb-bar --region=${REGION_2}
يجب أن تبدو النتيجة مشابهة لما يلي...
backend: .../regions/<REGION_2>/instanceGroups/mig-bar
status:
healthStatus:
- forwardingRule: .../regions/<REGION_2>/forwardingRules/fr-bar
forwardingRuleIp: 172.16.2.99
healthState: UNHEALTHY
instance: .../zones/<ZONE_2x>/instances/<BAR_FAIL_NAME>
ipAddress: <BAR_FAIL_IP>
port: 80
- forwardingRule: .../regions/<REGION_2>/forwardingRules/fr-bar
forwardingRuleIp: 172.16.2.99
healthState: HEALTHY
instance: .../zones/<ZONE_2y>/instances/<BAR_OTHER_NAME>
ipAddress: <BAR_OTHER_IP>
port: 80
kind: compute#backendServiceGroupHealth
استخدام بروتوكول النقل الآمن (SSH) للوصول إلى الجهاز الافتراضي للعميل في المنطقة 2 واختبار التبديل التلقائي
gcloud compute ssh client-2 --zone=${ZONE_2}
# send request to service using hostname
curl -v www.foobar.com
# curl to ilb vip in region 1
curl 10.10.1.99
# curl to ilb vip in region 2
curl 10.10.2.99
عدّلت خدمة PSC حالة جهاز موازنة الحمل الخاص بالمستهلك وأمرته بتجنُّب خدمة الخلفية غير السليمة في المنطقة 2. بدلاً من ذلك، تم توجيه الزيارات إلى الخدمة السليمة foo في المنطقة 1.
في حال رصد موازن التحميل الخاص بالمستهلك جميع خدمات المنتج على أنّها غير سليمة، لن يتمكّن موازن التحميل من التبديل الاحتياطي إلى مثيل سليم. السلوك المتوقّع هو أن يوزّع موازن التحميل عدد الزيارات على جميع الخلفيات غير السليمة (fail open).
# exit client vm ssh
exit
بهذا نكون قد انتهينا من جزء الاختبار... لننتقل إلى التنظيف.
8. تنظيف
# delete health resources
gcloud -q beta compute composite-health-checks delete foo-health-composite --region=${REGION_1}
gcloud -q beta compute health-sources delete foo-health-source --region=${REGION_1}
gcloud -q beta compute health-aggregation-policies delete foo-health-policy --region=${REGION_1}
gcloud -q beta compute composite-health-checks delete bar-health-composite --region=${REGION_2}
gcloud -q beta compute health-sources delete bar-health-source --region=${REGION_2}
gcloud -q beta compute health-aggregation-policies delete bar-health-policy --region=${REGION_2}
# delete consumer compute and load balancer resources
gcloud -q compute instances delete client-2 --zone=${ZONE_2}
gcloud -q compute instances delete client-1 --zone=${ZONE_1}
gcloud -q dns record-sets delete www.foobar.com --type=A --zone=zone-foobar
gcloud -q dns managed-zones delete zone-foobar
gcloud -q compute forwarding-rules delete fr-foobar-2 --global
gcloud -q compute forwarding-rules delete fr-foobar-1 --global
gcloud -q compute target-http-proxies delete proxy-foobar --global
gcloud -q compute url-maps delete ilb-foobar --global
gcloud -q compute backend-services delete bes-foobar --global
# delete consumer network resources
gcloud -q compute network-endpoint-groups delete neg-bar --region=${REGION_2}
gcloud -q compute network-endpoint-groups delete neg-foo --region=${REGION_1}
gcloud -q compute networks subnets delete subnet-proxy-2 --region=${REGION_2}
gcloud -q compute networks subnets delete subnet-proxy-1 --region=${REGION_1}
gcloud -q compute networks subnets delete subnet-client-2 --region=${REGION_2}
gcloud -q compute networks subnets delete subnet-client-1 --region=${REGION_1}
gcloud -q compute network-firewall-policies associations delete \
--firewall-policy=fw-policy-consumer \
--name=fw-policy-association-consumer \
--global-firewall-policy
gcloud -q compute network-firewall-policies delete fw-policy-consumer --global
gcloud -q compute networks delete vnet-consumer
# delete producer load balancer resources
gcloud -q compute service-attachments delete psc-sa-bar --region=${REGION_2}
gcloud -q compute service-attachments delete psc-sa-foo --region=${REGION_1}
gcloud -q compute forwarding-rules delete fr-bar --region=${REGION_2}
gcloud -q compute forwarding-rules delete fr-foo --region=${REGION_1}
gcloud -q compute backend-services delete ilb-bar --region=${REGION_2}
gcloud -q compute backend-services delete ilb-foo --region=${REGION_1}
gcloud -q compute health-checks delete hc-bar-http --region=${REGION_2}
gcloud -q compute health-checks delete hc-foo-http --region=${REGION_1}
# delete producer compute resources
gcloud -q compute instance-groups managed delete mig-bar --region=${REGION_2}
gcloud -q compute instance-groups managed delete mig-foo --region=${REGION_1}
gcloud -q compute instance-templates delete mig-template-bar --global
gcloud -q compute instance-templates delete mig-template-foo --global
# delete producer network resources
gcloud -q compute networks subnets delete subnet-bar-pscnat --region=${REGION_2}
gcloud -q compute networks subnets delete subnet-foo-pscnat --region=${REGION_1}
gcloud -q compute networks subnets delete subnet-bar --region=${REGION_2}
gcloud -q compute networks subnets delete subnet-foo --region=${REGION_1}
gcloud -q compute routers delete cr-nat-bar --region=${REGION_2}
gcloud -q compute routers delete cr-nat-foo --region=${REGION_1}
gcloud -q compute network-firewall-policies associations delete \
--firewall-policy=fw-policy-producer \
--name=fw-policy-association-producer \
--global-firewall-policy
gcloud -q compute network-firewall-policies delete fw-policy-producer --global
gcloud -q compute networks delete vnet-producer
# delete shell variables and script file
unset FOO_FAIL_NAME FOO_FAIL_ZONE BAR_FAIL_NAME BAR_FAIL_ZONE
unset PROJECT_ID REGION_1 ZONE_1 REGION_2 ZONE_2
rm vm-server-startup.sh
#
9- الخاتمة
تهانينا! لقد أعددت حالة PSC بنجاح واختبرت عملية التبديل التلقائي عند حدوث عطل إقليمي.
يمكنك تقديم أي تعليقات أو أسئلة أو تصحيحات باستخدام نموذج الملاحظات هذا.
شكرًا