1. Introdução
Este codelab aborda a integridade composta para o Private Service Connect (PSC) para failover regional automático. A integridade composta para o PSC é um recurso de rede que oferece melhor resiliência e disponibilidade do serviço.
Com a integridade combinada, os produtores de serviços podem definir políticas de integridade personalizadas (qual estado define um serviço íntegro ou não íntegro) e propagar automaticamente esses indicadores para os consumidores de serviços que se conectam ao serviço com back-ends do PSC. Esse recurso foi criado especificamente para oferecer suporte ao failover automático entre regiões. Se um serviço regional do produtor ficar indisponível, o balanceador de carga do consumidor vai parar automaticamente de rotear o tráfego para essa região e o direcionará para um serviço disponível em outra região.
Em comparação com métodos anteriores de failover entre regiões, como a detecção de outliers, a integridade combinada oferece um sinal de failover mais preciso porque se baseia diretamente na integridade agregada dos back-ends de serviço do produtor (grupos de instâncias de VM ou endpoints de rede). Os produtores podem definir a própria lógica de integridade, garantindo que o produtor só receba tráfego quando o serviço realmente atender aos critérios de integridade necessários.
Conteúdo do laboratório
- Componentes da integridade composta e como eles funcionam juntos para determinar o estado de integridade de um serviço de produtor
- Implementação da verificação de integridade combinada para PSC em um serviço de produtor usando comandos da gcloud
- Configuração de um balanceador de carga de acesso do consumidor do PSC entre regiões para usar os indicadores de integridade da política de integridade combinada do produtor
- Testar cenários de falha de serviço e validar o failover automático entre regiões
O que é necessário
- um projeto do Google Cloud;
- Permissões do IAM concedidas ao papel predefinido
roles/compute.adminou a um papel básico amplo, comoroles/adminouroles/ownerlegado - Familiaridade com os conceitos de rede do Google Cloud e o uso da CLI do Google Cloud
2. Conceitos
Rede do PSC
Essa topologia de rede do codelab inclui uma rede VPC de consumidor e produtor em duas regiões ativas do Google Cloud.
O lado do consumidor tem sub-redes regionais com instâncias de VM de cliente usadas para acessar o serviço do produtor por um balanceador de carga de aplicativo interno entre regiões com back-ends de grupo de endpoints de rede (NEG) do PSC. Há duas regras de encaminhamento de balanceador de carga regional, com endereços IP regionais, para entrada de cliente global (entre regiões). O serviço de back-end é um recurso global que oferece suporte a NEGs em diferentes regiões. Em um cenário de failover, um cliente que se conecta a qualquer regra de encaminhamento de front-end regional pode ser direcionado a um back-end global íntegro.
Figura 1. Topologia de rede do codelab
O lado do produtor tem sub-redes regionais com balanceadores de carga de rede de passagem internos regionais que expõem um serviço por um recurso de anexo de serviço do PSC regional. Os serviços de back-end contêm grupos gerenciados de instâncias (MIGs, na sigla em inglês) regionais e são verificados por sondagem de solicitações http e validação de respostas 200 (OK).
Consulte a documentação mais recente sobre a compatibilidade do Private Service Connect para configuração do produtor e saiba quais balanceadores de carga oferecem suporte à verificação de integridade combinada para o PSC.
Integridade do serviço
A verificação de integridade do serviço de back-end do produtor, configurada durante a criação do balanceador de carga, serve como o sinal de origem para a integridade composta do recurso PSC. O recurso fonte de integridade usa esse indicador com outras restrições definidas no recurso política de agregação de integridade para determinar um estado de integridade para um único serviço de back-end.
Por padrão, um serviço é considerado íntegro quando estas duas restrições são atendidas:
- mínimo de
xpor cento dos back-ends estão íntegros (padrão60) - mínimo de
yback-ends íntegros (padrão1)
A verificação de integridade composta faz referência a todas as fontes de integridade de todos os serviços de back-end para determinar a integridade geral de todo o serviço regional do produtor. Neste laboratório, cada serviço de produtor regional tem apenas uma fonte de integridade de serviço de back-end que se resume a uma verificação de integridade composta.
Figura 2. Integridade composta para o modelo de recurso do PSC
A definição de recurso de verificação de integridade composta também se refere à regra de encaminhamento do balanceador de carga do serviço do produtor. O NEG do PSC de back-end do balanceador de carga de acesso do consumidor está conectado logicamente ao anexo de serviço do PSC do produtor e à regra de encaminhamento do balanceador de carga do produtor. Isso vincula o balanceador de carga de acesso do consumidor ao estado da verificação de integridade composta do serviço do produtor. A integridade geral do serviço do produtor regional é propagada para o balanceador de carga do consumidor para fazer a seleção de back-end adequada.
3. Configurar o projeto
Acessar seu projeto
Este codelab foi escrito para usar um único projeto do Google Cloud. As etapas de configuração usam comandos gcloud e do shell do Linux.
OBSERVAÇÃO:em uma implantação de produção, os recursos do consumidor do PSC e os serviços do produtor geralmente estão em projetos diferentes.
Comece acessando a linha de comando do projeto na nuvem do Google Cloud usando:
- Cloud Shell
http://shell.cloud.google.com/ou - Um terminal local com a CLI
gcloudinstalada
Definir o ID do projeto
gcloud config set project YOUR_PROJECT_ID_HERE
Definir variáveis de ambiente shell
export PROJECT_ID=$(gcloud config list --format="value(core.project)")
export REGION_1="us-west1"
export ZONE_1="us-west1-c"
export REGION_2="us-east1"
export ZONE_2="us-east1-c"
echo ${PROJECT_ID}
echo ${REGION_1}
echo ${ZONE_1}
echo ${REGION_2}
echo ${ZONE_2}
Ativar serviços de API
gcloud services enable compute.googleapis.com
gcloud services enable dns.googleapis.com
4. Serviço de produtor
Criar recursos compartilhados
Criar rede
gcloud compute networks create vnet-producer --subnet-mode=custom
Criar sub-redes
# 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
Criar componentes de firewall
As regras de firewall são necessárias para permitir o tráfego para recursos de VM. As regras de firewall padrão implícitas são para negar entrada e permitir saída. As políticas são a maneira preferida de implantar regras de firewall. Para isso, crie um recurso de política de firewall de rede, crie e adicione regras a ela e associe a política a uma rede 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
Criar Cloud Routers e gateways 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
Criar uma configuração de inicialização de VM com servidor 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
Configurar o serviço foo na região 1
Criar computação de serviço
# 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
Criar componentes do balanceador de carga de serviço
# 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
Publicar serviço do 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
Configurar o serviço bar na região 2
Criar computação de serviço
# 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
Criar componentes do balanceador de carga de serviço
# 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
Publicar serviço do 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. Acesso do consumidor
Configurar recursos do cliente
Criar componentes de rede
# 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
O balanceador de carga de aplicativo (baseado em proxy) do consumidor exige sub-redes somente proxy. Essas sub-redes fornecem um pool de endereços IP usados por balanceadores de carga baseados em proxy como endereços de origem internos ao enviar tráfego para back-ends.
# 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
Criar componentes de firewall
# 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
Criar componentes do balanceador de carga
# 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
Criar registros 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"
Criar recursos de computação
# 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
Valor de referência do serviço de teste
Da VM cliente na região 1
# send request from vm to service using hostname
gcloud compute ssh client-1 --zone=${ZONE_1} --command='
curl -s -v www.foobar.com'
# send request from vm to load balancer forwarding rule region 1
gcloud compute ssh client-1 --zone=${ZONE_1} --command='
curl -s 10.10.1.99'
# send request from vm to load balancer forwarding rule region 2
gcloud compute ssh client-1 --zone=${ZONE_1} --command='
curl -s 10.10.2.99'
Opcional:tente os mesmos testes na VM de cliente na região 2: gcloud compute ssh client-2 --zone=${ZONE_2}
PONTO PRINCIPAL:o comportamento normal do balanceador de carga para solicitações de clientes que entram em uma regra de encaminhamento em region-x é preferir back-ends no mesmo region-x. Se todos os recursos de back-end estiverem íntegros, a região com menor latência vai vencer. Os back-ends globais vão fazer failover para a outra região com o sinal de integridade adequado.
No entanto, como os recursos reais do serviço produtor estão atrás do balanceador de carga produtor na rede VPC produtor, esses indicadores de integridade eram opacos para o balanceador de carga consumidor. Portanto, o lado consumidor não conseguia fazer essas determinações de failover de back-end. A integridade do PSC resolve isso propagando informações de integridade do serviço do lado do produtor para o lado do consumidor.
6. Recursos de saúde
A integridade composta para recursos do PSC é configurada pelo produtor para representar a integridade geral do serviço regional. A política de integridade se baseia no que o produtor do serviço define como adequado para manter um nível de serviço funcional. Os limites são definidos para notificar os consumidores sobre o failover quando as condições definidas pelo produtor não são mais atendidas.
Configurar a integridade do serviço foo na região 1
Criar uma política de agregação de integridade
gcloud compute health-aggregation-policies create foo-health-policy \
--region=${REGION_1} \
--healthy-percent-threshold=60 \
--min-healthy-threshold=1
Criar uma fonte de integridade
gcloud compute health-sources create foo-health-source \
--region=${REGION_1} \
--source-type=BACKEND_SERVICE \
--sources=ilb-foo \
--health-aggregation-policy=foo-health-policy
Criar uma verificação de integridade composta
gcloud compute composite-health-checks create foo-health-composite \
--region=${REGION_1} \
--health-sources=foo-health-source \
--health-destination=projects/${PROJECT_ID}/regions/${REGION_1}/forwardingRules/fr-foo
Verificar a integridade da configuração do serviço foo
As configurações de recursos de integridade podem ser visualizadas com comandos de lista (e describe) por região.
# show health aggregation policies
gcloud compute health-aggregation-policies list --regions=${REGION_1}
# show health sources
gcloud compute health-sources list --regions=${REGION_1}
# show composite health checks
gcloud compute composite-health-checks list --regions=${REGION_1}
Configurar a integridade do serviço bar na região 2
Criar uma política de agregação de integridade
gcloud compute health-aggregation-policies create bar-health-policy \
--region=${REGION_2} \
--healthy-percent-threshold=60 \
--min-healthy-threshold=1
Criar uma fonte de integridade
gcloud compute health-sources create bar-health-source \
--region=${REGION_2} \
--source-type=BACKEND_SERVICE \
--sources=ilb-bar \
--health-aggregation-policy=bar-health-policy
Criar uma verificação de integridade composta
gcloud compute composite-health-checks create bar-health-composite \
--region=${REGION_2} \
--health-sources=bar-health-source \
--health-destination=projects/${PROJECT_ID}/regions/${REGION_2}/forwardingRules/fr-bar
Verificar a integridade da configuração do serviço bar
# show health aggregation policies
gcloud compute health-aggregation-policies list --regions=${REGION_2}
# show health sources
gcloud compute health-sources list --regions=${REGION_2}
# show composite health checks
gcloud compute composite-health-checks list --regions=${REGION_2}
Isso conclui a parte de configuração. Agora vamos para os testes.
7. Teste de failover
Cenário de serviço foo região 1 não íntegro
Este cenário simula uma falha do serviço produtor do PSC foo na região 1 interrompendo o servidor da Web em uma das duas instâncias de VM.
Receber detalhes da VM do servidor
# 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}
Parar o servidor http da região 1
# stop apache http server to fail service
gcloud compute ssh ${FOO_FAIL_NAME} --zone=${FOO_FAIL_ZONE} --command='
sudo systemctl stop apache2'
# verify service dead
gcloud compute ssh ${FOO_FAIL_NAME} --zone=${FOO_FAIL_ZONE} --command='
sudo systemctl status apache2 | grep Active:'
Verificar se o serviço regional não está íntegro
# check health state of backend service
gcloud compute backend-services get-health ilb-foo --region=${REGION_1}
A saída será semelhante a esta...
backend: .../regions/us-west1/instanceGroups/mig-foo
status:
healthStatus:
- forwardingRule: .../regions/us-west1/forwardingRules/fr-foo
forwardingRuleIp: 172.16.1.99
healthState: UNHEALTHY
instance: .../zones/us-west1-a/instances/service-foo-<UID_1>
ipAddress: 172.16.1.2
port: 80
- forwardingRule: .../regions/us-west1/forwardingRules/fr-foo
forwardingRuleIp: 172.16.1.99
healthState: HEALTHY
instance: .../zones/us-west1-b/instances/service-foo-<UID_2>
ipAddress: 172.16.1.3
port: 80
kind: compute#backendServiceGroupHealth
# check health state of health source
gcloud compute health-sources get-health foo-health-source --region=${REGION_1}
A saída será semelhante a esta...
healthState: UNHEALTHY
kind: compute#healthSourceHealth
sources:
- backends:
- endpointCount: 1
group: .../zones/us-west1-a/instanceGroups/mig-foo
healthyEndpointCount: 0
- endpointCount: 0
group: .../zones/us-west1-c/instanceGroups/mig-foo
healthyEndpointCount: 0
- endpointCount: 1
group: .../zones/us-west1-b/instanceGroups/mig-foo
healthyEndpointCount: 1
forwardingRule: .../regions/us-west1/forwardingRules/fr-foo
source: .../regions/us-west1/backendServices/ilb-foo
Testar o failover do cliente da região 1
# send request to service using hostname
gcloud compute ssh client-1 --zone=${ZONE_1} --command='
curl -s -v www.foobar.com'
# curl to ilb vip in region 1
gcloud compute ssh client-1 --zone=${ZONE_1} --command='
curl -s 10.10.1.99'
# curl to ilb vip in region 2
gcloud compute ssh client-1 --zone=${ZONE_1} --command='
curl -s 10.10.2.99'
A integridade combinada para PSC atualizou o balanceador de carga do consumidor e o direcionou para evitar o serviço de back-end não íntegro na região 1. Em vez disso, ele direcionou o tráfego para o serviço íntegro bar na região 2.
Reiniciar o servidor http da região 1
# start apache http server to return service to healthy
gcloud compute ssh ${FOO_FAIL_NAME} --zone=${FOO_FAIL_ZONE} --command='
sudo systemctl start apache2'
# verify service running
gcloud compute ssh ${FOO_FAIL_NAME} --zone=${FOO_FAIL_ZONE} --command='
sudo systemctl status apache2 | grep Active:'
# check health state of health source
gcloud compute health-sources get-health foo-health-source --region=${REGION_1}
A saída vai mostrar um status HEALTHY semelhante a este...
healthState: HEALTHY
kind: compute#healthSourceHealth
sources:
- backends:
- endpointCount: 1
group: .../zones/us-west1-a/instanceGroups/mig-foo
healthyEndpointCount: 1
- endpointCount: 0
group: .../zones/us-west1-c/instanceGroups/mig-foo
healthyEndpointCount: 0
- endpointCount: 1
group: .../zones/us-west1-b/instanceGroups/mig-foo
healthyEndpointCount: 1
forwardingRule: .../regions/us-west1/forwardingRules/fr-foo
source: .../regions/us-west1/backendServices/ilb-foo
Mudar a política de integridade
Os produtores podem ajustar as políticas de integridade do serviço com base em diferentes critérios. O recurso política de agregação de integridade especifica os limites mínimos necessários para manter um status de integridade em todas as fontes de integridade (serviços de back-end).
Atualizar a política de agregação de integridade do serviço bar
gcloud compute health-aggregation-policies update bar-health-policy \
--region=${REGION_2} \
--description="min 40% threshold" \
--healthy-percent-threshold=40 \
--min-healthy-threshold=2
# verify new policy is applied
gcloud compute health-aggregation-policies list --regions=${REGION_2}
Essa mudança na política de integridade do produtor faz o seguinte:
- Diminui a porcentagem mínima de integridade de 60% para 40%. Agora, uma única falha de instância de VM não vai acionar um estado não íntegro com base em
--healthy-percent-threshold. O estado de falha será de 50% e só precisará de 40% para ser considerado íntegro. - Aumenta o número mínimo de back-ends íntegros de 1 para 2 instâncias de VM. Agora, uma única falha de instância de VM vai acionar um estado não íntegro com base em
--min-healthy-threshold(o estado de falha será 1, mas é necessário 2 para ser íntegro).
Cenário de serviço bar região 2 não íntegro
Este cenário simula uma falha do serviço de produtor do PSC bar na região 2 ao interromper o servidor da Web em uma das duas instâncias de VM.
Receber detalhes da VM do servidor
# 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}
Parar o servidor http da região 2
# stop apache http server to fail service
gcloud compute ssh ${BAR_FAIL_NAME} --zone=${BAR_FAIL_ZONE} --command='
sudo systemctl stop apache2'
# verify service dead
gcloud compute ssh ${BAR_FAIL_NAME} --zone=${BAR_FAIL_ZONE} --command='
sudo systemctl status apache2 | grep Active:'
Verificar se o serviço regional não está íntegro
# check health state of backend service
gcloud compute backend-services get-health ilb-bar --region=${REGION_2}
A saída será semelhante a esta...
backend: .../regions/us-east1/instanceGroups/mig-bar
status:
healthStatus:
- forwardingRule: .../regions/us-east1/forwardingRules/fr-bar
forwardingRuleIp: 172.16.2.99
healthState: UNHEALTHY
instance: .../zones/us-east1-b/instances/service-bar-<UID_1>
ipAddress: 172.16.2.3
port: 80
- forwardingRule: .../regions/us-east1/forwardingRules/fr-bar
forwardingRuleIp: 172.16.2.99
healthState: HEALTHY
instance: .../zones/us-east1-d/instances/service-foo-<UID_2>
ipAddress: 172.16.2.2
port: 80
kind: compute#backendServiceGroupHealth
# check health state of health source
gcloud compute health-sources get-health bar-health-source --region=${REGION_2}
A saída será semelhante a esta...
healthState: UNHEALTHY
kind: compute#healthSourceHealth
sources:
- backends:
- endpointCount: 1
group: .../zones/us-east1-b/instanceGroups/mig-bar
healthyEndpointCount: 0
- endpointCount: 1
group: .../zones/us-east1-d/instanceGroups/mig-bar
healthyEndpointCount: 1
- endpointCount: 0
group: .../zones/us-east1-c/instanceGroups/mig-bar
healthyEndpointCount: 0
forwardingRule: .../regions/us-west1/forwardingRules/fr-bar
source: .../regions/us-west1/backendServices/ilb-bar
Testar o failover do cliente da região 2
# send request to service using hostname
gcloud compute ssh client-2 --zone=${ZONE_2} --command='
curl -s -v www.foobar.com'
# curl to ilb vip in region 1
gcloud compute ssh client-2 --zone=${ZONE_2} --command='
curl -s 10.10.1.99'
# curl to ilb vip in region 2
gcloud compute ssh client-2 --zone=${ZONE_2} --command='
curl -s 10.10.2.99'
A integridade combinada para PSC atualizou o balanceador de carga do consumidor e o direcionou para evitar o serviço de back-end não íntegro na região 2. Em vez disso, ele direcionou o tráfego para o serviço íntegro foo na região 1.
Em uma situação em que o balanceador de carga do consumidor considera todos os serviços do produtor como não íntegros, o balanceador de carga não pode fazer failover para uma instância íntegra. O comportamento esperado é que o balanceador de carga distribua o tráfego entre todos os back-ends não íntegros (abertura por falha).
Isso conclui a parte de testes... vamos para o monitoramento.
8. Monitorar a integridade
As mudanças no estado de integridade são registradas por padrão. Os projetos de produtor podem acessar registros de fontes de integridade e verificações de integridade compostas. Projetos de consumidor podem ver registros de NEGs do PSC conectados a serviços publicados usando a integridade combinada.
Embora este laboratório implante os recursos do consumidor e do produtor no mesmo projeto para simplificar, quando implantados em projetos separados, os registros mostram as duas funções desacopladas.
Recurso monitorado | Ver | Nome do registro |
Fontes de integridade e verificações compostas | Visualização do produtor |
|
NEGs do Private Service Connect | Visualização do consumidor |
|
Registros do produtor
Os registros do produtor mostram o rollup de integridade interna dos serviços do produtor:
HealthSource: a integridade dos serviços de back-end individuais (por exemplo, os status de VM demig-baremig-foo)CompositeHealthCheck: o estado de integridade regional agregado do serviço publicado mapeado para o destino da regra de encaminhamento do produtor (por exemplo,fr-baroufr-foo)
# query logs for producer
gcloud logging read \
'logName="projects/'${PROJECT_ID}'/logs/compute.googleapis.com%2Fcompositehealth"' \
--project=${PROJECT_ID} \
--limit=10 \
--format='table(
timestamp.date(format="%I:%M:%S %p", tz=LOCAL):label=TIME,
resource.type.basename():label=TYPE,
resource.labels.location:label=REGION,
jsonPayload.healthState:label=STATE,
jsonPayload.sources[0].backends[].group.basename().join(","):label=BACKENDS,
jsonPayload.sources[0].backends[].healthyEndpointCount.join(","):label=HEALTHY,
jsonPayload.sources[0].backends[].endpointCount.join(","):label=TOTAL,
jsonPayload.healthDestination.basename():label=DESTINATION
)'
Registros do consumidor
Os registros do consumidor mostram o status de integridade propagado dos recursos do consumidor:
NetworkEndpointGroup: o estado de integridade propagado do NEG do PSC conectado ao serviço publicado (por exemplo,neg-bareneg-foo)
Em uma configuração separada de consumidor e produtor, use esta consulta de registros no projeto consumidor para segmentar eventos de integridade compostos para NEGs do PSC...
# query logs for consumer
gcloud logging read \
"logName=projects/${PROJECT_ID}/logs/compute.googleapis.com%2Fservicehealthchecks
AND resource.type=\"compute.googleapis.com/NetworkEndpointGroupV2\"" \
--project="${PROJECT_ID}" \
--freshness=30m \
--limit=10 \
--format="table(
timestamp.date(format='%I:%M:%S %p', tz=LOCAL):label=TIME,
resource.labels.location:label=REGION,
jsonPayload.serviceHealthCheckResult.healthState:label=STATE,
jsonPayload.serviceHealthCheckResult.previousHealthState:label=PREV_STATE,
resource.labels.network_endpoint_group_id:label=NEG_ID
)"
Isso conclui a parte de monitoramento... vamos para a limpeza.
9. Limpeza
# delete health resources
gcloud -q compute composite-health-checks delete foo-health-composite --region=${REGION_1}
gcloud -q compute health-sources delete foo-health-source --region=${REGION_1}
gcloud -q compute health-aggregation-policies delete foo-health-policy --region=${REGION_1}
gcloud -q compute composite-health-checks delete bar-health-composite --region=${REGION_2}
gcloud -q compute health-sources delete bar-health-source --region=${REGION_2}
gcloud -q compute health-aggregation-policies delete bar-health-policy --region=${REGION_2}
# delete consumer compute and load balancer resources
gcloud -q compute instances delete client-2 --zone=${ZONE_2}
gcloud -q compute instances delete client-1 --zone=${ZONE_1}
gcloud -q dns record-sets delete www.foobar.com --type=A --zone=zone-foobar
gcloud -q dns managed-zones delete zone-foobar
gcloud -q compute forwarding-rules delete fr-foobar-2 --global
gcloud -q compute forwarding-rules delete fr-foobar-1 --global
gcloud -q compute target-http-proxies delete proxy-foobar --global
gcloud -q compute url-maps delete ilb-foobar --global
gcloud -q compute backend-services delete bes-foobar --global
# delete consumer network resources
gcloud -q compute network-endpoint-groups delete neg-bar --region=${REGION_2}
gcloud -q compute network-endpoint-groups delete neg-foo --region=${REGION_1}
gcloud -q compute networks subnets delete subnet-proxy-2 --region=${REGION_2}
gcloud -q compute networks subnets delete subnet-proxy-1 --region=${REGION_1}
gcloud -q compute networks subnets delete subnet-client-2 --region=${REGION_2}
gcloud -q compute networks subnets delete subnet-client-1 --region=${REGION_1}
gcloud -q compute network-firewall-policies associations delete \
--firewall-policy=fw-policy-consumer \
--name=fw-policy-association-consumer \
--global-firewall-policy
gcloud -q compute network-firewall-policies delete fw-policy-consumer --global
gcloud -q compute networks delete vnet-consumer
# delete producer load balancer resources
gcloud -q compute service-attachments delete psc-sa-bar --region=${REGION_2}
gcloud -q compute service-attachments delete psc-sa-foo --region=${REGION_1}
gcloud -q compute forwarding-rules delete fr-bar --region=${REGION_2}
gcloud -q compute forwarding-rules delete fr-foo --region=${REGION_1}
gcloud -q compute backend-services delete ilb-bar --region=${REGION_2}
gcloud -q compute backend-services delete ilb-foo --region=${REGION_1}
gcloud -q compute health-checks delete hc-bar-http --region=${REGION_2}
gcloud -q compute health-checks delete hc-foo-http --region=${REGION_1}
# delete producer compute resources
gcloud -q compute instance-groups managed delete mig-bar --region=${REGION_2}
gcloud -q compute instance-groups managed delete mig-foo --region=${REGION_1}
gcloud -q compute instance-templates delete mig-template-bar --global
gcloud -q compute instance-templates delete mig-template-foo --global
# delete producer network resources
gcloud -q compute networks subnets delete subnet-bar-pscnat --region=${REGION_2}
gcloud -q compute networks subnets delete subnet-foo-pscnat --region=${REGION_1}
gcloud -q compute networks subnets delete subnet-bar --region=${REGION_2}
gcloud -q compute networks subnets delete subnet-foo --region=${REGION_1}
gcloud -q compute routers delete cr-nat-bar --region=${REGION_2}
gcloud -q compute routers delete cr-nat-foo --region=${REGION_1}
gcloud -q compute network-firewall-policies associations delete \
--firewall-policy=fw-policy-producer \
--name=fw-policy-association-producer \
--global-firewall-policy
gcloud -q compute network-firewall-policies delete fw-policy-producer --global
gcloud -q compute networks delete vnet-producer
# delete shell variables and script file
unset FOO_FAIL_NAME FOO_FAIL_ZONE BAR_FAIL_NAME BAR_FAIL_ZONE
unset PROJECT_ID REGION_1 ZONE_1 REGION_2 ZONE_2
rm vm-server-startup.sh
#
10. Conclusão
Parabéns! Você configurou a integridade combinada para PSC e testou o failover regional automático.
Envie comentários, dúvidas ou correções usando este formulário de feedback.
Agradecemos pela atenção!