Aprovisione o Cloud Service Mesh num cluster do GKE Autopilot

Este guia descreve como configurar o Cloud Service Mesh gerido num cluster do Google Kubernetes Engine (GKE) Autopilot. O Cloud Service Mesh é uma malha de serviços totalmente gerida baseada no Istio.

Este tutorial mostra como configurar uma malha de serviços pronta para produção num único cluster do GKE Autopilot com as predefinições. Recomendamos que consulte também o guia de aprovisionamento do Cloud Service Mesh completo quando conceber o seu ambiente.

Vantagens da execução do Cloud Service Mesh gerido com o GKE Autopilot

Quando usa o GKE no modo Autopilot, a Google processa a configuração e a gestão do seu cluster automaticamente. O modo de piloto automático simplifica a experiência de operar um cluster e permite-lhe focar-se nas suas aplicações. Da mesma forma, o Cloud Service Mesh gerido é uma malha de serviços totalmente gerida que pode aprovisionar seguindo alguns passos.

  • Aprovisiona o Cloud Service Mesh gerido através da API Fleet, sem necessidade de ferramentas do lado do cliente, como o istioctl.
  • O Cloud Service Mesh injeta automaticamente proxies sidecar em cargas de trabalho sem necessidade de conceder privilégios elevados aos seus contentores.
  • Pode ver painéis de controlo detalhados para a sua malha e serviços sem qualquer configuração adicional e, em seguida, usar estas métricas para configurar objetivos de nível de serviço (SLOs) e alertas para monitorizar o estado das suas aplicações
  • O painel de controlo do Cloud Service Mesh gerido é atualizado automaticamente para garantir que recebe os patches e as funcionalidades de segurança mais recentes
  • O plano de dados gerido da Cloud Service Mesh atualiza automaticamente os proxies auxiliares nas suas cargas de trabalho para que não tenha de reiniciar os serviços manualmente quando estiverem disponíveis atualizações de proxies e patches de segurança
  • O Cloud Service Mesh é um produto suportado e pode ser configurado através das APIs Istio de código aberto padrão. Consulte as funcionalidades suportadas.

Configure o seu ambiente

Pode configurar o seu ambiente através da CLI gcloud ou do Terraform.

gcloud

  1. Defina 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 de mesh.googleapis.com ativa as seguintes APIs:

    API Finalidade Pode ser desativado
    meshconfig.googleapis.com O Cloud Service Mesh usa a API Mesh Configuration para retransmitir dados de configuração da sua malha para Google Cloud. Além disso, a ativação da API Mesh Configuration permite-lhe aceder às páginas do Cloud Service Mesh na Google Cloud consola e usar a autoridade de certificação do Cloud Service Mesh. Não
    meshca.googleapis.com Relacionado com a autoridade de certificação do Cloud Service Mesh usada pelo Cloud Service Mesh gerido. Não
    container.googleapis.com Necessário para criar clusters do Google Kubernetes Engine (GKE). Não
    gkehub.googleapis.com Necessário para gerir a malha como uma frota. Não
    monitoring.googleapis.com Necessário para capturar telemetria para cargas de trabalho de malha. Não
    stackdriver.googleapis.com Necessário para usar a IU dos Serviços. Não
    opsconfigmonitoring.googleapis.com Necessário para usar a IU dos serviços para clusters fora doGoogle Cloud. Não
    connectgateway.googleapis.com Necessário para que o plano de controlo do Cloud Service Mesh gerido possa aceder às cargas de trabalho da malha. Sim*
    trafficdirector.googleapis.com Ativa um plano de controlo gerido altamente disponível e escalável. Sim*
    networkservices.googleapis.com Ativa um plano de controlo gerido altamente disponível e escalável. Sim*
    networksecurity.googleapis.com Ativa um plano de controlo gerido altamente disponível e escalá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

Crie um cluster do GKE no modo Autopilot.

gcloud

  1. Criar um cluster registado como membro de uma frota:

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

    gcloud container fleet memberships list
    

    O resultado é semelhante ao seguinte:

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

    Tome nota do nome da associação, uma vez que precisa dele para configurar o Cloud Service Mesh.

Terraform

Para criar um cluster do GKE, pode usar o recurso google_container_cluster . 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 os comandos básicos do Terraform.

Aprovisione o Cloud Service Mesh gerido

Aprovisiona o Cloud Service Mesh gerido através da funcionalidade servicemesh na associação de frota para o seu cluster.

gcloud

  1. Ative a funcionalidade de frota do Cloud Service Mesh no projeto:

    gcloud container fleet mesh enable
    
  2. Ative a gestão automática da malha:

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

    Substitua MEMBERSHIP_NAME pelo nome do membro indicado quando validou que o cluster está registado na frota.

Terraform

Para ativar a API Mesh, pode usar o recurso google_project_service.

Usa os recursos google_gke_hub_feature e google_gke_hub_feature_membership para configurar o Cloud Service Mesh gerido no seu 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 os comandos básicos do Terraform.

Verifique se o plano de controlo está ativo

Aguarde até que o controlPlaneManagement.state esteja ACTIVE. Esta ação pode demorar até 15 minutos.

watch -n 30 gcloud container fleet mesh describe

O resultado é semelhante ao seguinte:

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 secção dataPlaneManagement permanece no estado PROVISIONING até implementar o gateway de entrada, porque os clusters do Autopilot não aprovisionam nós até implementar uma carga de trabalho.

Implemente um gateway de entrada de malha

Nesta secção, implementa um gateway de entrada de malha para processar o tráfego recebido para a aplicação de exemplo. Um gateway de entrada é um balanceador de carga que opera no limite da malha, recebendo ligações HTTP/TCP de entrada ou saída.

Implementa a gateway num espaço de nomes dedicado e etiqueta a implementação para garantir que a gateway pode ser gerida em segurança e atualizada automaticamente pelo plano de controlo do Cloud Service Mesh.

  1. Transfira as credenciais para poder aceder ao cluster:

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

    kubectl create namespace bank-gateways
    
  3. Adicione uma etiqueta ao espaço de nomes para que o plano de controlo da malha de serviços na nuvem injete automaticamente a configuração da gateway na implementação.

    kubectl label namespace bank-gateways istio-injection=enabled
    
  4. Implemente a gateway de entrada no espaço de nomes:

    Leme

    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

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

    Certifique-se de que define pedidos de recursos adequados quando implementar num ambiente de produção. O GKE Autopilot só considera os valores de recursos definidos em requests e não em limits. O projeto Istio publica informações sobre o desempenho e a escalabilidade.

Implemente a aplicação de exemplo

  1. Crie um espaço de nomes do Kubernetes para a implementação:

    kubectl create namespace bank-sample
    
  2. Adicione uma etiqueta ao espaço de nomes para que o Cloud Service Mesh injete automaticamente proxies sidecar nos pods de exemplo:

    kubectl label namespace bank-sample istio-injection=enabled
    
  3. Implemente a aplicação de exemplo:

    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 até que a aplicação esteja pronta. Esta ação vai demorar vários minutos.

    watch kubectl -n bank-sample get pods
    

    Quando a aplicação estiver pronta, o resultado é semelhante ao seguinte:

    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 recursos do Istio Gateway e VirtualService para expor a aplicação atrás do gateway de entrada:

    kubectl apply -n bank-sample -f bank-of-anthos/extras/istio/frontend-ingress.yaml
    
  6. Obtenha um link para a aplicação de exemplo:

    INGRESS_HOST=$(kubectl -n bank-gateways get service istio-ingressgateway \
        -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo "http://$INGRESS_HOST"
    
  7. Num navegador, siga o link para abrir a aplicação de exemplo. Inicie sessão com o nome de utilizador e a palavra-passe predefinidos para ver a aplicação.

Aplique o TLS mútuo

Certifique-se de que o modo TLS mútuo (mTLS) STRICT está ativado. Aplique uma política PeerAuthentication predefinida para a malha no espaço de nomes istio-system.

  1. Guarde 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
    

Pode substituir esta configuração criando recursos PeerAuthentication em espaços de nomes específicos.

Explore os painéis de controlo do Cloud Service Mesh

  1. Na Google Cloud consola, aceda a Cloud Service Mesh para ver os painéis de controlo da sua malha:

    Aceda ao Cloud Service Mesh

  2. Selecione o projeto na lista pendente da barra de menu.

    É apresentada uma tabela de vista geral com todos os microsserviços na sua malha e uma visualização gráfica das ligações entre os microsserviços. Para cada microsserviço, a tabela mostra três dos "sinais de ouro" da SRE:

    • Tráfego: pedidos por segundo
    • Taxa de erros: uma percentagem
    • Latência – milissegundos

    Estas métricas baseiam-se no tráfego real processado pelos microsserviços. O tráfego de teste constante é enviado automaticamente para o serviço frontend por um cliente loadgenerator implementado como parte da aplicação de exemplo. O Cloud Service Mesh envia automaticamente métricas, registos e (opcionalmente) rastreios para o Google Cloud Observability.

  3. Clique no serviço frontend na tabela para ver um painel de controlo de vista geral do serviço. São apresentadas métricas adicionais para o serviço e uma visualização das ligações de entrada e saída. Também pode criar um objeto ao nível do serviço (SLO) para monitorização e alertas no serviço.

Verifique se o mTLS está ativado

Clique no link de segurança no painel para ver uma vista geral da segurança do serviço frontend. A tabela e a visualização mostram um ícone de cadeado verde para cada uma das ligações de entrada e saída entre microsserviços. Este ícone indica que a ligação está a usar mTLS para autenticação e encriptação.