Private Service Connect की स्थिति

1. परिचय

इस कोडलैब में, ऑटोमैटिक रीजनल फ़ेलओवर के लिए Private Service Connect (PSC) की सेहत के बारे में बताया गया है. पीएसआई हेल्थ, नेटवर्किंग की एक सुविधा है. इससे सेवा की उपलब्धता और विश्वसनीयता को बेहतर बनाया जा सकता है.

पीएसएसी की सेहत की जानकारी देने वाली सुविधा की मदद से, सेवा देने वाली कंपनियां सेहत से जुड़ी अपनी ज़रूरत के हिसाब से नीतियां तय कर सकती हैं. जैसे, स्टेट के आधार पर यह तय करना कि कोई सेवा सही तरीके से काम कर रही है या नहीं. साथ ही, इन सिग्नल को उन सेवा लेने वाली कंपनियों के साथ अपने-आप शेयर कर सकती हैं जो पीएससी बैकएंड का इस्तेमाल करके सेवा से कनेक्ट होती हैं. इस सुविधा को खास तौर पर, एक क्षेत्र से दूसरे क्षेत्र में अपने-आप फ़ेलओवर होने की सुविधा के लिए डिज़ाइन किया गया है. अगर किसी क्षेत्र में मौजूद प्रॉड्यूसर सेवा ठीक से काम नहीं करती है, तो उपभोक्ता लोड बैलेंसर, उस क्षेत्र में ट्रैफ़िक को अपने-आप भेजना बंद कर देता है. इसके बाद, वह ट्रैफ़िक को किसी दूसरे क्षेत्र में मौजूद ऐसी सेवा पर भेजता है जो ठीक से काम कर रही हो.

आउटलायर का पता लगाने जैसी क्रॉस-रीजन फ़ेलओवर की पिछली तकनीकों की तुलना में, पीएससी की सेहत से जुड़ी जानकारी से ज़्यादा सटीक फ़ेलओवर सिग्नल मिलता है. ऐसा इसलिए, क्योंकि यह सीधे तौर पर प्रोड्यूसर सेवा के बैकएंड (वीएम इंस्टेंस ग्रुप या नेटवर्क एंडपॉइंट) की सेहत से जुड़ी जानकारी पर आधारित होता है. डेटा तैयार करने वाली कंपनियां, अपनी ज़रूरत के हिसाब से हेल्थ लॉजिक तय कर सकती हैं. इससे यह पक्का किया जा सकता है कि डेटा तैयार करने वाली कंपनी को सिर्फ़ तब ट्रैफ़िक मिले, जब सेवा ज़रूरी शर्तों को पूरा करती हो.

आपको ये सब सीखने को मिलेगा

  • पीएसडी की सेहत के कॉम्पोनेंट और वे एक साथ मिलकर, प्रोड्यूसर सेवा की सेहत की स्थिति का पता कैसे लगाते हैं
  • gcloud कमांड का इस्तेमाल करके, प्रोड्यूसर सेवा के लिए पीएससी की सुविधा लागू करना
  • एक से ज़्यादा क्षेत्रों में मौजूद पीएससी उपभोक्ता के ऐक्सेस लोड बैलेंसर का कॉन्फ़िगरेशन, ताकि पीएससी की हेल्थ पॉलिसी से मिले हेल्थ सिग्नल का इस्तेमाल किया जा सके
  • सेवा में गड़बड़ी होने की स्थितियों की जांच करना और एक क्षेत्र से दूसरे क्षेत्र में अपने-आप फ़ेलओवर होने की पुष्टि करना

आपको इन चीज़ों की ज़रूरत पड़ेगी

  • Google Cloud प्रोजेक्ट
  • पहले से तय की गई roles/compute.admin भूमिका या roles/admin या लेगसी roles/owner जैसी बुनियादी भूमिका के लिए दी गई IAM अनुमतियां
  • Google Cloud के नेटवर्किंग कॉन्सेप्ट और Google Cloud CLI का इस्तेमाल करने के बारे में जानकारी

2. कॉन्सेप्ट

पीएससी नेटवर्किंग

इस कोडलैब की नेटवर्क टोपोलॉजी में, दो चालू Google Cloud क्षेत्रों में एक उपभोक्ता और एक प्रोड्यूसर वीपीसी नेटवर्क शामिल है.

उपयोगकर्ता के पास रीजनल सबनेट होते हैं. इनमें क्लाइंट वीएम इंस्टेंस का इस्तेमाल किया जाता है. इनकी मदद से, पीएससी नेटवर्क एंडपॉइंट ग्रुप (एनईजी) बैकएंड के साथ क्रॉस-रीजनल इंटरनल ऐप्लिकेशन लोड बैलेंसर के ज़रिए, प्रोड्यूसर सेवा को ऐक्सेस किया जाता है. ग्लोबल (एक से ज़्यादा रीजन) क्लाइंट के इनग्रेस के लिए, रीजनल आईपी पतों के साथ दो रीजनल लोड बैलेंसर फ़ॉरवर्डिंग नियम हैं. बैकएंड सेवा एक ग्लोबल संसाधन है. यह अलग-अलग क्षेत्रों में मौजूद एनईजी के साथ काम करती है. फ़ेलओवर के मामले में, किसी भी रीजनल फ़्रंटएंड फ़ॉरवर्डिंग नियम से कनेक्ट होने वाले क्लाइंट को, सही तरीके से काम कर रहे ग्लोबल बैकएंड पर रीडायरेक्ट किया जा सकता है.

figure1

पहली इमेज. कोडलैब नेटवर्क टोपोलॉजी

प्रोड्यूसर साइड में, रीजनल सबनेट होते हैं. इनमें रीजनल इंटरनल पासथ्रू नेटवर्क लोड बैलेंसर होते हैं. ये रीजनल पीएससी सेवा अटैचमेंट संसाधन के ज़रिए सेवा को दिखाते हैं. बैकएंड सेवाओं में, इलाके के हिसाब से मैनेज किए गए इंस्टेंस ग्रुप (एमआईजी) शामिल होते हैं. इनकी सेहत की जांच की जाती है. इसके लिए, http अनुरोधों की जांच की जाती है और 200 (OK) जवाबों की पुष्टि की जाती है.

प्रोड्यूसर कॉन्फ़िगरेशन के लिए, Private Service Connect के साथ काम करने वाले लोड बैलेंसर के बारे में जानने के लिए, इससे जुड़ा नया दस्तावेज़ देखें. इससे आपको पता चलेगा कि कौनसे लोड बैलेंसर, पीएससी की सेहत की जानकारी देने वाली सुविधा के साथ काम करते हैं.

सेवा की स्थिति

लोड बैलेंसर बनाते समय कॉन्फ़िगर की गई, प्रोड्यूसर बैकएंड सेवा की हेल्थ चेक सुविधा, पीएससी की हेल्थ सुविधा के लिए ओरिजनल सिग्नल के तौर पर काम करती है. सेहत से जुड़े डेटा के सोर्स का रिसॉर्स, उस सिग्नल का इस्तेमाल करता है. साथ ही, सेहत से जुड़े डेटा को इकट्ठा करने की नीति के रिसॉर्स में तय की गई अतिरिक्त शर्तों का इस्तेमाल करके, किसी एक बैकएंड सेवा के लिए सेहत की स्थिति का पता लगाता है.

डिफ़ॉल्ट रूप से, किसी सेवा को तब सही माना जाता है, जब ये दोनों शर्तें पूरी होती हैं:

  • कम से कम x प्रतिशत बैकएंड सही तरीके से काम कर रहे हों (डिफ़ॉल्ट रूप से 60)
  • कम से कम y बैकएंड ठीक से काम कर रहे हों (डिफ़ॉल्ट रूप से 1)

कंपोज़िट हेल्थ चेक, सभी बैकएंड सेवाओं के लिए सभी हेल्थ सोर्स का रेफ़रंस देता है. इससे, पूरे रीजनल प्रोड्यूसर सर्विस की सेहत का पता चलता है. इस लैब के मामले में, हर रीजनल प्रोड्यूसर सेवा में सिर्फ़ एक बैकएंड सेवा की सेहत से जुड़ा सोर्स होता है. यह सोर्स, एक कंपोज़िट हेल्थ चेक में रोल अप होता है.

figure2

दूसरी इमेज. PSC health resource model

कंपोज़िट हेल्थ चेक संसाधन की परिभाषा में, प्रोड्यूसर सेवा के लोड बैलेंसर के फ़ॉरवर्डिंग नियम का भी ज़िक्र किया गया है. उपयोगकर्ता के ऐक्सेस वाले लोड बैलेंसर का बैकएंड पीएससी एनईजी, लॉजिक के हिसाब से प्रोड्यूसर पीएससी सेवा अटैचमेंट और प्रोड्यूसर लोड बैलेंसर फ़ॉरवर्डिंग नियम से कनेक्ट होता है. इससे, उपभोक्ता के ऐक्सेस वाले लोड बैलेंसर को प्रोड्यूसर सेवा की कंपोज़िट हेल्थ चेक स्थिति से जोड़ा जाता है. इसके बाद, रीजनल प्रॉड्यूसर सेवा की पूरी जानकारी, उपभोक्ता लोड बैलेंसर को भेजी जाती है, ताकि सही बैकएंड चुना जा सके.

3. प्रोजेक्ट सेटअप करना

अपने प्रोजेक्ट को ऐक्सेस करना

इस कोडलैब को एक Google Cloud प्रोजेक्ट का इस्तेमाल करने के लिए लिखा गया है. कॉन्फ़िगरेशन के चरणों में, gcloud और Linux शेल कमांड का इस्तेमाल किया जाता है.

ध्यान दें: प्रोडक्शन डिप्लॉयमेंट में, पीएससी उपभोक्ता संसाधन और प्रॉड्यूसर सेवाएं आम तौर पर अलग-अलग प्रोजेक्ट में होती हैं.

इसके लिए, सबसे पहले अपने Google Cloud प्रोजेक्ट के कमांड लाइन को ऐक्सेस करें. इसके लिए, यह तरीका अपनाएं:

प्रोजेक्ट आईडी सेट करना

gcloud config set project YOUR_PROJECT_ID_HERE

शेल एनवायरमेंट वैरिएबल सेट करना

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

फ़ायरवॉल कॉम्पोनेंट बनाना

वीएम संसाधनों को ट्रैफ़िक की अनुमति देने के लिए, फ़ायरवॉल के नियमों की ज़रूरत होती है. डिफ़ॉल्ट रूप से लागू फ़ायरवॉल के नियमों के तहत, इन्ग्रेस डेटा ट्रैफ़िक को अस्वीकार किया जाता है और इग्रेस डेटा ट्रैफ़िक को अनुमति दी जाती है. फ़ायरवॉल के नियमों को डिप्लॉय करने के लिए, नीतियों का इस्तेमाल करना सबसे अच्छा तरीका है. इसके लिए, नेटवर्क फ़ायरवॉल नीति का संसाधन बनाएं. इसके बाद, नीति में नियम बनाएं और उन्हें जोड़ें. इसके बाद, नीति को किसी वीपीसी नेटवर्क से जोड़ें.

# 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

एचटीटीपी सर्वर के साथ वीएम स्टार्टअप कॉन्फ़िगरेशन बनाना

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

क्षेत्र 1 में सेवा foo सेट अप करें

Create service compute

# 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

पीएसएसी सेवा पब्लिश करना

# 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 सेट अप करना

Create service compute

# 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

पीएसएसी सेवा पब्लिश करना

# 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

उपयोगकर्ता के ऐप्लिकेशन (प्रॉक्सी पर आधारित) लोड बैलेंसर के लिए, सिर्फ़ प्रॉक्सी वाले सबनेट की ज़रूरत होती है. ये सबनेट, आईपी पतों का एक पूल उपलब्ध कराते हैं. इनका इस्तेमाल प्रॉक्सी पर आधारित लोड बैलेंसर, इंटरनल सोर्स पतों के तौर पर करते हैं. ऐसा तब किया जाता है, जब बैकएंड को ट्रैफ़िक भेजा जाता है.

# 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 में मौजूद क्लाइंट वीएम से एसएसएच कनेक्शन बनाना

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

ज़रूरी नहीं: दूसरे इलाके में मौजूद क्लाइंट वीएम से भी यही टेस्ट करें: gcloud compute ssh client-2 --zone=${ZONE_2}

अहम जानकारी: region-x में फ़ॉरवर्डिंग के नियम के तहत आने वाले क्लाइंट के अनुरोधों के लिए, लोड बैलेंसर का सामान्य व्यवहार यह होता है कि वह उसी region-x में मौजूद बैकएंड को प्राथमिकता देता है. अगर सभी बैकएंड संसाधन सही तरीके से काम कर रहे हैं, तो सबसे कम लेटेन्सी वाले क्षेत्र को चुना जाता है. ग्लोबल बैकएंड, सही हेल्थ सिग्नल के साथ दूसरे क्षेत्र में फ़ेलओवर हो जाएंगे.

हालांकि, प्रोड्यूसर सेवा के असली संसाधन, प्रोड्यूसर वीपीसी नेटवर्क में प्रोड्यूसर लोड बैलेंसर के पीछे होते हैं. इसलिए, ये हेल्थ सिग्नल पहले कंज्यूमर लोड बैलेंसर के लिए उपलब्ध नहीं थे. इसलिए, कंज्यूमर साइड, बैकएंड फ़ेलओवर के बारे में इस तरह के फ़ैसले नहीं ले पाती थी. पीएसए स्वास्थ्य, सेवा की सेहत से जुड़ी जानकारी को प्रोड्यूसर से उपयोगकर्ता तक पहुंचाता है.

6. स्वास्थ्य से जुड़े संसाधन

रीजनल सेवा की सेहत की पूरी जानकारी देने के लिए, प्रोड्यूसर, पीएससी हेल्थ रिसॉर्स कॉन्फ़िगर करता है. स्वास्थ्य से जुड़ी नीति इस बात पर आधारित होती है कि सेवा प्रड्यूसर, सेवा के लेवल को बनाए रखने के लिए क्या सही मानता है. थ्रेशोल्ड सेट किए जाते हैं, ताकि जब प्रोड्यूसर की तय की गई शर्तें पूरी न हो रही हों, तो उपभोक्ताओं को फ़ेलओवर के बारे में सूचना दी जा सके.

क्षेत्र 1 में सेवा की स्थिति foo सेट अप करें

स्वास्थ्य से जुड़ी जानकारी इकट्ठा करने की नीति बनाना

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 स्थिति कॉन्फ़िगरेशन की पुष्टि करना

हर क्षेत्र के हिसाब से, सूची (और describe) कमांड का इस्तेमाल करके, स्वास्थ्य संसाधन कॉन्फ़िगरेशन देखे जा सकते हैं

# 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 सेट अप करें

स्वास्थ्य से जुड़ी जानकारी इकट्ठा करने की नीति बनाना

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. फ़ेलओवर टेस्टिंग

सेवा foo क्षेत्र 1 में समस्या होने की स्थिति

इस उदाहरण में, दो वीएम इंस्टेंस में से किसी एक पर वेब सर्वर को बंद करके, क्षेत्र 1 में पीएससी प्रोड्यूसर सेवा foo के काम न करने की स्थिति को दिखाया गया है.

सर्वर वीएम की जानकारी पाना

# 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}

सर्वर वीएम से एसएसएच करें और 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

पहले क्षेत्र के क्लाइंट वीएम से एसएसएच करें और फ़ेलओवर की जांच करें

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 health ने उपभोक्ता लोड बैलेंसर को अपडेट कर दिया है. साथ ही, इसे पहले इलाके में बैकएंड सेवा से बचने का निर्देश दिया है. इसके बजाय, इसने ट्रैफ़िक को क्षेत्र 2 में मौजूद सही सेवा bar पर भेज दिया है.

# exit client vm ssh
exit

सर्वर वीएम से एसएसएच करें और 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}

प्रड्यूसर की सेहत से जुड़ी नीति में हुए इस बदलाव से ये काम किए जा सकेंगे:

  1. सेहतमंद थ्रेशोल्ड के कम से कम प्रतिशत को 60% से घटाकर 40% कर दिया गया है. अब एक वीएम इंस्टेंस के फ़ेल होने पर, --healthy-percent-threshold के आधार पर अस्वस्थ स्थिति ट्रिगर नहीं होगी (फ़ेल होने की स्थिति 50% होगी और सेहतमंद होने के लिए सिर्फ़ 40% की ज़रूरत होगी)
  2. बैकएंड के लिए, कम से कम स्वस्थ वीएम इंस्टेंस की संख्या को 1 से बढ़ाकर 2 कर दिया गया है. अब एक वीएम इंस्टेंस के फ़ेल होने पर, --min-healthy-threshold के आधार पर अस्वस्थ स्थिति ट्रिगर होगी (फ़ेल होने की स्थिति 1 होगी, लेकिन स्वस्थ होने के लिए 2 की ज़रूरत होगी)

सेवा bar क्षेत्र 2 में गड़बड़ी की स्थिति

इस उदाहरण में, दो वीएम इंस्टेंस में से किसी एक पर वेब सर्वर को बंद करके, क्षेत्र 2 में पीएससी प्रोड्यूसर सेवा bar के काम न करने की स्थिति को दिखाया गया है.

सर्वर वीएम की जानकारी पाना

# 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}

सर्वर वीएम से एसएसएच करें और 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

दूसरे रीजन के क्लाइंट वीएम से एसएसएच करें और फ़ेलओवर की जांच करें

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 Health ने उपभोक्ता लोड बैलेंसर को अपडेट कर दिया है. साथ ही, इसे दूसरे इलाके में बैकएंड सेवा का इस्तेमाल न करने का निर्देश दिया है. इसके बजाय, इसने ट्रैफ़िक को क्षेत्र 1 में मौजूद सही सेवा foo पर भेज दिया है.

अगर उपभोक्ता लोड बैलेंसर को सभी प्रोड्यूसर सेवाएं अस्वस्थ दिखती हैं, तो लोड बैलेंसर किसी स्वस्थ इंस्टेंस पर फ़ेलओवर नहीं कर सकता. लोड बैलेंसर को सभी अस्वस्थ बैकएंड (फ़ेल ओपन) पर ट्रैफ़िक को डिस्ट्रिब्यूट करना चाहिए.

# 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. नतीजा

बधाई हो! आपने पीएससी की सेहत की जांच करने की सुविधा को कॉन्फ़िगर कर लिया है. साथ ही, रीजनल फ़ेलओवर की सुविधा को अपने-आप चालू होने की जांच कर ली है!

इस फ़ीडबैक फ़ॉर्म का इस्तेमाल करके, बेझिझक कोई टिप्पणी करें, सवाल पूछें या सुधार के बारे में बताएं.

धन्यवाद!