১. ভূমিকা
এই কোডল্যাবে স্বয়ংক্রিয় আঞ্চলিক ফেইলওভারের জন্য প্রাইভেট সার্ভিস কানেক্ট (PSC) হেলথ নিয়ে আলোচনা করা হয়েছে। PSC হেলথ হলো একটি নেটওয়ার্কিং ফিচার যা উন্নত সার্ভিস রেজিলিয়েন্সি এবং অ্যাভেইলেবিলিটি প্রদান করে।
PSC হেলথ সার্ভিস প্রডিউসারদের নিজস্ব হেলথ পলিসি (কোন অবস্থা একটি সার্ভিসকে স্বাস্থ্যকর বা অস্বাস্থ্যকর হিসেবে সংজ্ঞায়িত করে) নির্ধারণ করতে এবং PSC ব্যাকএন্ডের মাধ্যমে সার্ভিসে সংযোগকারী সার্ভিস কনজিউমারদের কাছে স্বয়ংক্রিয়ভাবে এই সংকেতগুলো পৌঁছে দিতে সাহায্য করে। এই ফিচারটি বিশেষভাবে স্বয়ংক্রিয় ক্রস-রিজিওন ফেইলওভার সমর্থন করার জন্য ডিজাইন করা হয়েছে। যদি কোনো আঞ্চলিক প্রডিউসার সার্ভিস অস্বাস্থ্যকর হয়ে পড়ে, তাহলে কনজিউমার লোড ব্যালেন্সার স্বয়ংক্রিয়ভাবে সেই অঞ্চলে ট্র্যাফিক রাউটিং বন্ধ করে দেয় এবং অন্য অঞ্চলের একটি স্বাস্থ্যকর সার্ভিসে ট্র্যাফিক পাঠিয়ে দেয়।
ক্রস-রিজিওন ফেইলওভারের জন্য আউটলায়ার ডিটেকশনের মতো পূর্ববর্তী পদ্ধতিগুলোর তুলনায়, পিএসসি হেলথ আরও নির্ভুল ফেইলওভার সংকেত প্রদান করে, কারণ এটি সরাসরি প্রডিউসার সার্ভিস ব্যাকএন্ডগুলোর (ভিএম ইনস্ট্যান্স গ্রুপ বা নেটওয়ার্ক এন্ডপয়েন্ট) সামগ্রিক স্বাস্থ্যের উপর ভিত্তি করে তৈরি। প্রডিউসাররা তাদের নিজস্ব হেলথ লজিক নির্ধারণ করতে পারে, যা নিশ্চিত করে যে সার্ভিসটি যখন প্রয়োজনীয় স্বাস্থ্যগত মানদণ্ড পূরণ করে, কেবল তখনই প্রডিউসার ট্র্যাফিক গ্রহণ করবে।
আপনি যা শিখবেন
- পিএসসি স্বাস্থ্যের উপাদানসমূহ এবং একটি উৎপাদক পরিষেবার স্বাস্থ্য অবস্থা নির্ধারণে সেগুলো কীভাবে একত্রে কাজ করে
- gcloud কমান্ড ব্যবহার করে একটি প্রডিউসার সার্ভিসের জন্য PSC হেলথ বাস্তবায়ন করা
- প্রডিউসার পিএসসি হেলথ পলিসি থেকে হেলথ সিগন্যাল ব্যবহার করার জন্য একটি ক্রস-রিজিওন পিএসসি কনজিউমার অ্যাক্সেস লোড ব্যালান্সারের কনফিগারেশন।
- পরিষেবা ব্যর্থতার পরিস্থিতি পরীক্ষা করা এবং স্বয়ংক্রিয় আন্তঃ-আঞ্চলিক ফেইলওভার যাচাই করা
আপনার যা প্রয়োজন
- একটি গুগল ক্লাউড প্রকল্প
- পূর্বনির্ধারিত
roles/compute.adminরোল অথবাroles/adminবা legacyroles/ownerমতো একটি বিস্তৃত মৌলিক রোলে IAM অনুমতি প্রদান করা হয়। - গুগল ক্লাউড নেটওয়ার্কিং ধারণা এবং গুগল ক্লাউড সিএলআই ব্যবহারে পরিচিতি
২. ধারণা
পিএসসি নেটওয়ার্কিং
এই কোডল্যাব নেটওয়ার্ক টপোলজিতে দুটি সক্রিয় গুগল ক্লাউড রিজিয়নে একটি কনজিউমার এবং একটি প্রোডিউসার ভিপিসি নেটওয়ার্ক অন্তর্ভুক্ত রয়েছে।
কনজিউমার সাইডে আঞ্চলিক সাবনেট রয়েছে, যেখানে ক্লায়েন্ট ভিএম ইনস্ট্যান্সগুলো একটি ক্রস-রিজিওনাল অভ্যন্তরীণ অ্যাপ্লিকেশন লোড ব্যালান্সারের মাধ্যমে প্রডিউসার সার্ভিস অ্যাক্সেস করতে ব্যবহৃত হয়, যার ব্যাকএন্ড হিসেবে পিএসসি নেটওয়ার্ক এন্ডপয়েন্ট গ্রুপ (এনইজি) ব্যবহৃত হয়। গ্লোবাল (ক্রস-রিজিওনাল) ক্লায়েন্ট ইনগ্রেসের জন্য আঞ্চলিক আইপি অ্যাড্রেসসহ দুটি আঞ্চলিক লোড ব্যালান্সার ফরওয়ার্ডিং রুল রয়েছে। ব্যাকএন্ড সার্ভিসটি একটি গ্লোবাল রিসোর্স যা বিভিন্ন অঞ্চলের এনইজি-গুলোকে সাপোর্ট করে। ফেইলওভার পরিস্থিতিতে, যেকোনো একটি আঞ্চলিক ফ্রন্টএন্ড ফরওয়ার্ডিং রুলে সংযোগকারী কোনো ক্লায়েন্টকে একটি সচল গ্লোবাল ব্যাকএন্ডে পাঠানো যেতে পারে।
চিত্র ১. কোডল্যাব নেটওয়ার্ক টপোলজি
প্রযোজক প্রান্তে আঞ্চলিক সাবনেট রয়েছে, যেগুলিতে আঞ্চলিক অভ্যন্তরীণ পাসথ্রু নেটওয়ার্ক লোড ব্যালেন্সার থাকে, যা একটি আঞ্চলিক PSC সার্ভিস অ্যাটাচমেন্ট রিসোর্সের মাধ্যমে একটি পরিষেবা প্রদান করে। ব্যাকএন্ড পরিষেবাগুলিতে আঞ্চলিক ম্যানেজড ইনস্ট্যান্স গ্রুপ (MIG) থাকে এবং http অনুরোধ পরীক্ষা করে ও 200 (OK) প্রতিক্রিয়া যাচাই করে সেগুলির স্বাস্থ্য পরীক্ষা করা হয়।
কোন কোন লোড ব্যালেন্সার PSC হেলথ সমর্থন করে তা দেখতে, প্রোডিউসার কনফিগারেশনের জন্য প্রাইভেট সার্ভিস কানেক্ট সামঞ্জস্যতার সর্বশেষ ডকুমেন্টেশন দেখুন।
পরিষেবা স্বাস্থ্য
লোড ব্যালেন্সার তৈরির সময় কনফিগার করা প্রডিউসার ব্যাকএন্ড সার্ভিস হেলথ চেক, পিএসসি হেলথ ফিচারের জন্য মূল সংকেত হিসেবে কাজ করে। হেলথ সোর্স রিসোর্সটি একটি একক ব্যাকএন্ড সার্ভিসের স্বাস্থ্য অবস্থা নির্ধারণ করার জন্য, হেলথ অ্যাগ্রিগেশন পলিসি রিসোর্সে সংজ্ঞায়িত অতিরিক্ত সীমাবদ্ধতার সাথে সেই সংকেতটি ব্যবহার করে।
ডিফল্টরূপে, একটি পরিষেবা স্বাস্থ্যকর বলে বিবেচিত হয় যখন এই উভয় শর্তই পূরণ হয়:
- ন্যূনতম
xশতাংশ ব্যাকএন্ড সুস্থ থাকতে হবে (ডিফল্ট60) - সর্বনিম্ন
yসংখ্যক ব্যাকএন্ড সুস্থ আছে (ডিফল্ট1)
কম্পোজিট হেলথ চেকটি সম্পূর্ণ রিজিওনাল প্রোডিউসার সার্ভিসের সার্বিক স্বাস্থ্য নির্ধারণ করার জন্য সমস্ত ব্যাকএন্ড সার্ভিসের সকল হেলথ সোর্সকে রেফারেন্স হিসেবে ব্যবহার করে। এই ল্যাবের ক্ষেত্রে, প্রতিটি রিজিওনাল প্রোডিউসার সার্ভিসের কেবল একটিই ব্যাকএন্ড সার্ভিস হেলথ সোর্স রয়েছে, যা একত্রিত হয়ে একটি কম্পোজিট হেলথ চেক গঠন করে।
চিত্র ২. পিএসসি স্বাস্থ্য সম্পদ মডেল
কম্পোজিট হেলথ চেক রিসোর্স ডেফিনিশনটি প্রডিউসার সার্ভিস লোড ব্যালান্সারের ফরওয়ার্ডিং রুলকেও নির্দেশ করে। কনজিউমার অ্যাক্সেস লোড ব্যালান্সার ব্যাকএন্ড PSC NEG যৌক্তিকভাবে প্রডিউসার PSC সার্ভিস অ্যাটাচমেন্ট এবং প্রডিউসার লোড ব্যালান্সার ফরওয়ার্ডিং রুলের সাথে সংযুক্ত থাকে। এটি কনজিউমার অ্যাক্সেস লোড ব্যালান্সারকে প্রডিউসার সার্ভিসের কম্পোজিট হেলথ চেক স্টেটের সাথে যুক্ত করে। এরপর আঞ্চলিক প্রডিউসার সার্ভিসের সামগ্রিক সার্ভিস হেলথ কনজিউমার লোড ব্যালান্সারে পাঠানো হয়, যাতে উপযুক্ত ব্যাকএন্ড নির্বাচন করা যায়।
৩. প্রজেক্ট সেটআপ
আপনার প্রজেক্ট অ্যাক্সেস করুন
এই কোডল্যাবটি একটিমাত্র গুগল ক্লাউড প্রজেক্ট ব্যবহারের জন্য লেখা হয়েছে। কনফিগারেশনের ধাপগুলোতে gcloud এবং লিনাক্স শেল কমান্ড ব্যবহার করা হয়েছে।
দ্রষ্টব্য: প্রোডাকশন ডেপ্লয়মেন্টে, PSC কনজিউমার রিসোর্স এবং প্রডিউসার সার্ভিসগুলো সাধারণত ভিন্ন ভিন্ন প্রজেক্টে থাকে।
আপনার গুগল ক্লাউড প্রজেক্টের কমান্ড লাইন অ্যাক্সেস করে শুরু করুন, নিম্নলিখিতটি ব্যবহার করে:
- ক্লাউড শেল
http://shell.cloud.google.com/, অথবা -
gcloudCLI ইনস্টল করা একটি স্থানীয় টার্মিনাল
আপনার প্রজেক্ট আইডি সেট করুন
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
৪. প্রযোজক পরিষেবা
শেয়ার করা রিসোর্স তৈরি করুন
নেটওয়ার্ক তৈরি করুন
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
ক্লাউড রাউটার এবং 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 সার্ভার সহ একটি VM স্টার্টআপ কনফিগারেশন তৈরি করুন
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 সেট আপ করুন
সার্ভিস কম্পিউট তৈরি করুন
# 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 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
৫. ভোক্তার প্রবেশাধিকার
ক্লায়েন্ট রিসোর্স সেট আপ করুন
নেটওয়ার্ক উপাদান তৈরি করুন
# 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
টেস্ট সার্ভিস বেসলাইন
অঞ্চল ১-এ ক্লায়েন্ট ভিএম-এ SSH করুন
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 এর ব্যাকএন্ডগুলোকে অগ্রাধিকার দেওয়া। যদি সমস্ত ব্যাকএন্ড রিসোর্স সুস্থ থাকে, তবে সর্বনিম্ন ল্যাটেন্সির অঞ্চলটি প্রাধান্য পায়। গ্লোবাল ব্যাকএন্ডগুলো সঠিক হেলথ সিগন্যালযুক্ত অন্য অঞ্চলে ফেইলওভার করবে।
কিন্তু যেহেতু প্রকৃত প্রডিউসার সার্ভিস রিসোর্সগুলো প্রডিউসার ভিপিসি নেটওয়ার্কে প্রডিউসার লোড ব্যালান্সারের পেছনে থাকে, তাই এই হেলথ সিগন্যালগুলো আগে কনজিউমার লোড ব্যালান্সারের কাছে অস্বচ্ছ ছিল – এবং এর ফলে কনজিউমার প্রান্ত এই ধরনের ব্যাকএন্ড ফেইলওভার সিদ্ধান্ত নিতে পারত না। পিএসসি হেলথ প্রডিউসার প্রান্ত থেকে কনজিউমার প্রান্তে সার্ভিসের স্বাস্থ্য সম্পর্কিত তথ্য প্রচার করার মাধ্যমে এই সমস্যার সমাধান করে।
৬. স্বাস্থ্য সম্পদ
আঞ্চলিক পরিষেবার সামগ্রিক অবস্থা তুলে ধরার জন্য প্রযোজক কর্তৃক পিএসসি হেলথ রিসোর্সসমূহ কনফিগার করা হয়। একটি কার্যকর পরিষেবা স্তর বজায় রাখার জন্য পরিষেবা প্রযোজক যা উপযুক্ত বলে মনে করেন, তার উপর ভিত্তি করেই এই স্বাস্থ্য নীতিটি তৈরি করা হয়। যখন প্রযোজক কর্তৃক নির্ধারিত শর্তগুলো আর পূরণ হয় না, তখন গ্রাহকদের ফেইলওভারের জন্য অবহিত করতে থ্রেশহোল্ড নির্ধারণ করা হয়।
অঞ্চল ১-এ সার্ভিস হেলথ 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 হেলথ কনফিগারেশন যাচাই করুন
প্রতিটি অঞ্চলের জন্য তালিকা (এবং বর্ণনা ) কমান্ড ব্যবহার করে স্বাস্থ্য সম্পদের কনফিগারেশন দেখা যেতে পারে।
# 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}
এর মাধ্যমেই কনফিগারেশন পর্ব শেষ হলো... এবার পরীক্ষার পালা।
৭. ফেইলওভার টেস্টিং
সার্ভিস foo অঞ্চল ১ অস্বাস্থ্যকর পরিস্থিতি
এই সিনারিওটি দুটি ভিএম ইনস্ট্যান্সের মধ্যে একটিতে ওয়েব সার্ভার বন্ধ করার মাধ্যমে অঞ্চল ১-এ পিএসসি প্রডিউসার সার্ভিস 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}
সার্ভার ভিএম-এ 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 করুন এবং ফেইলওভার পরীক্ষা করুন।
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 হেলথ কনজিউমার লোড ব্যালেন্সারটি আপডেট করেছে এবং এটিকে রিজিয়ন ১-এর আনহেলদি ব্যাকএন্ড সার্ভিসটি এড়িয়ে চলার নির্দেশ দিয়েছে। এর পরিবর্তে, এটি রিজিয়ন ২-এর হেলদি সার্ভিস bar ট্র্যাফিক পাঠিয়েছে।
# 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}
উৎপাদকদের স্বাস্থ্য বিষয়ক এই নীতি পরিবর্তনটি নিম্নলিখিত বিষয়গুলো সম্পন্ন করে:
- ন্যূনতম স্বাস্থ্যকর থ্রেশহোল্ড শতাংশ ৬০% থেকে কমিয়ে ৪০% করা হয়েছে – এখন
--healthy-percent-thresholdএর উপর ভিত্তি করে একটি একক VM ইনস্ট্যান্স ব্যর্থ হলে তা আর অস্বাস্থ্যকর অবস্থা তৈরি করবে না (ব্যর্থতার অবস্থা হবে ৫০% এবং স্বাস্থ্যকর হওয়ার জন্য মাত্র ৪০% প্রয়োজন)। - ব্যাকএন্ডের ন্যূনতম সুস্থ অবস্থা বজায় রাখার জন্য প্রয়োজনীয় ভিএম ইনস্ট্যান্সের সংখ্যা ১ থেকে বাড়িয়ে ২ করা হয়েছে – এখন
--min-healthy-thresholdউপর ভিত্তি করে একটি ভিএম ইনস্ট্যান্স ব্যর্থ হলেই তা একটি অসুস্থ অবস্থা তৈরি করবে (ব্যর্থতার অবস্থা হবে ১, কিন্তু সুস্থ থাকার জন্য ২টি প্রয়োজন)।
সার্ভিস bar অঞ্চল ২ অস্বাস্থ্যকর পরিস্থিতি
এই সিনারিওটি দুটি ভিএম ইনস্ট্যান্সের মধ্যে একটিতে ওয়েব সার্ভার বন্ধ করার মাধ্যমে অঞ্চল ২-এ পিএসসি প্রডিউসার সার্ভিস 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}
সার্ভার ভিএম-এ 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 করুন এবং ফেইলওভার পরীক্ষা করুন।
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 কনজিউমার লোড ব্যালেন্সারটি আপডেট করেছে এবং এটিকে রিজিয়ন ২-এর আনহেলদি ব্যাকএন্ড সার্ভিসটি এড়িয়ে চলার নির্দেশ দিয়েছে। এর পরিবর্তে, এটি রিজিয়ন ১-এর হেলদি সার্ভিস foo তে ট্র্যাফিক পাঠিয়েছে।
এমন পরিস্থিতিতে যেখানে কনজিউমার লোড ব্যালেন্সার সমস্ত প্রডিউসার সার্ভিসকে আনহেলদি (অস্বাস্থ্যকর) হিসেবে দেখে, তখন লোড ব্যালেন্সারটি কোনো হেলদি ইনস্ট্যান্সে ফেইলওভার করতে পারে না। এক্ষেত্রে প্রত্যাশিত আচরণ হলো, লোড ব্যালেন্সারটি সমস্ত আনহেলদি ব্যাকএন্ডগুলোর মধ্যে ট্র্যাফিক ভাগ করে দেবে (ফেইল ওপেন)।
# exit client vm ssh
exit
এর মাধ্যমেই পরীক্ষণ পর্ব শেষ হলো... এবার পরিষ্করণ পর্ব।
৮. পরিচ্ছন্নতা
# 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
#
৯. উপসংহার
অভিনন্দন! আপনি সফলভাবে PSC হেলথ কনফিগার করেছেন এবং স্বয়ংক্রিয় আঞ্চলিক ফেইলওভার পরীক্ষা করেছেন!
এই ফিডব্যাক ফর্মটি ব্যবহার করে যেকোনো মন্তব্য, প্রশ্ন বা সংশোধন জানাতে পারেন।
ধন্যবাদ!