مقياس "الصحة المركّبة" في Private Service Connect

1. مقدمة

يستكشف هذا الدرس التطبيقي حول الترميز الصحة المركّبة لخدمة Private Service Connect (PSC) من أجل التبديل التلقائي عند حدوث عطل إقليمي. ‫Composite Health for PSC هي ميزة شبكات توفّر تحسّنًا في مرونة الخدمة ومدى توفّرها.

تتيح ميزة "الحالة المركّبة" لمقدّمي الخدمات تحديد سياسات حالة مخصّصة (أي حالة تحدّد ما إذا كانت الخدمة سليمة أو غير سليمة) ونشر هذه الإشارات تلقائيًا إلى مستهلكي الخدمات الذين يتصلون بالخدمة باستخدام الخوادم الخلفية في Private Service Connect. تم تصميم هذه الميزة خصيصًا لدعم عملية التبديل التلقائي عند حدوث عطل في منطقة معيّنة. إذا أصبحت خدمة مقدّم الخدمات الإقليمية غير سليمة، يتوقف موازن التحميل لدى المستهلك تلقائيًا عن توجيه الزيارات إلى تلك المنطقة ويوجهها إلى خدمة سليمة في منطقة أخرى.

مقارنةً بالطرق السابقة لتجاوز الأعطال في مناطق متعدّدة، مثل رصد القيم الشاذة، توفّر ميزة "الصحة المركّبة" إشارة أكثر دقة لتجاوز الأعطال لأنّها تستند مباشرةً إلى الصحة المجمّعة لخوادم الخلفية لخدمة المنتج (مجموعات مثيلات الأجهزة الافتراضية أو نقاط نهاية الشبكة). يمكن للمنتجين تحديد منطق الصحة الخاص بهم، ما يضمن ألا يتلقّى المنتج زيارات إلا عندما تستوفي الخدمة معايير الصحة اللازمة.

ما ستتعلمه

  • مكوّنات الصحة المركّبة وكيفية عملها معًا لتحديد الحالة الصحية لخدمة منتِجة
  • تنفيذ حالة "سليم" المركّبة لخدمة Private Service Connect (PSC) لخدمة منتِج باستخدام أوامر gcloud
  • إعداد جهاز موازنة حمل للوصول إلى مستهلك PSC في مناطق متعددة لاستخدام إشارات الصحة من سياسة الصحة المركّبة الخاصة بالمنتج
  • اختبار سيناريوهات تعذُّر الخدمة والتحقّق من إمكانية الانتقال التلقائي إلى منطقة أخرى

ما تحتاج إليه

  • مشروع Google Cloud
  • أذونات "إدارة الهوية وإمكانية الوصول" الممنوحة للدور roles/compute.admin المحدّد مسبقًا أو دور أساسي واسع النطاق مثل roles/admin أو roles/owner القديم
  • الإلمام بمفاهيم الشبكات في Google Cloud واستخدام واجهة سطر الأوامر (CLI) في Google Cloud

2. المفاهيم

ربط PSC

يتضمّن تصميم شبكة Codelab شبكة VPC خاصة بالمستهلك وشبكة VPC خاصة بالمنتج في منطقتَين نشطتَين من Google Cloud.

يحتوي جانب المستهلك على شبكات فرعية إقليمية مع مثيلات أجهزة افتراضية للعملاء تُستخدَم للوصول إلى خدمة المنتج من خلال موازنة حمل داخلية على مستوى مناطق متعددة مع خلفيات مجموعة نقاط نهاية شبكة (NEG) في PSC. هناك قاعدتا إعادة توجيه لجهاز موازنة الحمل على مستوى منطقة معيّنة، مع عناوين IP على مستوى منطقة معيّنة، لعمليات دخول العملاء على مستوى العالم (على مستوى مناطق متعدّدة). خدمة الخلفية هي مورد عالمي يتيح استخدام مجموعات NEGs في مناطق مختلفة. في سيناريو تجاوز الفشل، يمكن توجيه العميل الذي يتصل بأي من قاعدة إعادة التوجيه للواجهة الأمامية الإقليمية إلى خلفية عامة سليمة.

figure1

الشكل 1: مخطط شبكة الدرس التطبيقي

يحتوي جانب مقدّم الخدمة على شبكات فرعية إقليمية مع برامج موازنة حمل الشبكة الداخلية الإقليمية التي تعرض خدمة من خلال مورد مرفق خدمة PSC إقليمي. تحتوي الخدمات الخلفية على مجموعات مثيلات مُدارة (MIG) إقليمية ويتم التحقّق من سلامتها من خلال فحص طلبات http والتحقّق من صحة استجابات 200 (OK).

راجِع أحدث المستندات حول توافق Private Service Connect مع إعدادات المنتج لمعرفة أجهزة موازنة الحمل التي تتيح استخدام Composite Health مع Private Service Connect.

جودة الخدمة

يعمل فحص سلامة خدمة الخلفية للمنتج، الذي تم ضبطه أثناء إنشاء موازنة الحمل، كإشارة مصدرية للصحة المركّبة لميزة PSC. يستخدم مورد مصدر السلامة هذه الإشارة مع قيود إضافية محدّدة في مورد سياسة تجميع السلامة لتحديد حالة السلامة لخدمة خلفية واحدة.

بشكلٍ تلقائي، تُعتبر الخدمة سليمة عندما يتم استيفاء هذين الشرطين:

  • الحدّ الأدنى لنسبة الأنظمة الخلفية السليمة هو ‎x في المئة (القيمة التلقائية هي ‎60)
  • الحد الأدنى لعدد الأنظمة الخلفية السليمة هو y (القيمة التلقائية هي 1)

يشير فحص الحالة المركّب إلى جميع مصادر الحالة لجميع خدمات الخلفية من أجل تحديد الحالة العامة لخدمة المنتج الإقليمية بأكملها. في حالة هذه الميزة الاختبارية، تحتوي كل خدمة منتِجة إقليمية على مصدر واحد فقط لبيانات سلامة الخدمة الخلفية يتم تجميعه في عملية فحص سلامة مركّبة واحدة.

figure2

الشكل 2. نموذج موارد الصحة المركّبة لبرنامج PSC

يشير تعريف مورد فحص الصحة المركّب أيضًا إلى قاعدة إعادة التوجيه الخاصة بموازن الحمل لخدمة المنتج. يتم ربط مجموعة نقاط نهاية الشبكة المختلطة (NEG) الخاصة بخدمة Private Service Connect (PSC) لموازن الحمل الخاص بوصول المستهلك منطقيًا بمرفق خدمة PSC الخاص بالمنتج وقاعدة إعادة التوجيه الخاصة بموازن الحمل الخاص بالمنتج. يؤدي ذلك إلى ربط موازن الحمل الخاص بوصول المستهلك بحالة فحص الصحة المركّب لخدمة المنتج. بعد ذلك، يتم نشر حالة الصحة العامة للخدمة الإقليمية الخاصة بالمنتج إلى موازن الحمل الخاص بالمستهلك لإجراء عملية اختيار الخلفية المناسبة.

3- إعداد المشروع

الوصول إلى مشروعك

تمت كتابة هذا الدرس التطبيقي حول الترميز لاستخدام مشروع واحد على Google Cloud. وتستخدم خطوات الإعداد gcloud وأوامر shell في Linux.

ملاحظة: في عملية نشر في مرحلة الإنتاج، تكون موارد المستهلكين وخدمات المنتجين في PSC عادةً في مشاريع مختلفة.

ابدأ بالوصول إلى سطر الأوامر في مشروع Google Cloud باستخدام:

ضبط رقم تعريف المشروع

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

الأداء المتوقّع للخدمة الاختبارية

من الجهاز الظاهري للعميل في المنطقة 1

# send request from vm to service using hostname
gcloud compute ssh client-1 --zone=${ZONE_1} --command='
  curl -s -v www.foobar.com'
# send request from vm to load balancer forwarding rule region 1
gcloud compute ssh client-1 --zone=${ZONE_1} --command='
  curl -s 10.10.1.99'
# send request from vm to load balancer forwarding rule region 2
gcloud compute ssh client-1 --zone=${ZONE_1} --command='
  curl -s 10.10.2.99'

اختياري: جرِّب الاختبارات نفسها من الجهاز الظاهري للعميل في المنطقة 2: gcloud compute ssh client-2 --zone=${ZONE_2}

نقطة أساسية: إنّ السلوك العادي لموازنة الحمل لطلبات العملاء التي تدخل قاعدة إعادة التوجيه في region-x هو تفضيل الخلفيات في region-x نفسه. إذا كانت جميع موارد الخلفية سليمة، ستفوز المنطقة ذات أقل وقت استجابة. سيتم التبديل التلقائي للخوادم الخلفية العامة إلى المنطقة الأخرى التي تتضمّن إشارة الصحة المناسبة.

ولكن بما أنّ موارد خدمة المنتِج الفعلية تقع خلف موازن الحمل للمنتِج في شبكة VPC للمنتِج، كانت إشارات السلامة هذه غير واضحة سابقًا لموازن الحمل للمستهلِك، وبالتالي لم يتمكّن جانب المستهلِك من تحديد حالات الانتقال التلقائي إلى خادم احتياطي. تعالج ميزة "سلامة Private Service Connect" هذه المشكلة من خلال نشر معلومات سلامة الخدمة من جانب المنتِج إلى جانب المستهلِك.

6. المراجع المتعلقة بالصحة

يتم ضبط "الصحة المركّبة" لموارد Private Service Connect من قِبل المنتِج لتمثيل الصحة العامة للخدمة الإقليمية. تستند سياسة الصحة إلى ما يحدّده مقدّم الخدمة على أنّه مناسب للحفاظ على مستوى الخدمة. يتم ضبط الحدود الدنيا لإعلام المستهلكين بالتبديل إلى نظام احتياطي عندما لا يتم استيفاء الشروط التي حدّدها المنتج.

إعداد "سلامة الخدمة" foo في المنطقة 1

إنشاء سياسة تجميع بيانات الصحة

gcloud compute health-aggregation-policies create foo-health-policy \
  --region=${REGION_1} \
  --healthy-percent-threshold=60 \
  --min-healthy-threshold=1

إنشاء مصدر معلومات صحية

gcloud compute health-sources create foo-health-source \
  --region=${REGION_1} \
  --source-type=BACKEND_SERVICE \
  --sources=ilb-foo \
  --health-aggregation-policy=foo-health-policy

إنشاء فحص صحي مركّب

gcloud 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 compute health-aggregation-policies list --regions=${REGION_1}

# show health sources
gcloud compute health-sources list --regions=${REGION_1}

# show composite health checks
gcloud compute composite-health-checks list --regions=${REGION_1}

إعداد صحة الخدمة bar في المنطقة 2

إنشاء سياسة تجميع بيانات الصحة

gcloud compute health-aggregation-policies create bar-health-policy \
  --region=${REGION_2} \
  --healthy-percent-threshold=60 \
  --min-healthy-threshold=1

إنشاء مصدر معلومات صحية

gcloud compute health-sources create bar-health-source \
  --region=${REGION_2} \
  --source-type=BACKEND_SERVICE \
  --sources=ilb-bar \
  --health-aggregation-policy=bar-health-policy

إنشاء فحص صحي مركّب

gcloud 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 compute health-aggregation-policies list --regions=${REGION_2}

# show health sources
gcloud compute health-sources list --regions=${REGION_2}

# show composite health checks
gcloud compute composite-health-checks list --regions=${REGION_2}

بهذا نكون قد انتهينا من جزء الإعدادات، وسننتقل الآن إلى الاختبار.

7. اختبار تجاوز الأعطال

سيناريو غير سليم لمنطقة 1 في الخدمة foo

يحاكي هذا السيناريو تعذُّر خدمة المنتج foo في Private Service Connect في المنطقة 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}

إيقاف خادم المنطقة 1 http

# stop apache http server to fail service
gcloud compute ssh ${FOO_FAIL_NAME} --zone=${FOO_FAIL_ZONE} --command='
  sudo systemctl stop apache2'
# verify service dead
gcloud compute ssh ${FOO_FAIL_NAME} --zone=${FOO_FAIL_ZONE} --command='
  sudo systemctl status apache2 | grep Active:'

التحقّق من أنّ الخدمة الإقليمية غير سليمة

# check health state of backend service
gcloud compute backend-services get-health ilb-foo --region=${REGION_1}

يجب أن تبدو النتيجة مشابهة لما يلي...

backend: .../regions/us-west1/instanceGroups/mig-foo
status:
  healthStatus:
  -   forwardingRule: .../regions/us-west1/forwardingRules/fr-foo
    forwardingRuleIp: 172.16.1.99
    healthState: UNHEALTHY
    instance: .../zones/us-west1-a/instances/service-foo-<UID_1>
    ipAddress: 172.16.1.2
    port: 80
  -   forwardingRule: .../regions/us-west1/forwardingRules/fr-foo
    forwardingRuleIp: 172.16.1.99
    healthState: HEALTHY
    instance: .../zones/us-west1-b/instances/service-foo-<UID_2>
    ipAddress: 172.16.1.3
    port: 80
  kind: compute#backendServiceGroupHealth
# check health state of health source
gcloud compute health-sources get-health foo-health-source --region=${REGION_1}

يجب أن تبدو النتيجة مشابهة لما يلي...

healthState: UNHEALTHY
kind: compute#healthSourceHealth
sources:
- backends:
  - endpointCount: 1
    group: .../zones/us-west1-a/instanceGroups/mig-foo
    healthyEndpointCount: 0
  - endpointCount: 0
    group: .../zones/us-west1-c/instanceGroups/mig-foo
    healthyEndpointCount: 0
  - endpointCount: 1
    group: .../zones/us-west1-b/instanceGroups/mig-foo
    healthyEndpointCount: 1
  forwardingRule: .../regions/us-west1/forwardingRules/fr-foo
  source: .../regions/us-west1/backendServices/ilb-foo

تعطُّل عميل منطقة الاختبار 1 والتبديل إلى خادم احتياطي

# send request to service using hostname
gcloud compute ssh client-1 --zone=${ZONE_1} --command='
  curl -s -v www.foobar.com'
# curl to ilb vip in region 1
gcloud compute ssh client-1 --zone=${ZONE_1} --command='
  curl -s 10.10.1.99'
# curl to ilb vip in region 2
gcloud compute ssh client-1 --zone=${ZONE_1} --command='
  curl -s 10.10.2.99'

عدّل Composite Health لميزة "مزوّد الخدمة الأساسي" أداة موازنة التحميل الخاصة بالمستهلكين ووجّهها إلى تجنُّب خدمة الخلفية غير السليمة في المنطقة 1، ووجّه حركة البيانات بدلاً من ذلك إلى الخدمة السليمة bar في المنطقة 2.

إعادة تشغيل خادم المنطقة 1 http

# start apache http server to return service to healthy
gcloud compute ssh ${FOO_FAIL_NAME} --zone=${FOO_FAIL_ZONE} --command='
  sudo systemctl start apache2'
# verify service running
gcloud compute ssh ${FOO_FAIL_NAME} --zone=${FOO_FAIL_ZONE} --command='
  sudo systemctl status apache2 | grep Active:'
# check health state of health source
gcloud compute health-sources get-health foo-health-source --region=${REGION_1}

يجب أن تعرض النتيجة الآن حالة HEALTHY مشابهة لما يلي...

healthState: HEALTHY
kind: compute#healthSourceHealth
sources:
- backends:
  - endpointCount: 1
    group: .../zones/us-west1-a/instanceGroups/mig-foo
    healthyEndpointCount: 1
  - endpointCount: 0
    group: .../zones/us-west1-c/instanceGroups/mig-foo
    healthyEndpointCount: 0
  - endpointCount: 1
    group: .../zones/us-west1-b/instanceGroups/mig-foo
    healthyEndpointCount: 1
  forwardingRule: .../regions/us-west1/forwardingRules/fr-foo
  source: .../regions/us-west1/backendServices/ilb-foo

تغيير السياسة الصحية

يمكن للمنتجين ضبط سياسات سلامة الخدمة استنادًا إلى معايير مختلفة. يحدّد مرجع سياسة تجميع بيانات الصحة الحد الأدنى من القيم المطلوبة للحفاظ على حالة صحية في جميع مصادر بيانات الصحة المختلفة (الخدمات الخلفية).

تعديل سياسة تجميع بيانات صحة الخدمة bar

gcloud 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 compute health-aggregation-policies list --regions=${REGION_2}

يحقّق هذا التغيير في سياسة الصحة للمنتجين ما يلي:

  1. يتم خفض الحد الأدنى لنسبة الصحة من ‎60% إلى ‎40%، وبالتالي لن يؤدي تعذّر مثيل جهاز افتراضي واحد إلى إطلاق حالة غير صحية استنادًا إلى --healthy-percent-threshold (ستكون حالة التعذّر ‎50%، ولن تحتاج إلا إلى ‎40% لتكون صحية).
  2. زيادة الحد الأدنى لعدد الخلفيات السليمة من مثيل جهاز افتراضي واحد إلى مثيلَي جهاز افتراضي، ما يعني أنّ تعذُّر مثيل جهاز افتراضي واحد سيؤدي إلى حالة غير سليمة استنادًا إلى --min-healthy-threshold (ستكون حالة التعذّر 1 ولكن يجب أن تكون 2 لتكون سليمة)

سيناريو غير سليم لمنطقة الخدمة bar 2

يحاكي هذا السيناريو تعذُّر خدمة المنتج bar في Private Service Connect في المنطقة 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}

إيقاف خادم المنطقة 2 (http)

# stop apache http server to fail service
gcloud compute ssh ${BAR_FAIL_NAME} --zone=${BAR_FAIL_ZONE} --command='
  sudo systemctl stop apache2'
# verify service dead
gcloud compute ssh ${BAR_FAIL_NAME} --zone=${BAR_FAIL_ZONE} --command='
  sudo systemctl status apache2 | grep Active:'

التحقّق من أنّ الخدمة الإقليمية غير سليمة

# check health state of backend service
gcloud compute backend-services get-health ilb-bar --region=${REGION_2}

يجب أن تبدو النتيجة مشابهة لما يلي...

backend: .../regions/us-east1/instanceGroups/mig-bar
status:
  healthStatus:
  -   forwardingRule: .../regions/us-east1/forwardingRules/fr-bar
    forwardingRuleIp: 172.16.2.99
    healthState: UNHEALTHY
    instance: .../zones/us-east1-b/instances/service-bar-<UID_1>
    ipAddress: 172.16.2.3
    port: 80
  -   forwardingRule: .../regions/us-east1/forwardingRules/fr-bar
    forwardingRuleIp: 172.16.2.99
    healthState: HEALTHY
    instance: .../zones/us-east1-d/instances/service-foo-<UID_2>
    ipAddress: 172.16.2.2
    port: 80
  kind: compute#backendServiceGroupHealth
# check health state of health source
gcloud compute health-sources get-health bar-health-source --region=${REGION_2}

يجب أن تبدو النتيجة مشابهة لما يلي...

healthState: UNHEALTHY
kind: compute#healthSourceHealth
sources:
- backends:
  - endpointCount: 1
    group: .../zones/us-east1-b/instanceGroups/mig-bar
    healthyEndpointCount: 0
  - endpointCount: 1
    group: .../zones/us-east1-d/instanceGroups/mig-bar
    healthyEndpointCount: 1
  - endpointCount: 0
    group: .../zones/us-east1-c/instanceGroups/mig-bar
    healthyEndpointCount: 0
  forwardingRule: .../regions/us-west1/forwardingRules/fr-bar
  source: .../regions/us-west1/backendServices/ilb-bar

اختبار تجاوز تعذُّر الوصول إلى العميل في المنطقة 2

# send request to service using hostname
gcloud compute ssh client-2 --zone=${ZONE_2} --command='
  curl -s -v www.foobar.com'
# curl to ilb vip in region 1
gcloud compute ssh client-2 --zone=${ZONE_2} --command='
  curl -s 10.10.1.99'
# curl to ilb vip in region 2
gcloud compute ssh client-2 --zone=${ZONE_2} --command='
  curl -s 10.10.2.99'

عدّل Composite Health لجهاز موازنة الحمل الخاص بخدمة PSC، ووجّهه لتجنُّب خدمة الخلفية غير السليمة في المنطقة 2. بدلاً من ذلك، تم توجيه الزيارات إلى الخدمة السليمة foo في المنطقة 1.

في حال رصد موازن التحميل الخاص بالمستهلك جميع خدمات المنتج على أنّها غير سليمة، لن يتمكّن موازن التحميل من التبديل الاحتياطي إلى مثيل سليم. السلوك المتوقّع هو أن يوزّع موازن التحميل عدد الزيارات على جميع الخلفيات غير السليمة (fail open).

بهذا نكون قد انتهينا من جزء الاختبار، وسننتقل الآن إلى جزء الرصد.

8. مراقبة الحالة الصحية

يتم تلقائيًا تسجيل التغييرات في حالة الصحة. يمكن لمشاريع المنتج الاطّلاع على سجلّات مصادر الصحة وعمليات التحقّق المركّبة من الصحة. ويمكن لمشاريع المستهلك الاطّلاع على سجلّات مجموعات NEG الخاصة بخدمة PSC والمرتبطة بالخدمات المنشورة باستخدام Composite Health.

على الرغم من أنّ هذا الدرس التطبيقي ينشر موارد المستهلك والمنتج في المشروع نفسه لتبسيط العملية، إلا أنّه عند نشرها في مشاريع منفصلة، ستعرض السجلات الدورَين منفصلَين.

مورد مراقَب

عرض

اسم السجلّ

مصادر المعلومات الصحية وعمليات التحقّق المركّبة

طريقة عرض المنتج

.../logs/compute.googleapis.com%2Fcompositehealth

مجموعات NEG في Private Service Connect

طريقة عرض المستهلك

.../logs/compute.googleapis.com%2Fservicehealthchecks

سجلات "أداة نشر الأخبار"

تعرض سجلّات المنتج ملخّص الحالة الداخلية لخدمات المنتج:

  • HealthSource: حالة الخدمات الفردية في الخلفية (مثل حالات الأجهزة الافتراضية mig-bar وmig-foo)
  • CompositeHealthCheck: الحالة الصحية المجمّعة على مستوى المنطقة للخدمة المنشورة والمربوطة بوجهة قاعدة إعادة التوجيه الخاصة بالمنتج (مثل fr-bar أو fr-foo)
# query logs for producer
gcloud logging read \
  'logName="projects/'${PROJECT_ID}'/logs/compute.googleapis.com%2Fcompositehealth"' \
  --project=${PROJECT_ID} \
  --limit=10 \
  --format='table(
    timestamp.date(format="%I:%M:%S %p", tz=LOCAL):label=TIME,
    resource.type.basename():label=TYPE,
    resource.labels.location:label=REGION,
    jsonPayload.healthState:label=STATE,
    jsonPayload.sources[0].backends[].group.basename().join(","):label=BACKENDS,
    jsonPayload.sources[0].backends[].healthyEndpointCount.join(","):label=HEALTHY,
    jsonPayload.sources[0].backends[].endpointCount.join(","):label=TOTAL,
    jsonPayload.healthDestination.basename():label=DESTINATION
  )'

سجلات المستهلكين

تعرِض سجلّات المستهلك حالة السلامة التي تم نشرها لموارد المستهلك:

  • NetworkEndpointGroup: حالة الصحة التي تم نشرها لمجموعة نقاط نهاية شبكة اتصال خدمة خاصة المرتبطة بالخدمة المنشورة (مثل neg-bar وneg-foo)

في عملية إعداد منفصلة للمستهلك والمنتج، استخدِم طلب البحث في السجلّ هذا في مشروع المستهلك لاستهداف الأحداث الصحية المركّبة الخاصة بالكلمات السلبية المطابقة تمامًا في "برنامج الشركاء في المحتوى"...

# query logs for consumer
gcloud logging read \
  "logName=projects/${PROJECT_ID}/logs/compute.googleapis.com%2Fservicehealthchecks
  AND resource.type=\"compute.googleapis.com/NetworkEndpointGroupV2\"" \
  --project="${PROJECT_ID}" \
  --freshness=30m \
  --limit=10 \
  --format="table(
    timestamp.date(format='%I:%M:%S %p', tz=LOCAL):label=TIME,
    resource.labels.location:label=REGION,
    jsonPayload.serviceHealthCheckResult.healthState:label=STATE,
    jsonPayload.serviceHealthCheckResult.previousHealthState:label=PREV_STATE,
    resource.labels.network_endpoint_group_id:label=NEG_ID
  )"

بهذا نكون قد انتهينا من جزء المراقبة... لننتقل إلى التنظيف.

9- تنظيف

# delete health resources
gcloud -q compute composite-health-checks delete foo-health-composite --region=${REGION_1}

gcloud -q compute health-sources delete foo-health-source --region=${REGION_1}

gcloud -q compute health-aggregation-policies delete foo-health-policy --region=${REGION_1}

gcloud -q compute composite-health-checks delete bar-health-composite --region=${REGION_2}

gcloud -q compute health-sources delete bar-health-source --region=${REGION_2}

gcloud -q 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
#

10. الخاتمة

تهانينا! لقد نجحت في إعداد Composite Health لخدمة PSC واختبار التبديل التلقائي عند حدوث عطل إقليمي.

يمكنك تقديم أي تعليقات أو أسئلة أو تصحيحات باستخدام نموذج الملاحظات هذا.

شكرًا