1. Wprowadzenie
W tym ćwiczeniu dowiesz się, jak działa stan usługi Private Service Connect (PSC) w przypadku automatycznego przełączania awaryjnego w regionie. Stan PSC to funkcja sieciowa, która zapewnia większą odporność i dostępność usługi.
Stan usługi PSC umożliwia producentom usług definiowanie dostosowanych zasad stanu (określających, jaki stan definiuje usługę jako działającą prawidłowo lub nieprawidłowo) i automatyczne przekazywanie tych sygnałów do użytkowników usług łączących się z usługą za pomocą backendów PSC. Ta funkcja została zaprojektowana specjalnie z myślą o obsłudze automatycznego przełączania awaryjnego między regionami. Jeśli regionalna usługa producenta stanie się niesprawna, moduł równoważenia obciążenia konsumenta automatycznie przestanie kierować ruch do tego regionu i przekieruje go do sprawnej usługi w innym regionie.
W porównaniu z poprzednimi metodami przełączania awaryjnego między regionami, takimi jak wykrywanie wartości odstających, kontrola stanu PSC zapewnia dokładniejszy sygnał przełączania awaryjnego, ponieważ opiera się bezpośrednio na zagregowanym stanie backendów usługi producenta (grup instancji maszyn wirtualnych lub punktów końcowych sieci). Producenci mogą zdefiniować własną logikę stanu, dzięki czemu będą otrzymywać ruch tylko wtedy, gdy usługa spełnia niezbędne kryteria stanu.
Czego się dowiesz
- Komponenty stanu usługi PSC i sposób ich współdziałania w celu określenia stanu usługi producenta
- Implementowanie stanu usługi PSC dla usługi producenta za pomocą poleceń gcloud
- Konfigurowanie systemu równoważenia obciążenia dostępu konsumenta PSC w wielu regionach w celu używania sygnałów o stanie z zasad stanu PSC producenta
- Testowanie scenariuszy awarii usługi i weryfikowanie automatycznego przełączania awaryjnego między regionami
Wymagania
- projekt Google Cloud,
- Uprawnienia IAM przyznane roli zdefiniowanej
roles/compute.adminlub szerokiemu poziomowi podstawowemu, takiemu jakroles/adminlub starszaroles/owner - znajomość pojęć związanych z sieciami w Google Cloud i korzystania z Google Cloud CLI;
2. Pojęcia
Sieć PSC
Topologia sieci w tym ćwiczeniu obejmuje sieć VPC konsumenta i producenta w 2 aktywnych regionach Google Cloud.
Po stronie konsumenta znajdują się podsieci regionalne z instancjami maszyn wirtualnych klienta, które służą do uzyskiwania dostępu do usługi producenta za pomocą międzyregionalnego wewnętrznego systemu równoważenia obciążenia aplikacji z backendami grupy punktów końcowych sieci (NEG) usługi PSC. Istnieją 2 regionalne reguły przekierowania systemu równoważenia obciążenia z regionalnymi adresami IP na potrzeby globalnego (międzyregionalnego) ruchu przychodzącego klienta. Usługa backendu to zasób globalny, który obsługuje NEG w różnych regionach. W przypadku przełączenia awaryjnego klient łączący się z dowolną regionalną regułą przekazywania frontendu może zostać przekierowany do działającego backendu globalnego.
Rys. 1. Topologia sieci w Codelabs
Po stronie producenta znajdują się podsieci regionalne z regionalnymi wewnętrznymi przekazującymi sieciowymi systemami równoważenia obciążenia, które udostępniają usługę za pomocą regionalnego zasobu przyłącza usługi PSC. Usługi backendu zawierają regionalne zarządzane grupy instancji i są sprawdzane pod kątem stanu przez sondowanie żądań http i weryfikowanie odpowiedzi 200 (OK).
Najnowsze informacje o zgodności usługi Private Service Connect z konfiguracją producenta znajdziesz w dokumentacji. Dowiesz się z niej, które systemy równoważenia obciążenia obsługują stan PSC.
Stan usługi
Kontrola stanu usługi backendu producenta, skonfigurowana podczas tworzenia systemu równoważenia obciążenia, służy jako sygnał źródłowy funkcji stanu PSC. Zasób źródło stanu wykorzystuje ten sygnał wraz z dodatkowymi ograniczeniami zdefiniowanymi w zasobie zasady agregacji stanu, aby określić stan pojedynczej usługi backendu.
Domyślnie usługa jest uznawana za działającą prawidłowo, gdy spełnione są oba te warunki:
- co najmniej
x% backendów jest w dobrym stanie (domyślnie60), - co najmniej
ybackendów jest w dobrym stanie (domyślnie1).
Złożona kontrola stanu odwołuje się do wszystkich źródeł informacji o stanie wszystkich usług backendu, aby określić ogólny stan całej regionalnej usługi producenta. W tym laboratorium każda regionalna usługa producenta ma tylko jedno źródło informacji o stanie usługi backendu, które jest uwzględniane w jednej złożonej kontroli stanu.
Rys. 2. Model zasobów dotyczących stanu PSC
Definicja zasobu złożonej kontroli stanu odnosi się też do reguły przekierowania systemu równoważenia obciążenia usługi producenta. Backendowy NEG PSC systemu równoważenia obciążenia dostępu konsumenta jest logicznie połączony z przyłączem usługi PSC producenta i regułą przekierowania systemu równoważenia obciążenia producenta. Powiąże to system równoważenia obciążenia dostępu konsumenta ze stanem złożonej kontroli stanu usługi producenta. Ogólny stan usługi regionalnego producenta jest następnie przekazywany do systemu równoważenia obciążenia konsumenta, aby umożliwić mu wybór odpowiedniego backendu.
3. Konfigurowanie projektu
Dostęp do projektu
To ćwiczenie zostało napisane z myślą o korzystaniu z jednego projektu w chmurze Google Cloud. W krokach konfiguracji używane są polecenia gcloud i polecenia powłoki Linuksa.
UWAGA: w przypadku wdrożenia produkcyjnego zasoby konsumenta PSC i usługi producenta znajdują się zwykle w różnych projektach.
Zacznij od uzyskania dostępu do wiersza poleceń swojego projektu w chmurze Google, używając:
- Cloud Shell
http://shell.cloud.google.com/lub - Terminal lokalny z zainstalowanym interfejsem wiersza poleceń
gcloud
Ustawianie identyfikatora projektu
gcloud config set project YOUR_PROJECT_ID_HERE
Ustawianie zmiennych środowiskowych powłoki
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}
Włączanie usług API
gcloud services enable compute.googleapis.com
gcloud services enable dns.googleapis.com
4. Usługa producenta
Tworzenie zasobów udostępnionych
Utwórz sieć
gcloud compute networks create vnet-producer --subnet-mode=custom
Tworzenie podsieci
# 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
Tworzenie komponentów zapory sieciowej
Reguły zapory sieciowej są potrzebne, aby zezwalać na ruch do zasobów maszyn wirtualnych (domniemane domyślne reguły zapory sieciowej to odmowa ruchu przychodzącego i zezwolenie na ruch wychodzący). Zasady to preferowany sposób wdrażania reguł zapory sieciowej. Wymaga utworzenia zasobu zasady zapory sieciowej, utworzenia i dodania reguł do zasady, a następnie powiązania zasady z siecią 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
Tworzenie routerów Cloud Router i bram 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
Tworzenie konfiguracji uruchamiania maszyny wirtualnej z serwerem 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
Skonfiguruj usługę foo w regionie 1.
Tworzenie usługi obliczeniowej
# 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
Tworzenie komponentów systemu równoważenia obciążenia usługi
# 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
Publikowanie usługi 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
Konfigurowanie usługi bar w regionie 2
Tworzenie usługi obliczeniowej
# 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
Tworzenie komponentów systemu równoważenia obciążenia usługi
# 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
Publikowanie usługi 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. Dostęp konsumenta
Konfigurowanie zasobów klienta
Tworzenie komponentów sieci
# 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
System równoważenia obciążenia aplikacji konsumenta (oparty na proxy) wymaga podsieci tylko-proxy. Te podsieci zapewniają pulę adresów IP używanych przez systemy równoważenia obciążenia oparte na serwerze proxy jako wewnętrzne adresy źródłowe podczas wysyłania ruchu do backendów.
# 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
Tworzenie komponentów zapory sieciowej
# 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
Tworzenie komponentów systemu równoważenia obciążenia
# 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
Tworzenie rekordów DNS
# 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"
Tworzenie zasobów obliczeniowych
# 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
Testowanie wartości bazowej usługi
SSH do klienckiej maszyny wirtualnej w regionie 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
Opcjonalnie: przeprowadź te same testy na klienckiej maszynie wirtualnej w regionie 2: gcloud compute ssh client-2 --zone=${ZONE_2}
WAŻNE: normalne działanie systemu równoważenia obciążenia w przypadku żądań klientów wchodzących do reguły przekierowania w region-x polega na preferowaniu backendów w tym samym region-x. Jeśli wszystkie zasoby backendu są w dobrym stanie, wygrywa region o najkrótszym czasie oczekiwania. Globalne usługi backendu przełączą się awaryjnie na inny region z odpowiednim sygnałem stanu.
Jednak ponieważ rzeczywiste zasoby usługi producenta znajdują się za systemem równoważenia obciążenia producenta w sieci VPC producenta, sygnały o stanie były wcześniej niedostępne dla systemu równoważenia obciążenia konsumenta, a tym samym strona konsumenta nie mogła podejmować decyzji o przełączeniu awaryjnym na serwer zapasowy. PSC health rozwiązuje ten problem, przekazując informacje o stanie usługi od producenta do konsumenta.
6. Zasoby dotyczące zdrowia
Zasoby stanu usługi PSC są konfigurowane przez producenta w celu odzwierciedlenia ogólnego stanu usługi regionalnej. Zasady dotyczące stanu usługi są oparte na tym, co producent usługi uzna za odpowiednie do utrzymania działającego poziomu usługi. Progi są ustawione tak, aby powiadamiać konsumentów o przełączeniu awaryjnym, gdy warunki określone przez producenta nie są już spełnione.
Skonfiguruj stan usługi foo w regionie 1.
Tworzenie zasady agregacji stanu
gcloud beta compute health-aggregation-policies create foo-health-policy \
--region=${REGION_1} \
--healthy-percent-threshold=60 \
--min-healthy-threshold=1
Tworzenie źródła danych o stanie
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
Tworzenie złożonej kontroli stanu
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
Sprawdzanie foo stanu konfiguracji usługi
Konfiguracje zasobów związanych ze zdrowiem można wyświetlać za pomocą poleceń list (i describe) w poszczególnych regionach.
# 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}
Konfigurowanie stanu usługi bar w regionie 2
Tworzenie zasady agregacji stanu
gcloud beta compute health-aggregation-policies create bar-health-policy \
--region=${REGION_2} \
--healthy-percent-threshold=60 \
--min-healthy-threshold=1
Tworzenie źródła danych o stanie
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
Tworzenie złożonej kontroli stanu
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
Sprawdzanie bar stanu konfiguracji usługi
# 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}
To koniec konfiguracji. Przejdźmy do testowania.
7. Testowanie przełączania awaryjnego
Usługa foo w regionie 1 w złym stanie
Ten scenariusz symuluje awarię usługi producenta PSC foo w regionie 1 przez zatrzymanie serwera WWW na jednej z 2 instancji maszyn wirtualnych.
Pobieranie szczegółów maszyny wirtualnej serwera
# 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}
Połącz się z maszyną wirtualną serwera przez SSH i zatrzymaj serwer 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
Sprawdzanie, czy usługa regionalna jest w złym stanie
# check health state of backend service
gcloud compute backend-services get-health ilb-foo --region=${REGION_1}
Dane wyjściowe powinny wyglądać podobnie do tych...
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
Nawiązywanie połączenia SSH z kliencką maszyną wirtualną w regionie 1 i testowanie przełączania awaryjnego
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
Usługa PSC zaktualizowała system równoważenia obciążenia konsumenta i skierowała go tak, aby unikał niesprawnej usługi backendu w regionie 1. Zamiast tego kieruje ruch do działającej prawidłowo usługi bar w regionie 2.
# exit client vm ssh
exit
SSH do maszyny wirtualnej serwera i ponowne uruchomienie serwera 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
Zmienianie zasady dotyczącej stanu
Producenci mogą dostosowywać zasady dotyczące stanu usługi na podstawie różnych kryteriów. Zasób zasady agregacji stanu określa minimalne progi wymagane do utrzymania stanu dobrego we wszystkich źródłach stanu (usługach backendu).
Aktualizowanie zasady agregacji stanu usługi 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}
Ta zmiana zasad dotyczących zdrowia producenta ma następujące konsekwencje:
- Zmniejsza minimalny próg dobrego stanu z 60% do 40% – teraz pojedyncze niepowodzenie instancji maszyny wirtualnej nie spowoduje stanu nieprawidłowego na podstawie
--healthy-percent-threshold(stan niepowodzenia wyniesie 50%, a do osiągnięcia stanu prawidłowego potrzeba tylko 40%). - Zwiększa minimalną liczbę backendów w dobrym stanie z 1 do 2 instancji maszyn wirtualnych – teraz awaria pojedynczej instancji maszyny wirtualnej spowoduje stan nieprawidłowy na podstawie
--min-healthy-threshold(stan awarii będzie wynosić 1, ale do prawidłowego działania potrzeba 2)
Usługa bar w regionie 2 w złym stanie
Ten scenariusz symuluje awarię usługi producenta PSC bar w regionie 2 przez zatrzymanie serwera WWW na jednej z 2 instancji maszyn wirtualnych.
Pobieranie szczegółów maszyny wirtualnej serwera
# 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}
Połącz się z maszyną wirtualną serwera przez SSH i zatrzymaj serwer 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
Sprawdzanie, czy usługa regionalna jest w złym stanie
# check health state of backend service
gcloud compute backend-services get-health ilb-bar --region=${REGION_2}
Dane wyjściowe powinny wyglądać podobnie do tych...
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
Nawiązywanie połączenia SSH z kliencką maszyną wirtualną w regionie 2 i testowanie przełączania awaryjnego
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
Stan PSC został zaktualizowany w systemie równoważenia obciążenia konsumenta i skierowany tak, aby unikać usługi backendu w złym stanie w regionie 2. Zamiast tego kieruje ruch do działającej prawidłowo usługi foo w regionie 1.
Jeśli system równoważenia obciążenia konsumenta uzna wszystkie usługi producenta za nieprawidłowe, nie będzie mógł przełączyć się na prawidłową instancję. System równoważenia obciążenia powinien rozdzielać ruch między wszystkie nieprawidłowe backendy (fail open).
# exit client vm ssh
exit
To koniec testowania. Przejdźmy do czyszczenia.
8. Czyszczenie
# 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. Podsumowanie
Gratulacje! Udało Ci się skonfigurować stan usługi PSC i przetestować automatyczne przełączanie regionalne.
Jeśli masz jakieś uwagi, pytania lub poprawki, możesz je przesłać za pomocą tego formularza opinii.
Dziękujemy!