Da extremidade à malha: implemente aplicações de malha de serviços através do GKE Gateway

Last reviewed 2025-04-03 UTC

Esta implementação mostra como combinar o Cloud Service Mesh com o Cloud Load Balancing para expor aplicações numa malha de serviços a clientes da Internet.

Pode expor uma aplicação aos clientes de várias formas, consoante a localização do cliente. Esta implementação mostra como expor uma aplicação aos clientes combinando o Cloud Load Balancing com a malha de serviços do Google Cloud para integrar equilibradores de carga com uma malha de serviços. Esta implementação destina-se a profissionais avançados que executam o Cloud Service Mesh, mas também funciona para o Istio no Google Kubernetes Engine.

Arquitetura

O diagrama seguinte mostra como pode usar gateways de entrada de malha para integrar equilibradores de carga com uma malha de serviços:

Um balanceador de carga externo encaminha clientes externos para a malha através de proxies de gateway de entrada.

A entrada na nuvem funciona como a entrada para o tráfego externo na malha através da rede da VPC.

Na topologia do diagrama anterior, a camada de entrada na nuvem, que é programada através do GKE Gateway, origina tráfego de fora da malha de serviços e direciona esse tráfego para a camada de entrada na malha. Em seguida, a camada de entrada da malha direciona o tráfego para os backends da aplicação alojados na malha.

A entrada na nuvem verifica o estado de funcionamento da entrada na malha e a entrada na malha verifica o estado de funcionamento dos back-ends da aplicação.

A topologia anterior tem as seguintes considerações:

  • Entrada na nuvem: nesta arquitetura de referência, configura o Google Cloud balanceador de carga através do GKE Gateway para verificar o estado dos proxies de entrada da malha nas respetivas portas de verificação de funcionamento expostas.
  • Entrada de malha: na aplicação de malha, faz verificações de funcionamento nos back-ends diretamente para poder executar o equilíbrio de carga e a gestão de tráfego localmente.

A segurança é implementada através de certificados geridos fora da malha e certificados internos dentro da malha.

O diagrama anterior ilustra a encriptação HTTPS do cliente para o balanceador de carga, do balanceador de carga para o proxy de entrada da malha e do proxy de entrada para o proxy sidecar. Google Cloud

Objetivos

  • Implemente um cluster do Google Kubernetes Engine (GKE) no Google Cloud.
  • Implemente uma malha de serviços na nuvem baseada no Istio no seu cluster do GKE.
  • Configure o GKE Gateway para terminar o tráfego HTTPS público e direcionar esse tráfego para aplicações alojadas na malha de serviços.
  • Implemente a aplicação Online Boutique no cluster do GKE que expõe aos clientes na Internet.

Otimização de custos

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

Antes de começar

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    Executa todos os comandos do terminal para esta implementação a partir do Cloud Shell.

  4. Atualize para a versão mais recente da CLI do Google Cloud:

    gcloud components update
    
  5. Defina o seu Google Cloud projeto predefinido:

    export PROJECT=PROJECT
    export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT} --format="value(projectNumber)")
    gcloud config set project ${PROJECT}
    

    Substitua PROJECT pelo ID do projeto que quer usar para esta implementação.

  6. Crie um diretório de trabalho:

    mkdir -p ${HOME}/edge-to-mesh
    cd ${HOME}/edge-to-mesh
    export WORKDIR=`pwd`
    

    Depois de concluir esta implementação, pode eliminar o diretório de trabalho.

  7. Crie clusters do GKE

    As funcionalidades descritas nesta implementação requerem a versão 1.16 ou posterior do cluster do GKE.

    1. No Cloud Shell, crie um novo ficheiro kubeconfig. Este passo garante que não cria um conflito com o seu ficheiro kubeconfig (predefinido) existente.

      touch edge2mesh_kubeconfig
      export KUBECONFIG=${WORKDIR}/edge2mesh_kubeconfig
      
    2. Defina variáveis de ambiente para o cluster do GKE:

      export CLUSTER_NAME=edge-to-mesh
      export CLUSTER_LOCATION=us-central1
      
    3. Ative a API Google Kubernetes Engine:

      gcloud services enable container.googleapis.com
      
    4. Crie um cluster do GKE Autopilot:

      gcloud container --project ${PROJECT} clusters create-auto \
      ${CLUSTER_NAME} --region ${CLUSTER_LOCATION} --release-channel rapid
      
    5. Certifique-se de que o cluster está em execução:

      gcloud container clusters list
      

      O resultado é semelhante ao seguinte:

      NAME          LOCATION    MASTER_VERSION    MASTER_IP      MACHINE_TYPE   NODE_VERSION      NUM_NODES  STATUS
      edge-to-mesh  us-central1  1.27.3-gke.1700   34.122.84.52  e2-medium  1.27.3-gke.1700   3          RUNNING
      

    Instale uma malha de serviço

    Nesta secção, configura a malha de serviços na nuvem gerida com a API Fleet.

    1. No Cloud Shell, ative as APIs necessárias:

      gcloud services enable mesh.googleapis.com
      
    2. Ative o Cloud Service Mesh na frota:

      gcloud container fleet mesh enable
      
    3. Registe o cluster na frota:

      gcloud container fleet memberships register ${CLUSTER_NAME} \
        --gke-cluster ${CLUSTER_LOCATION}/${CLUSTER_NAME}
      
    4. Aplique a etiqueta mesh_id ao cluster edge-to-mesh:

      gcloud container clusters update ${CLUSTER_NAME} --project ${PROJECT} --region ${CLUSTER_LOCATION} --update-labels mesh_id=proj-${PROJECT_NUMBER}
      
    5. Ativar a gestão automática do plano de controlo e o plano de dados gerido:

      gcloud container fleet mesh update \
        --management automatic \
        --memberships ${CLUSTER_NAME}
      
    6. Após alguns minutos, verifique se o estado do plano de controlo é ACTIVE:

      gcloud container fleet mesh describe
      

      O resultado é semelhante ao seguinte:

      ...
      membershipSpecs:
        projects/892585880385/locations/us-central1/memberships/edge-to-mesh:
          mesh:
            management: MANAGEMENT_AUTOMATIC
      membershipStates:
        projects/892585880385/locations/us-central1/memberships/edge-to-mesh:
          servicemesh:
            controlPlaneManagement:
              details:
              - code: REVISION_READY
                details: 'Ready: asm-managed-rapid'
              implementation: TRAFFIC_DIRECTOR
              state: ACTIVE
            dataPlaneManagement:
              details:
              - code: OK
                details: Service is running.
              state: ACTIVE
          state:
            code: OK
            description: 'Revision(s) ready for use: asm-managed-rapid.'
            updateTime: '2023-08-04T02:54:39.495937877Z'
      name: projects/e2m-doc-01/locations/global/features/servicemesh
      resourceState:
        state: ACTIVE
      ...
      

    Implemente o GKE Gateway

    Nos passos seguintes, implementa o Application Load Balancer externo através do controlador do GKE Gateway. O recurso GKE Gateway automatiza o aprovisionamento do balanceador de carga e a verificação de funcionamento do back-end. Além disso, usa o Certificate Manager para aprovisionar e gerir um certificado TLS e os Endpoints para aprovisionar automaticamente um nome DNS público para a aplicação.

    Instale um gateway de entrada de malha de serviço

    Como prática recomendada de segurança, recomendamos que implemente o gateway de entrada num espaço de nomes diferente do plano de controlo.

    1. No Cloud Shell, crie um namespace ingress-gateway dedicado:

      kubectl create namespace ingress-gateway
      
    2. Adicione uma etiqueta de espaço de nomes ao espaço de nomes ingress-gateway:

      kubectl label namespace ingress-gateway istio-injection=enabled
      

      O resultado é semelhante ao seguinte:

      namespace/ingress-gateway labeled
      

      Etiquetar o espaço de nomes ingress-gateway com istio-injection=enabled indica ao Cloud Service Mesh para injetar automaticamente proxies sidecar do Envoy quando uma aplicação é implementada.

    3. Crie um certificado autoassinado usado pela gateway de entrada para terminar as ligações TLS entre o equilibrador de carga (a ser configurado mais tarde através do controlador da gateway do GKE) e a gateway de entrada, e armazene o certificado autoassinado como um segredo do Kubernetes: Google Cloud

      openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 \
       -subj "/CN=frontend.endpoints.${PROJECT}.cloud.goog/O=Edge2Mesh Inc" \
       -keyout frontend.endpoints.${PROJECT}.cloud.goog.key \
       -out frontend.endpoints.${PROJECT}.cloud.goog.crt
      
      kubectl -n ingress-gateway create secret tls edge2mesh-credential \
       --key=frontend.endpoints.${PROJECT}.cloud.goog.key \
       --cert=frontend.endpoints.${PROJECT}.cloud.goog.crt
      

      Para mais detalhes sobre os requisitos do certificado do gateway de entrada, consulte o guia de considerações sobre o protocolo de back-end seguro.

    4. Execute os seguintes comandos para criar o YAML do recurso do gateway de entrada:

      mkdir -p ${WORKDIR}/ingress-gateway/base
      cat <<EOF > ${WORKDIR}/ingress-gateway/base/kustomization.yaml
      resources:
        - github.com/GoogleCloudPlatform/anthos-service-mesh-samples/docs/ingress-gateway-asm-manifests/base
      EOF
      
      mkdir ${WORKDIR}/ingress-gateway/variant
      cat <<EOF > ${WORKDIR}/ingress-gateway/variant/role.yaml
      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
        name: asm-ingressgateway
      rules:
      - apiGroups: [""]
        resources: ["secrets"]
        verbs: ["get", "watch", "list"]
      EOF
      
      cat <<EOF > ${WORKDIR}/ingress-gateway/variant/rolebinding.yaml
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: asm-ingressgateway
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: Role
        name: asm-ingressgateway
      subjects:
        - kind: ServiceAccount
          name: asm-ingressgateway
      EOF
      
      cat <<EOF > ${WORKDIR}/ingress-gateway/variant/service-proto-type.yaml
      apiVersion: v1
      kind: Service
      metadata:
        name: asm-ingressgateway
      spec:
        ports:
        - name: status-port
          port: 15021
          protocol: TCP
          targetPort: 15021
        - name: http
          port: 80
          targetPort: 8080
        - name: https
          port: 443
          targetPort: 8443
          appProtocol: HTTP2
        type: ClusterIP
      EOF
      
      cat <<EOF > ${WORKDIR}/ingress-gateway/variant/gateway.yaml
      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: asm-ingressgateway
      spec:
        servers:
        - port:
            number: 443
            name: https
            protocol: HTTPS
          hosts:
          - "*" # IMPORTANT: Must use wildcard here when using SSL, as SNI isn't passed from GFE
          tls:
            mode: SIMPLE
            credentialName: edge2mesh-credential
      EOF
      
      cat <<EOF > ${WORKDIR}/ingress-gateway/variant/kustomization.yaml
      namespace: ingress-gateway
      resources:
      - ../base
      - role.yaml
      - rolebinding.yaml
      patches:
      - path: service-proto-type.yaml
        target:
          kind: Service
      - path: gateway.yaml
        target:
          kind: Gateway
      EOF
      
    5. Aplique os CRDs da gateway de entrada:

      kubectl apply -k ${WORKDIR}/ingress-gateway/variant
      
    6. Certifique-se de que todas as implementações estão em funcionamento:

      kubectl wait --for=condition=available --timeout=600s deployment --all -n ingress-gateway
      

      O resultado é semelhante ao seguinte:

      deployment.apps/asm-ingressgateway condition met
      

    Aplique uma verificação de estado do gateway de entrada da malha de serviços

    Ao integrar um gateway de entrada de malha de serviço num equilibrador de carga de aplicações, o equilibrador de carga de aplicações tem de ser configurado para fazer verificações de estado nos pods do gateway de entrada. Google Cloud O CRD HealthCheckPolicyfornece uma API para configurar essa verificação de funcionamento.

    1. No Cloud Shell, crie o ficheiro HealthCheckPolicy.yaml:

      cat <<EOF >${WORKDIR}/ingress-gateway-healthcheck.yaml
      apiVersion: networking.gke.io/v1
      kind: HealthCheckPolicy
      metadata:
        name: ingress-gateway-healthcheck
        namespace: ingress-gateway
      spec:
        default:
          checkIntervalSec: 20
          timeoutSec: 5
          #healthyThreshold: HEALTHY_THRESHOLD
          #unhealthyThreshold: UNHEALTHY_THRESHOLD
          logConfig:
            enabled: True
          config:
            type: HTTP
            httpHealthCheck:
              #portSpecification: USE_NAMED_PORT
              port: 15021
              portName: status-port
              #host: HOST
              requestPath: /healthz/ready
              #response: RESPONSE
              #proxyHeader: PROXY_HEADER
          #requestPath: /healthz/ready
          #port: 15021
        targetRef:
          group: ""
          kind: Service
          name: asm-ingressgateway
      EOF
      
    2. Aplique o HealthCheckPolicy:

      kubectl apply -f ${WORKDIR}/ingress-gateway-healthcheck.yaml
      

    Defina políticas de segurança

    O Cloud Armor oferece defesa contra DDoS e políticas de segurança personalizáveis que pode associar a um equilibrador de carga através de recursos de entrada. Nos passos seguintes, cria uma política de segurança que usa regras pré-configuradas para bloquear ataques de cross-site scripting (XSS). Esta regra ajuda a bloquear o tráfego que corresponde a assinaturas de ataques conhecidas, mas permite todo o outro tráfego. O seu ambiente pode usar regras diferentes consoante a sua carga de trabalho.

    1. No Cloud Shell, crie uma política de segurança denominada edge-fw-policy:

      gcloud compute security-policies create edge-fw-policy \
        --description "Block XSS attacks"
      
    2. Crie uma regra de política de segurança que use os filtros XSS pré-configurados:

      gcloud compute security-policies rules create 1000 \
          --security-policy edge-fw-policy \
          --expression "evaluatePreconfiguredExpr('xss-stable')" \
          --action "deny-403" \
          --description "XSS attack filtering"
      
    3. Crie o ficheiro GCPBackendPolicy.yaml para anexar ao serviço de gateway de entrada:

      cat <<EOF > ${WORKDIR}/cloud-armor-backendpolicy.yaml
      apiVersion: networking.gke.io/v1
      kind: GCPBackendPolicy
      metadata:
        name: cloud-armor-backendpolicy
        namespace: ingress-gateway
      spec:
        default:
          securityPolicy: edge-fw-policy
        targetRef:
          group: ""
          kind: Service
          name: asm-ingressgateway
      EOF
      
    4. Aplique o ficheiro GCPBackendPolicy.yaml:

      kubectl apply -f ${WORKDIR}/cloud-armor-backendpolicy.yaml
      

    Configure o endereçamento IP e o DNS

    1. No Cloud Shell, crie um endereço IP estático global para o Google Cloud balanceador de carga:

      gcloud compute addresses create e2m-gclb-ip --global
      

      Este endereço IP estático é usado pelo recurso GKE Gateway e permite que o endereço IP permaneça o mesmo, mesmo que o balanceador de carga externo seja alterado.

    2. Obtenha o endereço IP estático:

      export GCLB_IP=$(gcloud compute addresses describe e2m-gclb-ip \
      --global --format "value(address)")
      echo ${GCLB_IP}
      

      Para criar um mapeamento estável e fácil de usar para o endereço IP estático do seu equilibrador de carga de aplicações, tem de ter um registo DNS público. Pode usar qualquer fornecedor DNS e automatização que quiser. Esta implementação usa pontos finais em vez de criar uma zona DNS gerida. O Endpoints fornece um registo de DNS gerido pela Google gratuito para um endereço IP público.

    3. Execute o seguinte comando para criar o ficheiro de especificação YAML denominado dns-spec.yaml:

      cat <<EOF > ${WORKDIR}/dns-spec.yaml
      swagger: "2.0"
      info:
        description: "Cloud Endpoints DNS"
        title: "Cloud Endpoints DNS"
        version: "1.0.0"
      paths: {}
      host: "frontend.endpoints.${PROJECT}.cloud.goog"
      x-google-endpoints:
      - name: "frontend.endpoints.${PROJECT}.cloud.goog"
        target: "${GCLB_IP}"
      EOF
      

      A especificação YAML define o registo DNS público no formato frontend.endpoints.${PROJECT}.cloud.goog, em que ${PROJECT} é o seu identificador exclusivo do projeto.

    4. Implemente o ficheiro dns-spec.yaml no seu Google Cloud projeto:

      gcloud endpoints services deploy ${WORKDIR}/dns-spec.yaml
      

      O resultado é semelhante ao seguinte:

      project [e2m-doc-01]...
      Operation "operations/acat.p2-892585880385-fb4a01ad-821d-4e22-bfa1-a0df6e0bf589" finished successfully.
      
      Service Configuration [2023-08-04r0] uploaded for service [frontend.endpoints.e2m-doc-01.cloud.goog]
      

      Agora que o endereço IP e o DNS estão configurados, pode gerar um certificado público para proteger a parte frontal. Para fazer a integração com o GKE Gateway, usa certificados TLS do gestor de certificados.

    Aprovisione um certificado TLS

    Nesta secção, cria um certificado TLS através do gestor de certificados e associa-o a um mapa de certificados através de uma entrada do mapa de certificados. O balanceador de carga da aplicação, configurado através do GKE Gateway, usa o certificado para fornecer comunicações seguras entre o cliente e Google Cloud. Depois de criado, a entrada do mapa de certificados é referenciada pelo recurso do GKE Gateway.

    1. No Cloud Shell, ative a API Certificate Manager:

      gcloud services enable certificatemanager.googleapis.com --project=${PROJECT}
      
    2. Crie o certificado TLS:

      gcloud --project=${PROJECT} certificate-manager certificates create edge2mesh-cert \
          --domains="frontend.endpoints.${PROJECT}.cloud.goog"
      
    3. Crie o mapeamento de certificados:

      gcloud --project=${PROJECT} certificate-manager maps create edge2mesh-cert-map
      
    4. Anexe o certificado ao mapeamento de certificados com uma entrada de mapeamento de certificados:

      gcloud --project=${PROJECT} certificate-manager maps entries create edge2mesh-cert-map-entry \
          --map="edge2mesh-cert-map" \
          --certificates="edge2mesh-cert" \
          --hostname="frontend.endpoints.${PROJECT}.cloud.goog"
      

    Implemente os recursos do GKE Gateway e HTTPRoute

    Nesta secção, configura o recurso GKE Gateway que aprovisiona o balanceador de carga de aplicações através do Google Cloud gke-l7-global-external-managedgatewayClass. Além disso, configura recursos HTTPRoute que encaminham pedidos para a aplicação e fazem redirecionamentos de HTTP para HTTP(S).

    1. No Cloud Shell, execute o seguinte comando para criar o Gatewaymanifesto como gke-gateway.yaml:

      cat <<EOF > ${WORKDIR}/gke-gateway.yaml
      kind: Gateway
      apiVersion: gateway.networking.k8s.io/v1
      metadata:
        name: external-http
        namespace: ingress-gateway
        annotations:
          networking.gke.io/certmap: edge2mesh-cert-map
      spec:
        gatewayClassName: gke-l7-global-external-managed # gke-l7-gxlb
        listeners:
        - name: http # list the port only so we can redirect any incoming http requests to https
          protocol: HTTP
          port: 80
        - name: https
          protocol: HTTPS
          port: 443
        addresses:
        - type: NamedAddress
          value: e2m-gclb-ip # reference the static IP created earlier
      EOF
      
    2. Aplique o manifesto Gateway para criar um Gatewaydenominado external-http:

      kubectl apply -f ${WORKDIR}/gke-gateway.yaml
      
    3. Crie o ficheiro HTTPRoute.yaml predefinido:

      cat << EOF > ${WORKDIR}/default-httproute.yaml
      apiVersion: gateway.networking.k8s.io/v1
      kind: HTTPRoute
      metadata:
        name: default-httproute
        namespace: ingress-gateway
      spec:
        parentRefs:
        - name: external-http
          namespace: ingress-gateway
          sectionName: https
        rules:
        - matches:
          - path:
              value: /
          backendRefs:
          - name: asm-ingressgateway
            port: 443
      EOF
      
    4. Aplicar a predefinição HTTPRoute:

      kubectl apply -f ${WORKDIR}/default-httproute.yaml
      
    5. Crie um ficheiro HTTPRoute.yaml adicional para fazer redirecionamentos de HTTP para HTTP(S):

      cat << EOF > ${WORKDIR}/default-httproute-redirect.yaml
      kind: HTTPRoute
      apiVersion: gateway.networking.k8s.io/v1
      metadata:
        name: http-to-https-redirect-httproute
        namespace: ingress-gateway
      spec:
        parentRefs:
        - name: external-http
          namespace: ingress-gateway
          sectionName: http
        rules:
        - filters:
          - type: RequestRedirect
            requestRedirect:
              scheme: https
              statusCode: 301
      EOF
      
    6. Aplique o redirecionamento HTTPRoute:

      kubectl apply -f ${WORKDIR}/default-httproute-redirect.yaml
      

      A conciliação demora tempo. Use o seguinte comando até programmed=true:

      kubectl get gateway external-http -n ingress-gateway -w
      

    Instale a app de amostra Online Boutique

    1. No Cloud Shell, crie um namespace onlineboutique dedicado:

      kubectl create namespace onlineboutique
      
    2. Adicione uma etiqueta ao espaço de nomes onlineboutique:

      kubectl label namespace onlineboutique istio-injection=enabled
      

      Etiquetar o espaço de nomes onlineboutique com istio-injection=enabled indica ao Cloud Service Mesh que injete automaticamente proxies sidecar do Envoy quando uma aplicação é implementada.

    3. Transfira os ficheiros YAML do Kubernetes para a app de exemplo Online Boutique:

      curl -LO \
      https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/release/kubernetes-manifests.yaml
      
    4. Implemente a app Online Boutique:

      kubectl apply -f kubernetes-manifests.yaml -n onlineboutique
      

      O resultado é semelhante ao seguinte (incluindo avisos sobre a definição de pedidos e limites de recursos predefinidos do GKE Autopilot):

      Warning: autopilot-default-resources-mutator:Autopilot updated Deployment onlineboutique/emailservice: adjusted resources to meet requirements for containers [server] (see http://g.co/gke/autopilot-resources)
      deployment.apps/emailservice created
      service/emailservice created
      Warning: autopilot-default-resources-mutator:Autopilot updated Deployment onlineboutique/checkoutservice: adjusted resources to meet requirements for containers [server] (see http://g.co/gke/autopilot-resources)
      deployment.apps/checkoutservice created
      service/checkoutservice created
      Warning: autopilot-default-resources-mutator:Autopilot updated Deployment onlineboutique/recommendationservice: adjusted resources to meet requirements for containers [server] (see http://g.co/gke/autopilot-resources)
      deployment.apps/recommendationservice created
      service/recommendationservice created
      ...
      
    5. Certifique-se de que todas as implementações estão em funcionamento:

      kubectl get pods -n onlineboutique
      

      O resultado é semelhante ao seguinte:

      NAME                                     READY   STATUS    RESTARTS   AGE
      adservice-64d8dbcf59-krrj9               2/2     Running   0          2m59s
      cartservice-6b77b89c9b-9qptn             2/2     Running   0          2m59s
      checkoutservice-7668b7fc99-5bnd9         2/2     Running   0          2m58s
      ...
      

      Aguarde alguns minutos para que o cluster do GKE Autopilot aprovisione a infraestrutura de computação necessária para suportar a aplicação.

    6. Execute o seguinte comando para criar o manifesto VirtualService como frontend-virtualservice.yaml:

      cat <<EOF > frontend-virtualservice.yaml
      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: frontend-ingress
        namespace: onlineboutique
      spec:
        hosts:
        - "frontend.endpoints.${PROJECT}.cloud.goog"
        gateways:
        - ingress-gateway/asm-ingressgateway
        http:
        - route:
          - destination:
              host: frontend
              port:
                number: 80
      EOF
      

      VirtualService é criado no espaço de nomes da aplicação (onlineboutique). Normalmente, o proprietário da aplicação decide e configura como e que tráfego é encaminhado para a aplicação frontend, pelo que VirtualService é implementado pelo proprietário da app.

    7. Implemente frontend-virtualservice.yaml no seu cluster:

      kubectl apply -f frontend-virtualservice.yaml
      
    8. Aceda ao seguinte link:

      echo "https://frontend.endpoints.${PROJECT}.cloud.goog"
      

      É apresentado o frontend da Online Boutique.

      Produtos apresentados na página inicial da loja online.

    9. Para apresentar os detalhes do seu certificado, clique em Ver informações do site na barra de endereço do navegador e, de seguida, clique em Certificado (válido).

      O visualizador de certificados apresenta detalhes do certificado gerido, incluindo a data de validade e quem emitiu o certificado.

    Agora, tem um balanceador de carga HTTPS global que funciona como um front-end para a sua aplicação alojada na malha de serviço.

    Limpar

    Depois de concluir a implementação, pode limpar os recursos que criou na Google Cloud para não receber faturas relativas a estes no futuro. Pode eliminar o projeto na totalidade ou eliminar os recursos do cluster e, em seguida, eliminar o cluster.

    Elimine o projeto

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Elimine os recursos individuais

    Se quiser manter o Google Cloud projeto que usou nesta implementação, elimine os recursos individuais:

    1. No Cloud Shell, elimine os recursos HTTPRoute:

      kubectl delete -f ${WORKDIR}/default-httproute-redirect.yaml
      kubectl delete -f ${WORKDIR}/default-httproute.yaml
      
    2. Elimine o recurso do GKE Gateway:

      kubectl delete -f ${WORKDIR}/gke-gateway.yaml
      
    3. Elimine os recursos do certificado TLS (incluindo a entrada do mapa de certificados e o respetivo mapa de certificados principal):

      gcloud --project=${PROJECT} certificate-manager maps entries delete edge2mesh-cert-map-entry --map="edge2mesh-cert-map" --quiet
      gcloud --project=${PROJECT} certificate-manager maps delete edge2mesh-cert-map --quiet
      gcloud --project=${PROJECT} certificate-manager certificates delete edge2mesh-cert --quiet
      
    4. Elimine a entrada de DNS dos pontos finais:

      gcloud endpoints services delete "frontend.endpoints.${PROJECT}.cloud.goog"
      

      O resultado é semelhante ao seguinte:

      Are you sure? This will set the service configuration to be deleted, along
      with all of the associated consumer information. Note: This does not
      immediately delete the service configuration or data and can be undone using
      the undelete command for 30 days. Only after 30 days will the service be
      purged from the system.
      
    5. Quando lhe for pedido para continuar, introduza Y.

      O resultado é semelhante ao seguinte:

      Waiting for async operation operations/services.frontend.endpoints.edge2mesh.cloud.goog-5 to complete...
      Operation finished successfully. The following command can describe the Operation details:
       gcloud endpoints operations describe operations/services.frontend.endpoints.edge2mesh.cloud.goog-5
      
    6. Elimine o endereço IP estático:

      gcloud compute addresses delete ingress-ip --global
      

      O resultado é semelhante ao seguinte:

      The following global addresses will be deleted:
      
       - [ingress-ip]
      
    7. Quando lhe for pedido para continuar, introduza Y.

      O resultado é semelhante ao seguinte:

      Deleted
      [https://www.googleapis.com/compute/v1/projects/edge2mesh/global/addresses/ingress-ip].
      
    8. Elimine o cluster do GKE:

      gcloud container clusters delete $CLUSTER_NAME --zone $CLUSTER_LOCATION
      

      O resultado é semelhante ao seguinte:

      The following clusters will be deleted.
      - [edge-to-mesh] in [us-central1]
      
    9. Quando lhe for pedido para continuar, introduza Y.

      Após alguns minutos, o resultado é semelhante ao seguinte:

      Deleting cluster edge-to-mesh...done.
      Deleted
      [https://container.googleapis.com/v1/projects/e2m-doc-01/zones/us-central1/clusters/edge-to-mesh].
      

    O que se segue?