Provisionar o Cloud Service Mesh em um cluster do Autopilot do GKE


Neste guia, descrevemos como configurar o Cloud Service Mesh gerenciado em um cluster do Autopilot do Google Kubernetes Engine (GKE). O Cloud Service Mesh é uma malha de serviço totalmente gerenciada com base no Istio.

Neste tutorial, mostramos como configurar uma malha de serviço pronta para produção em execução em um único cluster do Autopilot do GKE com configurações padrão. Recomendamos que você também consulte o guia de provisionamento completo do Cloud Service Mesh ao projetar o ambiente.

Vantagens de executar o Cloud Service Mesh gerenciado com o Autopilot do GKE

Quando você usa o GKE no modo Autopilot, o Google processa a configuração e o gerenciamento do cluster automaticamente. O modo Autopilot simplifica a experiência de operar um cluster e permite que você se concentre nos aplicativos. Da mesma forma, o Cloud Service Mesh gerenciado é uma malha de serviço totalmente gerenciada que pode ser provisionada seguindo algumas etapas.

  • Você provisiona o Cloud Service Mesh gerenciado usando a API Fleet, sem a necessidade de ferramentas do lado do cliente, como istioctl.
  • O Cloud Service Mesh injeta proxies sidecar automaticamente em cargas de trabalho sem a necessidade de conceder privilégios elevados aos contêineres.
  • É possível visualizar painéis avançados para sua malha e serviços sem nenhuma configuração extra e usar essas métricas para configurar objetivos de nível de serviço (SLOs) e alertas para monitorar a integridade dos aplicativos.
  • O plano de controle do Cloud Service Mesh gerenciado é atualizado automaticamente para garantir que você tenha os recursos e patches de segurança mais recentes.
  • O plano de dados gerenciado do Cloud Service Mesh faz upgrade automaticamente dos proxies sidecar nas cargas de trabalho para que você não precise reiniciar os serviços quando upgrades de proxy e patches de segurança estiverem disponíveis
  • O Cloud Service Mesh é um produto compatível e pode ser configurado usando APIs Istio de código aberto padrão. Confira os recursos compatíveis.

Objetivos

  • Criar um cluster do Autopilot do GKE
  • Provisionar o Cloud Service Mesh gerenciado usando a API Fleet
  • Implantar gateways de entrada da malha em um namespace dedicado
  • Implantar um aplicativo de amostra
  • Configurar o Cloud Service Mesh para aplicar a autenticação TLS mútua (mTLS) estrita para comunicação de serviço a serviço.
  • Visualizar os painéis do Cloud Service Mesh e verificar se os serviços se conectam com mTLS

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.

Antes de começar

O Cloud Shell vem pré-instalado com o software necessário para este tutorial, incluindo o kubectl, a gcloud CLI, o Helm e o Terraform. Se você não usa o Cloud Shell, é necessário instalar a gcloud CLI.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Install the Google Cloud CLI.
  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  9. Make sure that billing is enabled for your Google Cloud project.

  10. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/container.containerAdmin, roles/gkehub.admin, roles/serviceusage.serviceUsageAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

configurar o ambiente

É possível configurar o ambiente usando a gcloud CLI ou o Terraform.

gcloud

  1. Defina as variáveis de ambiente:

    PROJECT_ID=PROJECT_ID
    gcloud config set project ${PROJECT_ID}
    
  2. Ative a API Mesh:

    gcloud services enable mesh.googleapis.com
    

    A ativação do mesh.googleapis.com ativa as seguintes APIs:

    API Finalidade Pode ser desativada?
    meshconfig.googleapis.com O Cloud Service Mesh usa a API Mesh Configuration para redirecionar os dados de configuração da malha para o Google Cloud. Além disso, ativar a API Mesh Configuration permite acessar as páginas do Cloud Service Mesh no console do Google Cloud e usar a autoridade certificadora do Cloud Service Mesh. Não
    meshca.googleapis.com Relacionada à autoridade certificadora do Cloud Service Mesh usada pelo Cloud Service Mesh gerenciado. Não
    container.googleapis.com Necessária para a criação de clusters do Google Kubernetes Engine (GKE). Não
    gkehub.googleapis.com Necessária para o gerenciamento da malha como uma frota. Não
    monitoring.googleapis.com Necessária para a captura da telemetria de cargas de trabalho da malha. Não
    stackdriver.googleapis.com Necessária para uso da interface dos serviços. Não
    opsconfigmonitoring.googleapis.com Necessária para uso da interface dos serviços para clusters fora do Google Cloud. Não
    connectgateway.googleapis.com Necessária para que o plano de controle do Cloud Service Mesh gerenciado acesse cargas de trabalho da malha. Sim*
    trafficdirector.googleapis.com Permite um plano de controle gerenciado altamente disponível e escalonável. Sim*
    networkservices.googleapis.com Permite um plano de controle gerenciado altamente disponível e escalonável. Sim*
    networksecurity.googleapis.com Permite um plano de controle gerenciado altamente disponível e escalonável. Sim*

Terraform

gcloud config set project PROJECT_ID
GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
export GOOGLE_CLOUD_PROJECT

Crie um cluster do GKE

Criar um cluster do GKE no modo Autopilot.

gcloud

  1. Crie um cluster registrado como membro de uma frota:

    gcloud container clusters create-auto asm-cluster \
        --location="us-central1" \
        --enable-fleet
    
  2. Verifique se o cluster está registrado na frota:

    gcloud container fleet memberships list
    

    O resultado será assim:

    NAME: asm-cluster
    EXTERNAL_ID: 
    LOCATION: us-central1
    

    Anote o nome da assinatura, porque você precisará dele para configurar o Cloud Service Mesh.

Terraform

Para criar um cluster do GKE, use o recurso google_container_cluster. Você define o bloco fleet para que o cluster seja adicionado a uma frota quando for criado.

resource "google_container_cluster" "cluster" {
  name                = "asm-cluster"
  location            = var.region
  deletion_protection = false # Warning: Do not set deletion_protection to false for production clusters

  enable_autopilot = true
  fleet {
    project = data.google_project.project.name
  }
}

data "google_project" "project" {}

Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.

Provisionar o Cloud Service Mesh gerenciado

Provisione o Cloud Service Mesh gerenciado usando o recurso servicemesh na assinatura da frota do cluster.

gcloud

  1. Ative o recurso de frota do Cloud Service Mesh no projeto:

    gcloud container fleet mesh enable
    
  2. Ative o gerenciamento automático da malha:

    gcloud container fleet mesh update \
        --management=automatic \
        --memberships=MEMBERSHIP_NAME \
        --location=us-central1
    

    Substitua MEMBERSHIP_NAME pelo nome da associação listado quando você verificou que o cluster está registrado na frota.

Terraform

Para ativar a API mesh, use o recurso google_project_service.

Use os recursos google_gke_hub_feature e google_gke_hub_feature_membership para configurar o Cloud Service Mesh gerenciado no cluster.

resource "google_project_service" "mesh_api" {
  service = "mesh.googleapis.com"

  disable_dependent_services = true
}

resource "google_gke_hub_feature" "feature" {
  name     = "servicemesh"
  location = "global"

  depends_on = [
    google_project_service.mesh_api
  ]
}

resource "google_gke_hub_feature_membership" "feature_member" {
  location   = "global"
  feature    = google_gke_hub_feature.feature.name
  membership = google_container_cluster.cluster.fleet.0.membership
  membership_location = google_container_cluster.cluster.location
  mesh {
    management = "MANAGEMENT_AUTOMATIC"
  }
}

Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.

Verificar se o plano de controle está ativo

Aguarde até que o controlPlaneManagement.state esteja ACTIVE. Isso pode levar até 15 minutos.

watch -n 30 gcloud container fleet mesh describe

A resposta é semelhante a:

membershipSpecs:
  projects/746296320118/locations/us-central1/memberships/asm-cluster:
    mesh:
      management: MANAGEMENT_AUTOMATIC
membershipStates:
  projects/746296320118/locations/us-central1/memberships/asm-cluster:
    servicemesh:
      controlPlaneManagement:
        details:
        - code: REVISION_READY
          details: 'Ready: asm-managed'
        state: ACTIVE
      dataPlaneManagement:
        details:
        - code: PROVISIONING
          details: Service is provisioning.
        state: PROVISIONING
    state:
      code: OK
      description: 'Revision(s) ready for use: asm-managed.'

A seção dataPlaneManagement permanece no estado PROVISIONING até você implantar o gateway de entrada, porque os clusters do Autopilot não provisionam nós até que uma carga de trabalho seja implantada.

Implantar um gateway de entrada da malha

Nesta seção, você implanta um gateway de entrada da malha para lidar com o tráfego de entrada para o aplicativo de amostra. Um gateway de entrada é um balanceador de carga que opera na borda da malha e recebe conexões HTTP/TCP de entrada ou saída.

Implante o gateway em um namespace dedicado e rotule a implantação para garantir que o gateway possa ser gerenciado com segurança e atualizado automaticamente pelo plano de controle do Cloud Service Mesh.

  1. Faça o download das credenciais para acessar o cluster:

    gcloud container clusters get-credentials asm-cluster --location=us-central1
    
  2. Crie um namespace para a implantação do gateway:

    kubectl create namespace bank-gateways
    
  3. Adicione um rótulo ao namespace para que o plano de controle do Cloud Service Mesh injete automaticamente a configuração do gateway na implantação.

    kubectl label namespace bank-gateways istio-injection=enabled
    
  4. Implante o gateway de entrada no namespace:

    Helm

    helm repo add istio https://istio-release.storage.googleapis.com/charts
    helm repo update
    helm install --wait --namespace bank-gateways \
        --set resources.requests.cpu=250m \
        --set resources.requests.memory=512Mi \
        --set resources.requests.ephemeral-storage=1Gi \
        --set resources.limits.cpu=250m \
        --set resources.limits.memory=512Mi \
        --set resources.limits.ephemeral-storage=1Gi \
        istio-ingressgateway istio/gateway
    

    kubectl

    kubectl apply -n bank-gateways \
        -k https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages/tree/main/samples/gateways/istio-ingressgateway
    kubectl -n bank-gateway wait "deployment/istio-ingressgateway"  \
        --for=condition=available --timeout=240s
    

    Verifique se você definiu solicitações de recursos adequadas ao implantar em um ambiente de produção. O Autopilot do GKE considera apenas valores de recursos definidos em requests, e não em limits. O projeto do Istio publica informações sobre desempenho e escalonabilidade.

Implantar o aplicativo de amostra

  1. Crie um namespace do Kubernetes para a implantação:

    kubectl create namespace bank-sample
    
  2. Adicione um rótulo ao namespace para que o Cloud Service Mesh injete automaticamente proxies sidecar nos pods de amostra:

    kubectl label namespace bank-sample istio-injection=enabled
    
  3. Implantar o aplicativo de amostra:

    git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
    kubectl apply -n bank-sample -f bank-of-anthos/extras/jwt/jwt-secret.yaml
    kubectl apply -n bank-sample -f bank-of-anthos/kubernetes-manifests/
    
  4. Aguarde o aplicativo ficar pronto. Isso levará alguns minutos.

    watch kubectl -n bank-sample get pods
    

    Quando o aplicativo estiver pronto, a saída será semelhante a esta:

    NAME                                 READY   STATUS    RESTARTS   AGE
    accounts-db-0                        2/2     Running   0          2m16s
    balancereader-5c695f78f5-x4wlz       2/2     Running   0          3m8s
    contacts-557fc79c5-5d7fg             2/2     Running   0          3m7s
    frontend-7dd589c5d7-b4cgq            2/2     Running   0          3m7s
    ledger-db-0                          2/2     Running   0          3m6s
    ledgerwriter-6497f5cf9b-25c6x        2/2     Running   0          3m5s
    loadgenerator-57f6896fd6-lx5df       2/2     Running   0          3m5s
    transactionhistory-6c498965f-tl2sk   2/2     Running   0          3m4s
    userservice-95f44b65b-mlk2p          2/2     Running   0          3m4s
    
  5. Crie os recursos Gateway e VirtualService do Istio para expor o aplicativo por trás do gateway de entrada:

    kubectl apply -n bank-sample -f bank-of-anthos/extras/istio/frontend-ingress.yaml
    
  6. Receba um link para o aplicativo de amostra:

    INGRESS_HOST=$(kubectl -n bank-gateways get service istio-ingressgateway \
        -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo "http://$INGRESS_HOST"
    
  7. Em um navegador, siga o link para abrir o aplicativo de amostra. Faça login com o nome de usuário e a senha padrão para ver o aplicativo.

Aplicar TLS mútuo

Verifique se o modo TLS mútuo (mTLS) STRICT está ativado. Aplique uma política PeerAuthentication padrão para a malha no namespace istio-system.

  1. Salve o seguinte manifesto como mesh-peer-authn.yaml:

    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "default"
      namespace: "istio-system"
    spec:
      mtls:
        mode: STRICT
    
  2. Aplique o manifesto ao cluster:

    kubectl apply -f mesh-peer-authn.yaml
    

É possível modificar essa configuração criando recursos PeerAuthentication em namespaces específicos.

Conhecer os painéis do Cloud Service Mesh

  1. No console do Google Cloud, acesse Cloud Service Mesh para ver os painéis da malha:

    Acessar o Cloud Service Mesh

  2. Selecione o projeto na lista suspensa na barra de menus.

    Você verá uma tabela de visão geral com todos os microsserviços na sua malha e uma visualização gráfica das conexões entre os microsserviços. Para cada microsserviço, a tabela mostra três "sinais de ouro" de SRE:

    • Tráfego: solicitações por segundo
    • Taxa de erros: uma porcentagem
    • Latência: milissegundos

    Essas métricas são baseadas no tráfego real que está sendo processado pelos microsserviços. O tráfego de teste constante é enviado automaticamente para o serviço frontend por um cliente loadgenerator implantado como parte do aplicativo de amostra. O Cloud Service Mesh envia automaticamente métricas, registros e, opcionalmente, traces para a observabilidade do Google Cloud.

  3. Clique no serviço frontend na tabela para ver um painel de visão geral do serviço. Você verá métricas adicionais do serviço e uma visualização de conexões de entrada e saída. Também é possível criar um objeto de nível de serviço (SLO, na sigla em inglês) para monitorar e enviar alertas sobre o serviço.

Verificar se o mTLS está ativado

Clique no link de segurança no painel para ter uma visão geral da segurança do serviço frontend. A tabela e a visualização mostram um ícone de cadeado verde para cada conexão de entrada e saída entre microsserviços. Esse ícone indica que a conexão está usando mTLS para autenticação e criptografia.

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

Para evitar cobranças dos recursos usados neste tutorial na conta do Google Cloud, siga estas etapas:

Exclua o projeto

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

Excluir recursos individuais

Se você usou um projeto existente e não quer excluí-lo, exclua os recursos individuais.

gcloud

  1. Exclua o aplicativo e os gateways de amostra:

    kubectl delete namespace bank-sample
    kubectl delete namespace bank-gateways
    
  2. Siga as instruções para desinstalar o Cloud Service Mesh

  3. Exclua o cluster do GKE:

    gcloud container clusters delete --region us-central1 asm-cluster --quiet
    

Terraform

Exclua os recursos que você criou com o Terraform:

  terraform destroy

A seguir