Esta página fornece a estratégia de implementação recomendada para criar uma aplicação de máquina virtual (VM) robusta e de alta disponibilidade (HA) no Google Distributed Cloud (GDC) air-gapped. Tem de implementar a aplicação de VM em várias zonas do GDC e configurar a replicação de armazenamento assíncrona para que a aplicação e os respetivos dados sejam recuperáveis em caso de tempo de inatividade inesperado ou desastre local.
Esta página destina-se a programadores no grupo de operadores de aplicações, que são responsáveis por criar cargas de trabalho de aplicações para a respetiva organização. Para mais informações, consulte a documentação sobre públicos-alvo para GDC com isolamento de ar.
Objetivos
- Crie uma instância de VM com discos de arranque anexados em duas ou mais zonas no seu universo do GDC.
- Configure o balanceamento de carga global.
- Configure a replicação de armazenamento assíncrona através do armazenamento em blocos ou do armazenamento de objetos.
Antes de começar
Verifique se está a trabalhar num universo do GDC com várias zonas disponíveis. Execute
gdcloud zones list
para listar as zonas disponíveis no seu universo. Para mais informações, consulte o artigo Liste as zonas num universo.Peça ao administrador de IAM da organização para lhe conceder as seguintes funções:
- As funções de VM para criar e gerir cargas de trabalho de VM.
- As funções de administrador do equilibrador de carga (
load-balancer-admin
) e administrador do equilibrador de carga global (global-load-balancer-admin
). Tem de ter estas funções para criar e gerir balanceadores de carga. - A função de administrador global da replicação de volumes (
app-volume-replication-admin-global
). Tem de ter esta função para administrar a replicação de volumes. - A função de administrador global do PNP (
global-project-networkpolicy-admin
). Tem de ter esta função para criar e gerir políticas de rede de projetos em várias zonas. - A função de administrador global da replicação de volumes (
app-volume-replication-admin-global
) para administrar a relação de replicação de volumes para recursos de armazenamento em blocos. - A função de administrador de objetos do contentor do projeto (
project-bucket-object-admin
) e administrador do contentor do projeto (project-bucket-admin
) para criar e gerir contentores de armazenamento.
Consulte as descrições das funções para mais informações.
Instale e configure a CLI gcloud e configure os contextos zonais e globais. Consulte o artigo Faça a gestão de recursos em várias zonas para mais informações.
Instale e configure a CLI kubectl com os ficheiros kubeconfig adequados definidos para o servidor de API global e o servidor de API de gestão. Consulte o artigo Gere manualmente o ficheiro kubeconfig para mais informações.
Crie uma instância de VM em várias zonas
Uma instância de VM é um recurso zonal, pelo que tem de criar uma VM separadamente em cada zona. Para este exemplo, vai criar uma instância de VM com uma imagem do SO fornecida pelo GDC e anexar um disco de arranque à VM. Para mais informações sobre como criar instâncias de VMs, bem como usar imagens personalizadas, consulte o artigo Crie e inicie uma VM.
Por predefinição, todos os projetos do GDC podem criar VMs a partir de imagens de SO fornecidas pelo GDC.
Consola
- No menu de navegação, selecione Máquinas virtuais > Instâncias.
- Clique em Criar instância.
- No campo Nome, especifique um nome para a VM.
- Selecione a zona na qual quer criar a VM.
- Clique em Adicionar etiquetas para atribuir etiquetas à VM e ajudar a organizar as instâncias de VM.
- Selecione a configuração da máquina a usar para a VM. Verifique se o tipo de máquina está alinhado com a sua carga de trabalho, consoante os seus requisitos.
- Clicar em Seguinte.
- Ative o acesso externo para a sua instância de VM.
- Clicar em Seguinte.
- Selecione Adicionar novo disco.
- Atribua um nome ao disco da VM.
- Configure o tamanho do disco e as definições de anexos.
- Clique em Guardar.
- Clique em Criar para criar a instância de VM.
- Repita os passos anteriores para cada zona no seu universo do GDC. Certifique-se de que existe uma instância de VM em cada zona que quer para a sua estratégia de HA.
gdcloud
Inicie sessão na zona na qual quer alojar a sua instância de VM:
gdcloud config set core/zone ZONE
Crie a instância de VM na zona com uma imagem fornecida pelo GDC:
gdcloud compute instances create VM_NAME \ --machine-type=MACHINE_TYPE \ --image=BOOT_DISK_IMAGE_NAME --image-project=vm-system \ --boot-disk-size=BOOT_DISK_SIZE \ --no-boot-disk-auto-delete=NO_BOOT_DISK_AUTO_DELETE
Substitua o seguinte:
VM_NAME
: o nome da nova VM. O nome só pode conter carateres alfanuméricos e travessões, e não pode ter mais de 53 carateres.MACHINE_TYPE
: o tipo de máquina predefinido para a nova VM. Para selecionar um tipo de máquina disponível, executegdcloud compute machine-types list
.BOOT_DISK_IMAGE_NAME
: o nome da imagem a usar para o novo disco de arranque da VM.BOOT_DISK_SIZE
: o tamanho do disco de arranque, como20GB
. Este valor tem de ser sempre igual ou superior aominimumDiskSize
da imagem do disco de arranque.NO_BOOT_DISK_AUTO_DELETE
: se o disco de arranque é eliminado automaticamente quando a instância de VM é eliminada.
Repita os passos anteriores para cada zona no seu universo do GDC. Certifique-se de que existe uma instância de VM em todas as zonas que quer para a sua estratégia de HA.
API
Crie a instância de VM na zona com uma imagem fornecida pelo GDC:
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachineDisk metadata: name: VM_BOOT_DISK_NAME namespace: PROJECT spec: source: image: name: BOOT_DISK_IMAGE_NAME namespace: vm-system size: BOOT_DISK_SIZE --- apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachine metadata: name: VM_NAME namespace: PROJECT spec: compute: virtualMachineType: MACHINE_TYPE disks: - virtualMachineDiskRef: name: VM_BOOT_DISK_NAME boot: true autoDelete: BOOT_DISK_AUTO_DELETE --- apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachineExternalAccess metadata: name: VM_NAME namespace: PROJECT spec: enabled: true ports: - name: port-80 port: 80 protocol: TCP EOF
Substitua o seguinte:
MANAGEMENT_API_SERVER
: o ficheiro kubeconfig do servidor da API Management para a zona na qual criar a instância de VM. Se ainda não gerou um ficheiro kubeconfig para o servidor da API Management, consulte o artigo Gerar manualmente o ficheiro kubeconfig para obter detalhes.VM_BOOT_DISK_NAME
: o nome do novo disco de arranque da VM.PROJECT
: o projeto do GDC para criar a VM.BOOT_DISK_IMAGE_NAME
: o nome da imagem a usar para o novo disco de arranque da VM.BOOT_DISK_SIZE
: o tamanho do disco de arranque, como20Gi
. Este valor tem de ser sempre igual ou superior aominimumDiskSize
da imagem do disco de arranque.VM_NAME
: o nome da nova VM. O nome só pode conter carateres alfanuméricos e travessões, e não pode ter mais de 53 carateres.MACHINE_TYPE
: o tipo de máquina predefinido para a nova VM. Para selecionar um tipo de máquina disponível, executegdcloud compute machine-types list
.BOOT_DISK_AUTO_DELETE
: indica se o disco de arranque é eliminado automaticamente quando a instância de VM é eliminada.
Verifique se a VM está disponível e aguarde que a VM apresente o estado
Running
. O estadoRunning
não indica que o SO está totalmente pronto e acessível.kubectl --kubeconfig MANAGEMENT_API_SERVER \ get virtualmachine.virtualmachine.gdc.goog VM_NAME -n PROJECT
Substitua
VM_NAME
ePROJECT
pelo nome e projeto da VM.Repita os passos anteriores para cada zona no seu universo do GDC. Certifique-se de que existe uma instância de VM em todas as zonas que quer para a sua estratégia de HA.
Configure balanceadores de carga
Para distribuir o tráfego entre as suas VMs em diferentes zonas, crie balanceadores de carga. Tem a opção de criar balanceadores de carga externos (ELB) e balanceadores de carga internos (ILB), que podem ser configurados ao nível da zona ou globalmente. Para este exemplo, configure um ILB global e um ELB global para a sua aplicação de VM.
Crie um balanceador de carga interno global
Os balanceadores de carga internos (ILB) expõem serviços na organização a partir de um conjunto de endereços IP internos atribuídos à organização. Um serviço ILB nunca está acessível a partir de nenhum ponto final fora da organização.
Conclua os passos seguintes para criar um ILB global para as suas cargas de trabalho de VMs.
gdcloud
Crie um ILB que segmenta cargas de trabalho de VMs através da CLI gdcloud.
Este ILB segmenta todas as cargas de trabalho no projeto que correspondem à etiqueta definida no objeto Backend
. O recurso personalizado Backend
tem de estar
no âmbito de uma zona.
Para criar um ILB através da CLI gdcloud, siga estes passos:
Crie um recurso
Backend
zonal em cada zona onde as suas VMs estão a ser executadas para definir o ponto final do ILB:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT \ --zone=ZONE
Substitua o seguinte:
BACKEND_NAME
: o nome escolhido para o recurso de back-end, comomy-backend
.LABELS
: o seletor que define que pontos finais entre VMs usar para este recurso de back-end, comoapp=web
.PROJECT
: o nome do seu projeto.ZONE
: a zona a usar para esta invocação. Para predefinir a flag de zona para todos os comandos que a requerem, executegdcloud config set core/zone ZONE
. O indicador de zona está disponível apenas em ambientes com várias zonas. Este campo é opcional.
Repita este passo para cada zona no seu universo do GDC.
Defina uma verificação de funcionamento global para o ILB:
gdcloud compute health-checks create tcp HEALTH_CHECK_NAME \ --check-interval=CHECK_INTERVAL \ --healthy-threshold=HEALTHY_THRESHOLD \ --timeout=TIMEOUT \ --unhealthy-threshold=UNHEALTHY_THRESHOLD \ --port=PORT \ --global
Substitua o seguinte:
HEALTH_CHECK_NAME
: o nome do recurso de verificação de estado, comomy-health-check
.CHECK_INTERVAL
: a quantidade de tempo em segundos desde o início de uma sondagem até ao início da seguinte. O valor predefinido é5
. Este campo é opcional.HEALTHY_THRESHOLD
: o tempo de espera antes de reclamar a falha. O valor predefinido é5
. Este campo é opcional.TIMEOUT
: o período de tempo em segundos a aguardar antes de declarar a falha. O valor predefinido é5
. Este campo é opcional.UNHEALTHY_THRESHOLD
: o número de sondagens sequenciais que têm de falhar para que o ponto final seja considerado não saudável. O valor predefinido é2
. Este campo é opcional.PORT
: a porta na qual a verificação do estado é realizada. O valor predefinido é80
. Este campo é opcional.
Crie um recurso
BackendService
global:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT \ --target-ports=TARGET_PORTS \ --health-check=HEALTH_CHECK_NAME \ --global
Substitua o seguinte:
BACKEND_SERVICE_NAME
: o nome do serviço de back-end.PROJECT
: o nome do seu projeto.TARGET_PORTS
: uma lista separada por vírgulas das portas de destino que este serviço de back-end traduz, em que cada porta de destino especifica o protocolo, a porta na regra de encaminhamento e a porta na instância de back-end. Pode especificar várias portas de destino. Este campo tem de estar no formatoprotocol:port:targetport
, comoTCP:80:8080
. Este campo é opcional.HEALTH_CHECK_NAME
: o nome do recurso de verificação de estado. Este campo é opcional.
Adicione o recurso
BackendService
ao recursoBackend
criado anteriormente em cada zona:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend-zone=ZONE \ --backend=BACKEND_NAME \ --project=PROJECT \ --global
Substitua o seguinte:
BACKEND_SERVICE_NAME
: o nome do serviço de back-end global.ZONE
: a zona do back-end.BACKEND_NAME
: o nome do back-end zonal.PROJECT
: o nome do seu projeto.
Conclua este passo para cada back-end zonal que criou anteriormente.
Crie um recurso
ForwardingRule
interno que defina o endereço IP virtual (VIP) no qual o serviço está disponível:gdcloud compute forwarding-rules create FORWARDING_RULE_INTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=INTERNAL \ --project=PROJECT \ --global
Substitua o seguinte:
FORWARDING_RULE_INTERNAL_NAME
: o nome da regra de encaminhamento.CIDR
: o CIDR a usar para a regra de encaminhamento. Este campo é opcional. Se não for especificado, é reservado automaticamente umIPv4/32
CIDR do conjunto de endereços IP global. Especifique o nome de um recursoSubnet
no mesmo espaço de nomes que esta regra de encaminhamento. Um recursoSubnet
representa as informações de pedido e atribuição de uma sub-rede global. Para mais informações sobre osSubnet
recursos, consulte o artigo Faça a gestão das sub-redes.PROTOCOL_PORT
: o protocolo e a porta a expor na regra de encaminhamento. Este campo tem de estar no formatoip-protocol=TCP:80
. A porta exposta tem de ser a mesma que a aplicação real está a expor dentro da VM.
Para validar o ILB configurado, confirme a condição
Ready
em cada um dos objetos criados. Valide o tráfego com um pedidocurl
para o VIP:Para obter o VIP atribuído, descreva a regra de encaminhamento:
gdcloud compute forwarding-rules describe FORWARDING_RULE_INTERNAL_NAME --global
Valide o tráfego com um pedido
curl
para o VIP na porta especificada no campo na regra de encaminhamento:curl http://FORWARDING_RULE_VIP:PORT
Substitua o seguinte:
FORWARDING_RULE_VIP
: o VIP da regra de encaminhamento.PORT
: o número da porta da regra de encaminhamento.
API
Crie um ILB que segmenta cargas de trabalho de VMs através da API KRM. Este ILB segmenta todos os cargas de trabalho no projeto que correspondem à etiqueta definida no objeto Backend
. Para criar um ILB global através da API KRM, siga estes
passos:
Crie um recurso
Backend
para definir os pontos finais do ILB. Crie recursosBackend
para cada zona em que as cargas de trabalho de VM estão localizadas:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT name: BACKEND_NAME spec: endpointsLabels: matchLabels: app: APP_NAME EOF
Substitua o seguinte:
MANAGEMENT_API_SERVER
: o caminho kubeconfig do caminho kubeconfig do servidor da API Management zonal. Para mais informações, consulte o artigo Mude para um contexto zonal.PROJECT
: o nome do seu projeto.BACKEND_NAME
: o nome do recursoBackend
APP_NAME
: o nome da sua aplicação de VM.
Pode usar o mesmo recurso
Backend
para cada zona ou criar recursosBackend
com diferentes conjuntos de etiquetas para cada zona.Defina uma verificação de funcionamento global para o ILB:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: HealthCheck metadata: namespace: PROJECT name: HEALTH_CHECK_NAME spec: tcpHealthCheck: port: PORT timeoutSec: TIMEOUT checkIntervalSec: CHECK_INTERVAL healthyThreshold: HEALTHY_THRESHOLD unhealthyThreshold: UNHEALTHY_THRESHOLD EOF
Substitua o seguinte:
GLOBAL_API_SERVER
: o caminho kubeconfig do caminho kubeconfig do servidor de API global. Para mais informações, consulte o artigo Mude para um contexto global.PROJECT
: o nome do seu projeto.HEALTH_CHECK_NAME
: o nome do recurso de verificação de estado, comomy-health-check
.PORT
: a porta na qual realizar a verificação do estado. O valor predefinido é80
.TIMEOUT
: o período de tempo em segundos a aguardar antes de declarar a falha. O valor predefinido é5
.CHECK_INTERVAL
: a quantidade de tempo em segundos desde o início de uma sondagem até ao início da seguinte. O valor predefinido é5
.HEALTHY_THRESHOLD
: o número de sondagens sequenciais que têm de ser aprovadas para que o ponto final seja considerado em bom estado. O valor predefinido é2
.UNHEALTHY_THRESHOLD
: o número de sondagens sequenciais que têm de falhar para que o ponto final seja considerado não saudável. O valor predefinido é2
.
Crie um objeto
BackendService
com o recursoBackend
criado anteriormente. Certifique-se de que inclui o recursoHealthCheck
:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME targetPorts: - port: PORT protocol: PROTOCOL targetPort: TARGET_PORT EOF
Substitua o seguinte:
GLOBAL_API_SERVER
: o caminho kubeconfig do caminho kubeconfig do servidor da API global.PROJECT
: o nome do seu projeto.BACKEND_SERVICE_NAME
: o nome escolhido para o seu recursoBackendService
.HEALTH_CHECK_NAME
: o nome do recursoHealthCheck
criado anteriormente.BACKEND_NAME
: o nome do recursoBackend
zonal.ZONE
: a zona em que o recursoBackend
reside. Pode especificar vários backends no campobackendRefs
. Por exemplo:- name: my-backend-1 zone: us-east1-a - name: my-backend-2 zone: us-east1-b
O campo
targetPorts
é opcional. Este recurso apresenta as portas que este recursoBackendService
traduz. Se estiver a usar este objeto, faculte valores para o seguinte:PORT
: a porta exposta pelo serviço.PROTOCOL
: o protocolo de camada 4 com o qual o tráfego tem de corresponder. Apenas são suportados os protocolos TCP e UDP.TARGET_PORT
: a porta para a qual o valor é traduzido, como8080
. O valor não pode ser repetido num determinado objeto.Um exemplo para
targetPorts
pode ter o seguinte aspeto:targetPorts: - port: 80 protocol: TCP targetPort: 8080
Crie um recurso
ForwardingRule
interno que defina o endereço IP virtual (VIP) no qual o serviço está disponível.kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleInternal metadata: namespace: PROJECT name: FORWARDING_RULE_INTERNAL_NAME spec: cidrRef: CIDR ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF
Substitua o seguinte:
GLOBAL_API_SERVER
: o caminho kubeconfig do caminho kubeconfig do servidor da API global.PROJECT
: o nome do seu projeto.FORWARDING_RULE_INTERNAL_NAME
: o nome escolhido para o seu recursoForwardingRuleInternal
.CIDR
: o CIDR a usar para a regra de encaminhamento. Este campo é opcional. Se não for especificado, é reservado automaticamente umIPv4/32
CIDR do conjunto de endereços IP global. Especifique o nome de um recursoSubnet
no mesmo espaço de nomes que esta regra de encaminhamento. Um recursoSubnet
representa as informações de pedido e atribuição de uma sub-rede global. Para mais informações sobre osSubnet
recursos, consulte o artigo Faça a gestão das sub-redes.PORT
: a porta a expor na regra de encaminhamento. Use o campoports
para especificar uma matriz de portas L4 para as quais os pacotes são encaminhados para os back-ends configurados com esta regra de encaminhamento. Tem de especificar, pelo menos, uma porta. Use o campoport
para especificar um número de porta. A porta exposta tem de ser a mesma que a aplicação real está a expor no contentor.PROTOCOL
: o protocolo a usar para a regra de encaminhamento, comoTCP
. Uma entrada na matrizports
tem de ser semelhante ao seguinte:ports: - port: 80 protocol: TCP
Para validar o ILB configurado, confirme a condição
Ready
em cada um dos objetos criados. Valide o tráfego com um pedidocurl
para o VIP:Recupere o VIP:
kubectl get forwardingruleinternal -n PROJECT
O resultado tem o seguinte aspeto:
NAME BACKENDSERVICE CIDR READY ilb-name BACKEND_SERVICE_NAME 192.0.2.0/32 True
Teste o tráfego com um pedido
curl
para o VIP na porta especificada no campo na regra de encaminhamento:curl http://FORWARDING_RULE_VIP:PORT
Substitua o seguinte:
FORWARDING_RULE_VIP
: o VIP da regra de encaminhamento.PORT
: o número da porta do campo na regra de encaminhamento.
Crie um balanceador de carga externo global
Os equilibradores de carga externos (ELB) expõem serviços para acesso a partir do exterior da organização a partir dos endereços IP de um conjunto atribuídos à organização a partir do conjunto de endereços IP externos de instâncias maior.
Conclua os passos seguintes para criar um ELB global para as suas cargas de trabalho de VMs.
gdcloud
Use a CLI gdcloud para criar um ELB global que segmenta todas as cargas de trabalho no projeto que correspondem à etiqueta definida no objeto Backend
.
O recurso personalizado Backend
tem de ter o âmbito de uma zona.
Para que os serviços ELB funcionem, tem de configurar e aplicar a sua própria transferência de dados
ProjectNetworkPolicy
personalizada na política para permitir o tráfego para as cargas de trabalho deste serviço ELB. As políticas de rede controlam o acesso aos seus workloads e não ao equilibrador de carga propriamente dito. Os ELBs expõem cargas de trabalho à sua rede de clientes, o que requer políticas de rede explícitas para permitir tráfego externo para a porta de carga de trabalho, como8080
.Especifique o endereço CIDR externo para permitir tráfego para as cargas de trabalho deste ELB:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-inbound-traffic-from-external spec: policyType: Ingress subject: subjectType: UserWorkload ingress: - from: - ipBlock: cidr: CIDR ports: - protocol: TCP port: PORT EOF
Substitua o seguinte:
GLOBAL_API_SERVER
: o caminho kubeconfig do caminho kubeconfig do servidor de API global. Se ainda não tiver gerado um ficheiro kubeconfig para o servidor de API global, consulte o artigo Gerar manualmente o ficheiro kubeconfig para ver detalhes.PROJECT
: o nome do seu projeto.CIDR
: o CIDR externo a partir do qual o ELB tem de ser acedido. Esta política é necessária porque o balanceador de carga externo usa o retorno direto do servidor (DSR), que preserva o endereço IP externo de origem e ignora o balanceador de carga no caminho de retorno. Para mais informações, consulte o artigo Crie uma regra de firewall de entrada global para tráfego entre organizações.PORT
: a porta de back-end nas VMs atrás do balanceador de carga. Este valor encontra-se no campo.spec.ports[].targetPortfield
do manifesto para o recursoService
. Este campo é opcional.
Esta configuração dá acesso a todos os recursos nos projetos ao intervalo CIDR especificado.
Crie um recurso
Backend
em cada zona para definir o ponto final do ELB:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT
Substitua o seguinte:
BACKEND_NAME
: o nome do recurso de back-end, comomy-backend
.LABELS
: um seletor que define que pontos finais entre VMs usar para este recurso de back-end, comoapp=web
.PROJECT
: o nome do seu projeto.
Pode usar o mesmo recurso
Backend
para cada zona ou criar recursosBackend
com diferentes conjuntos de etiquetas para cada zona.Defina uma verificação de funcionamento global para o ELB:
gdcloud compute health-checks create tcp HEALTH_CHECK_NAME \ --check-interval=CHECK_INTERVAL \ --healthy-threshold=HEALTHY_THRESHOLD \ --timeout=TIMEOUT \ --unhealthy-threshold=UNHEALTHY_THRESHOLD \ --port=PORT \ --global
Substitua o seguinte:
HEALTH_CHECK_NAME
: o nome do recurso de verificação do estado de funcionamento, comomy-health-check
.CHECK_INTERVAL
: o período em segundos desde o início de uma sondagem até ao início da seguinte. O valor predefinido é5
. Este campo é opcional.HEALTHY_THRESHOLD
: o tempo de espera antes de reclamar a falha. O valor predefinido é5
. Este campo é opcional.TIMEOUT
: o período de tempo em segundos a aguardar antes de reclamar a falha. O valor predefinido é5
. Este campo é opcional.UNHEALTHY_THRESHOLD
: o número de sondagens sequenciais que têm de falhar para que o ponto final seja considerado não saudável. O valor predefinido é2
. Este campo é opcional.PORT
: a porta na qual realizar a verificação de funcionamento. O valor predefinido é80
. Este campo é opcional.
Crie um recurso
BackendService
global:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT \ --target-ports=TARGET_PORTS \ --health-check=HEALTH_CHECK_NAME \ --global
Substitua o seguinte:
BACKEND_SERVICE_NAME
: o nome escolhido para este serviço de back-end.PROJECT
: o nome do seu projeto.TARGET_PORTS
: uma lista separada por vírgulas de portas de destino que este serviço de back-end traduz, em que cada porta de destino especifica o protocolo, a porta na regra de encaminhamento e a porta na instância de back-end. Pode especificar várias portas de destino. Este campo tem de estar no formatoprotocol:port:targetport
, comoTCP:80:8080
. Este campo é opcional.HEALTH_CHECK_NAME
: o nome do recurso de verificação de estado. Este campo é opcional.
Adicione o recurso
BackendService
global ao recurso zonal criado anteriormente:Backend
gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --backend-zone BACKEND_ZONE \ --project=PROJECT \ --global
Conclua este passo para cada back-end zonal que criou anteriormente.
Crie um recurso
ForwardingRule
externo que defina o VIP no qual o serviço está disponível:gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=EXTERNAL \ --project=PROJECT \ --global
Substitua o seguinte:
FORWARDING_RULE_EXTERNAL_NAME
: o nome da regra de encaminhamento.CIDR
: o CIDR a usar para a regra de encaminhamento. Este campo é opcional. Se não for especificado, é reservado automaticamente umIPv4/32
CIDR do conjunto de endereços IP global. Especifique o nome de um recursoSubnet
no mesmo espaço de nomes que esta regra de encaminhamento. Um recursoSubnet
representa as informações de pedido e atribuição de uma sub-rede global. Para mais informações sobre osSubnet
recursos, consulte o artigo Faça a gestão das sub-redes.PROTOCOL_PORT
: o protocolo e a porta a expor na regra de encaminhamento. Este campo tem de estar no formatoip-protocol=TCP:80
. A porta exposta tem de ser a mesma que a aplicação real está a expor na VM.PROJECT
: o nome do seu projeto.
Para validar o ELB configurado, confirme a condição
Ready
em cada um dos objetos criados. Valide o tráfego com um pedidocurl
para o VIP:Para obter o VIP atribuído, descreva a regra de encaminhamento:
gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
Valide o tráfego com um pedido
curl
para o VIP na porta especificada no campoPROTOCOL_PORT
na regra de encaminhamento:curl http://FORWARDING_RULE_VIP:PORT
Substitua o seguinte:
FORWARDING_RULE_VIP
: o VIP da regra de encaminhamento.PORT
: o número da porta do campoPROTOCOL_PORT
na regra de encaminhamento.
API
Crie um ELB que tenha como destino cargas de trabalho de VMs através da API KRM. Este ELB segmenta todas as cargas de trabalho no projeto que correspondem à etiqueta definida no objeto Backend
. Para criar um ELB zonal através da API KRM, siga estes passos:
Para que os serviços ELB funcionem, tem de configurar e aplicar a sua própria transferência de dados
ProjectNetworkPolicy
personalizada na política para permitir o tráfego para as cargas de trabalho deste serviço ELB. As políticas de rede controlam o acesso aos seus workloads e não ao equilibrador de carga propriamente dito. Os ELBs expõem cargas de trabalho à sua rede de clientes, o que requer políticas de rede explícitas para permitir tráfego externo para a porta de carga de trabalho, como8080
.Especifique o endereço CIDR externo para permitir tráfego para as cargas de trabalho deste ELB:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-inbound-traffic-from-external spec: policyType: Ingress subject: subjectType: UserWorkload ingress: - from: - ipBlock: cidr: CIDR ports: - protocol: TCP port: PORT EOF
Substitua o seguinte:
GLOBAL_API_SERVER
: o caminho kubeconfig do caminho kubeconfig do servidor de API global. Se ainda não tiver gerado um ficheiro kubeconfig para o servidor de API global, consulte o artigo Gerar manualmente o ficheiro kubeconfig para ver detalhes.PROJECT
: o nome do seu projeto.CIDR
: o CIDR externo a partir do qual o ELB tem de ser acedido. Esta política é necessária porque o balanceador de carga externo usa o retorno direto do servidor (DSR), que preserva o endereço IP externo de origem e ignora o balanceador de carga no caminho de retorno. Para mais informações, consulte o artigo Crie uma regra de firewall de entrada global para tráfego entre organizações.PORT
: a porta de back-end nas VMs atrás do balanceador de carga. Este valor encontra-se no campo.spec.ports[].targetPortfield
do manifesto para o recursoService
. Este campo é opcional.
Crie um recurso
Backend
para definir os pontos finais do ELB. Crie recursosBackend
para cada zona em que as cargas de trabalho estão localizadas:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT name: BACKEND_NAME spec: endpointsLabels: matchLabels: app: server EOF
Substitua o seguinte:
MANAGEMENT_API_SERVER
: o caminho kubeconfig do caminho kubeconfig do servidor da API Management zonal. Se ainda não gerou um ficheiro kubeconfig para o servidor da API na sua zona segmentada, consulte o artigo Gere manualmente o ficheiro kubeconfig para ver detalhes.PROJECT
: o nome do seu projeto.BACKEND_NAME
: o nome do recursoBackend
.
Pode usar o mesmo recurso
Backend
para cada zona ou criar recursosBackend
com diferentes conjuntos de etiquetas para cada zona.Defina uma verificação de funcionamento global para o ELB:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: HealthCheck metadata: namespace: PROJECT name: HEALTH_CHECK_NAME spec: tcpHealthCheck: port: PORT timeoutSec: TIMEOUT checkIntervalSec: CHECK_INTERVAL healthyThreshold: HEALTHY_THRESHOLD unhealthyThreshold: UNHEALTHY_THRESHOLD EOF
Substitua o seguinte:
HEALTH_CHECK_NAME
: o nome do recurso de verificação do estado de funcionamento, comomy-health-check
.PORT
: a porta na qual realizar a verificação de funcionamento. O valor predefinido é80
.TIMEOUT
: o período de tempo em segundos a aguardar antes de reclamar a falha. O valor predefinido é5
.CHECK_INTERVAL
: o período em segundos desde o início de uma sondagem até ao início da seguinte. O valor predefinido é5
.HEALTHY_THRESHOLD
: o número de sondagens sequenciais que têm de ser aprovadas para que o ponto final seja considerado em bom estado. O valor predefinido é2
.UNHEALTHY_THRESHOLD
: o número de sondagens sequenciais que têm de falhar para que o ponto final seja considerado não saudável. O valor predefinido é2
.
Uma vez que se trata de um ELB global, crie a verificação de funcionamento na API global.
Crie um objeto
BackendService
com o recursoBackend
criado anteriormente:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME EOF
Substitua o seguinte:
BACKEND_SERVICE_NAME
: o nome escolhido para o seu recursoBackendService
.HEALTH_CHECK_NAME
: o nome do recursoHealthCheck
criado anteriormente. Não inclua este campo se estiver a configurar um ELB para cargas de trabalho de pods.ZONE
: a zona em que o recursoBackend
reside. Pode especificar vários backends no campobackendRefs
. Por exemplo:
- name: my-backend-1 zone: us-east1-a - name: my-backend-2 zone: us-east1-b
Crie um recurso
ForwardingRule
externo que defina o VIP no qual o serviço está disponível.kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleExternal metadata: namespace: PROJECT name: FORWARDING_RULE_EXTERNAL_NAME spec: cidrRef: CIDR ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF
Substitua o seguinte:
FORWARDING_RULE_EXTERNAL_NAME
: o nome escolhido para o recursoForwardingRuleExternal
.CIDR
: o CIDR a usar para a regra de encaminhamento. Este campo é opcional. Se não for especificado, é reservado automaticamente umIPv4/32
CIDR do conjunto de endereços IP global. Especifique o nome de um recursoSubnet
no mesmo espaço de nomes que esta regra de encaminhamento. Um recursoSubnet
representa as informações de pedido e atribuição de uma sub-rede global. Para mais informações sobre osSubnet
recursos, consulte o artigo Faça a gestão das sub-redes.PORT
: a porta a expor na regra de encaminhamento. Use o campoports
para especificar uma matriz de portas L4 para as quais os pacotes são encaminhados para os back-ends configurados com esta regra de encaminhamento. Tem de especificar, pelo menos, uma porta. Use o campoport
para especificar um número de porta. A porta exposta tem de ser a mesma que a aplicação real está a expor no contentor.PROTOCOL
: o protocolo a usar para a regra de encaminhamento, comoTCP
. Uma entrada na matrizports
tem de ter o seguinte aspeto:
ports: - port: 80 protocol: TCP
Para validar o ELB configurado, confirme a condição
Ready
em cada um dos objetos criados. Experimente e teste o tráfego com um pedidocurl
ao VIP.Recupere o VIP do projeto:
kubectl get forwardingruleexternal -n PROJECT
O resultado tem o seguinte aspeto:
NAME BACKENDSERVICE CIDR READY elb-name BACKEND_SERVICE_NAME 192.0.2.0/32 True
Valide o tráfego com um pedido curl para o VIP na porta especificada no campo
PORT
na regra de encaminhamento:curl http://FORWARDING_RULE_VIP:PORT
Substitua
FORWARDING_RULE_VIP:PORT
pelo VIP e pela porta da regra de encaminhamento, como192.0.2.0:80
.
Configure a replicação de armazenamento assíncrona
Os universos multizona da GDC oferecem a utilização de recursos de armazenamento replicados, como volumes e contentores, no modo assíncrono para cenários de recuperação de desastres. Estas opções de recursos de armazenamento oferecem replicação de dados assíncrona entre quaisquer duas zonas na mesma região. A replicação assíncrona ocorre em segundo plano, oferecendo um objetivo de ponto de recuperação (RPO) baixo, mas não nulo, em caso de desastre. Todos os dados replicados estão online e imediatamente acessíveis, mas podem exigir um procedimento de comutação por falha manual para permitir a escrita na zona secundária.
Pode escolher um dos seguintes tipos de replicação de armazenamento assíncrona para a sua aplicação de VM:
Crie um contentor de zona dupla para armazenamento de objetos
Os dados de armazenamento de objetos são escritos num único contentor cujos dados são armazenados em ambas as zonas. Uma vez que os dados são copiados de forma assíncrona entre zonas, as zonas podem não conter as mesmas versões de objetos em qualquer momento, mas acabam por ficar equivalentes se não forem feitas alterações adicionais. Ao contrário da replicação de volumes, os contentores replicados são graváveis durante as partições de zonas. Cada gravação num objeto produz uma versão diferente, e a versão mais recente em qualquer zona é o estado final após o restauro da conetividade.
Verifique se o operador de infraestrutura (IO) criou o recurso personalizado
BucketLocationConfig
, que é necessário para a replicação assíncrona entre zonas para o armazenamento de objetos. Este recurso tem de ser implementado no servidor de API global raiz.Crie o recurso personalizado
Bucket
de zona dupla:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: object.global.gdc.goog/v1 kind: Bucket metadata: name: BUCKET_NAME namespace: PROJECT spec: location: LOCATION_NAME description: Sample DZ Bucket storageClass: Standard EOF
Substitua o seguinte:
GLOBAL_API_SERVER
: o ficheiro kubeconfig para o servidor de API global.BUCKET_NAME
: o nome do contentor de armazenamento.PROJECT
: o nome do projeto onde o contentor reside.LOCATION_NAME
: o local físico onde os dados de objetos no contentor residem. Tem de ser mapeado para o nome de um recursoBucketLocation
existente. Para consultar o servidor da API global da sua organização para obter uma lista de recursosBucketLocation
disponíveis, executekubectl --kubeconfig GLOBAL_API_SERVER bucketlocations
. Se não existirem recursosBucketLocation
, contacte o seu IO para verificar se ativou a replicação assíncrona.
Configure a replicação de armazenamento em blocos assíncrona em várias zonas
O armazenamento de blocos replicado oferece volumes replicados de forma assíncrona (PVs), que mantêm a equivalência de blocos entre os volumes principal e secundário. Devido à natureza assíncrona, o volume secundário reflete o estado da zona principal num determinado momento no passado (RPO diferente de zero). O volume secundário não é montável enquanto permanecer o destino da replicação, o que requer intervenção manual para terminar a relação e permitir que as gravações ocorram.
Tem de implementar um recurso personalizado VolumeReplicationRelationship
no servidor de API global para criar dados replicados que estejam disponíveis para a comutação por falha se os dados da zona de origem ficarem indisponíveis.
Antes de começar, verifique se o seu operador de infraestrutura (IO) criou e configurou os recursos personalizados StorageClusterPeering
e StorageVirtualMachinePeering
para permitir a replicação do armazenamento de blocos em várias zonas. Este recurso
tem de ser implementado no servidor de API global raiz.
gdcloud
Defina a relação de volume de replicação assíncrona entre a zona principal e as zonas secundárias:
gdcloud compute disks start-async-replication PRIMARY_DISK_NAME \ --project PROJECT \ --zone PRIMARY_ZONE \ --secondary-disk SECONDARY_DISK_NAME \ --secondary-zone SECONDARY_ZONE
Substitua o seguinte:
PRIMARY_DISK_NAME
: o nome do disco de origem que está a ser replicado.PROJECT
: o projeto GDC do disco principal.PRIMARY_ZONE
: a zona onde o disco principal reside.SECONDARY_DISK_NAME
: o nome do disco de destino para o qual replicar.SECONDARY_ZONE
: a zona onde o disco secundário tem de residir.
Crie um recurso personalizado
VolumeFailover
na zona de destino, que interrompe a replicação para a zona de destino se a zona de origem estiver indisponível por qualquer motivo:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: storage.gdc.goog/v1 kind: VolumeFailover metadata: name: FAILOVER_NAME namespace: PROJECT spec: volumeReplicationRelationshipRef: REPL_NAME EOF
Substitua o seguinte:
MANAGEMENT_API_SERVER
: o ficheiro kubeconfig para o servidor da API Management.FAILOVER_NAME
: o nome da alternativa.PROJECT
: o projeto onde reside a infraestrutura de armazenamento.REPL_NAME
: o nome da relação de replicação de volumes.
Para mais informações sobre a gestão da replicação assíncrona para cargas de trabalho de VMs, consulte o artigo Replique volumes de forma assíncrona.
API
Crie um ficheiro YAML de recursos personalizados
VolumeReplicationRelationship
e implemente-o no servidor de API global:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: storage.global.gdc.goog/v1 kind: VolumeReplicationRelationship metadata: name: VRR_NAME namespace: PROJECT spec: source: virtualMachineDisk: virtualMachineDiskRef: PRIMARY_DISK_NAME zoneRef: PRIMARY_ZONE destination: volumeOverrideName: SECONDARY_DISK_NAME zoneRef: SECONDARY_ZONE EOF
Substitua o seguinte:
GLOBAL_API_SERVER
: o ficheiro kubeconfig para o servidor da API de gestão global.VRR_NAME
: o nome da relação de replicação de volume. Tem de usar o mesmo nome quando parar a replicação assíncrona.PROJECT
: o projeto GDC do disco principal.PRIMARY_DISK_NAME
: o nome do disco de origem que está a ser replicado.PRIMARY_ZONE
: a zona onde o disco principal reside.SECONDARY_DISK_NAME
: o nome do disco de destino para o qual replicar.SECONDARY_ZONE
: a zona onde o disco secundário tem de residir.
Crie um recurso personalizado
VolumeFailover
na zona de destino, que interrompe a replicação para a zona de destino se a zona de origem estiver indisponível por qualquer motivo:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: storage.gdc.goog/v1 kind: VolumeFailover metadata: name: FAILOVER_NAME namespace: PROJECT spec: volumeReplicationRelationshipRef: REPL_NAME EOF
Substitua o seguinte:
MANAGEMENT_API_SERVER
: o ficheiro kubeconfig para o servidor da API Management.FAILOVER_NAME
: o nome da alternativa.PROJECT
: o projeto onde reside a infraestrutura de armazenamento.REPL_NAME
: o nome da relação de replicação de volume.
Para mais informações sobre a gestão da replicação assíncrona para cargas de trabalho de VMs, consulte o artigo Replique volumes de forma assíncrona.