Como resolver problemas gerenciados do Cloud Service Mesh

Este documento explica problemas comuns do Cloud Service Mesh e como resolvê-los, como quando um pod é injetado com istio.istio-system, a ferramenta de instalação gera erros como códigos de status HTTP 400 e erros de associação a clusters.

Se você precisar de mais ajuda para resolver problemas do Cloud Service Mesh, consulte Como receber suporte.

O status das revisões é considerado não íntegros

É possível encontrar um erro Revision(s) reporting unhealthy genérico se o agente de serviço do Cloud Service Mesh gerenciado não tiver o papel necessário do Identity and Access Management (IAM). Geralmente, isso ocorre quando o papel é revogado pelo Terraform, pelo Puppet ou pela reconfiguração de CI/CD.

As etapas necessárias para solucionar esse erro dependem do uso do console do Google Cloud ou da Google Cloud CLI.

Console do Google Cloud

  1. No console do Google Cloud, acesse o IAM e administrador > IAM.

  2. Selecione Incluir concessões de papel fornecidas pelo Google.

  3. Revise a lista Principal.

    Se o agente de serviço com o papel do IAM necessário estiver na lista, ele estará configurado corretamente.

    Se a lista não incluir o agente de serviço e a função necessária, continue para a próxima etapa.

  4. Conceda o papel de agente de serviço do Anthos Service Mesh (roles/anthosservicemesh.serviceAgent) ao agente de serviço do Cloud Service Mesh no projeto. Para mais instruções, consulte Gerenciar o acesso a projetos, pastas e organizações.

Google Cloud CLI

  1. Na Google Cloud CLI, execute o comando a seguir para verificar se o papel do IAM necessário foi concedido:

    gcloud projects get-iam-policy PROJECT_ID  \
    --flatten="bindings[].members" \
    --filter="bindings.members:serviceAccount:service-PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com AND bindings.role:roles/anthosservicemesh.serviceAgent" \
    --format='table(bindings.role)'
    
  2. Revise a ROLE lista.

    Se visualizar um papel na lista, ele está configurado corretamente.

    Se nenhum papel for exibido na lista, o papel obrigatório foi revogado.

  3. Para conceder o papel necessário ao agente de serviço, execute o seguinte comando:

     gcloud projects add-iam-policy-binding PROJECT_ID \
     --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com" \
     --role="roles/anthosservicemesh.serviceAgent"
    

A ferramenta de instalação gera erros HTTP 400

A ferramenta de instalação pode gerar erros HTTP 400 como este:

HealthCheckContainerError, message: Cloud Run error: Container failed to start.
Failed to start and then listen on the port defined by the PORT environment
variable. Logs for this revision might contain more information.

Isso pode ocorrer se você não tiver ativado a identidade da carga de trabalho no cluster do Kubernetes, o que pode ser feito usando o seguinte comando:

export CLUSTER_NAME=...
export PROJECT_ID=...
export LOCATION=...
gcloud container clusters update $CLUSTER_NAME --zone $LOCATION \
    --workload-pool=$PROJECT_ID.svc.id.goog

Estado do plano de dados gerenciado

O comando a seguir exibe o status do plano de dados gerenciado:

gcloud container fleet mesh describe --project PROJECT_ID

A tabela a seguir lista todos os estados possíveis do plano de dados gerenciados:

Estado Code Descrição
ACTIVE OK O plano de dados gerenciado está em execução normalmente.
DISABLED DISABLED O plano de dados gerenciado se encontra nesse estado se nenhum namespace ou revisão está configurado para usá-lo. Siga as instruções para ativar o Cloud Service Mesh gerenciado pela API Fleet ou ativar o plano de dados gerenciado após o provisionamento do Cloud Service Mesh gerenciado com asmcli. Os relatórios de status do plano de dados gerenciado só estarão disponíveis se você tiver ativado o plano de dados gerenciado anotando um namespace ou revisão. Inserir anotações individuais faz com que esses pods sejam gerenciados, mas com um estado de recurso DISABLED se nenhum namespace ou revisão for anotado.
FAILED_PRECONDITION MANAGED_CONTROL_PLANE_REQUIRED O plano de dados gerenciado exige um plano de controle gerenciado do Cloud Service Mesh.
PROVISIONING PROVISIONING O plano de dados gerenciado está sendo provisionado. Se esse estado persistir por mais de 10 minutos, é provável que tenha ocorrido um erro. Entre em contato com o suporte.
STALLED INTERNAL_ERROR O plano de dados gerenciado está impedido de operar devido a uma condição de erro interna. Se o problema persistir, entre em contato com o suporte.
NEEDS_ATTENTION UPGRADE_FAILURES O plano de dados gerenciado exige intervenção manual para que o serviço volte ao estado normal. Para mais informações e como resolver esse problema, consulte o estado NEEDS_ATTENTION.

NEEDS_ATTENTION estado

Se o comando gcloud container fleet mesh describe mostrar que o estado do plano de dados gerenciado está no estado NEEDS_ATTENTION e o código é UPGRADE_FAILURES, significa que o plano de dados gerenciado não fez o upgrade de determinadas cargas de trabalho. Essas cargas de trabalho serão rotuladas com dataplane-upgrade: failed pelo serviço do plano de dados gerenciado para uma análise mais detalhada. Os proxies precisam ser reiniciados manualmente para serem atualizados. Para ver a lista de pods que exigem a atenção, execute o seguinte comando:

kubectl get pods --all-namespaces -l dataplane-upgrade=failed

Erro de associação do cluster (nenhum provedor de identidade especificado)

A ferramenta de instalação pode falhar com erros de associação de cluster, como:

asmcli: [ERROR]: Cluster has memberships.hub.gke.io CRD but no identity
provider specified. Please ensure that an identity provider is available for the
registered cluster.

O erro pode ocorrer se você não tiver a identidade da carga de trabalho do GKE ativada antes de registrar o cluster. É possível registrar novamente o cluster na linha de comando usando o comando gcloud container fleet memberships register --enable-workload-identity.

Verificar o status do plano de controle gerenciado

Para verificar o status do plano de controle gerenciado, execute gcloud container fleet mesh describe --project FLEET_PROJECT_ID.

Na resposta, o campo membershipStates[].servicemesh.controlPlaneManagement.details pode explicar o erro específico.

Se você precisar de mais detalhes, verifique o recurso personalizado ControlPlaneRevision no cluster, que é atualizado quando o plano de controle gerenciado é provisionado ou falha no provisionamento.

Para inspecionar o status do recurso, substitua NAME pelo valor correspondente a cada canal: asm-managed, asm-managed-stable ou asm-managed-rapid.

kubectl describe controlplanerevision NAME -n istio-system

A resposta é semelhante a:

    Name:         asm-managed

    …

    Status:
      Conditions:
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               The provisioning process has completed successfully
        Reason:                Provisioned
        Status:                True
        Type:                  Reconciled
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               Provisioning has finished
        Reason:                ProvisioningFinished
        Status:                True
        Type:                  ProvisioningFinished
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               Provisioning has not stalled
        Reason:                NotStalled
        Status:                False
        Type:                  Stalled

A condição Reconciled determina se o plano de controle gerenciado está em execução corretamente. Se true, o plano de controle está sendo executado. Stalled determina se o processo de provisionamento do plano de controle gerenciado encontrou um erro. Se Stalled, o campo Message conterá mais informações sobre o erro específico. Consulte Códigos interrompidos para ver mais informações sobre possíveis erros.

Códigos interrompidos da ControlPlaneRevision

Há vários motivos para a condição Stalled se tornar verdadeira no status ControlPlaneRevisions.

Motivo Message Descrição
PreconditionFailed Só é possível usar assinaturas do GKE, mas ${CLUSTER_NAME} não é um cluster do GKE. O cluster atual não parece ser um cluster do GKE. O plano de controle gerenciado só funciona em clusters do GKE.
Nome de ControlPlaneRevision incompatível: ${NAME} O nome do ControlPlaneRevision precisa ser um dos seguintes:
  • asm-managed
  • asm-managed-rapid
  • asm-managed-stable
Namespace de ControlPlaneRevision incompatível: ${NAMESPACE} O namespace de ControlPlaneRevision precisa ser istio-system.
O canal ${CHANNEL} não é compatível com a versão ControlPlaneRevision com o nome${NAME}. Esperados ${OTHER_CHANNEL} O nome do ControlPlaneRevision precisa corresponder ao canal do ControlPlaneRevision com o seguinte:
  • asm-managed -> normal
  • asm-managed-rapid -> rápido
  • asm-managed-stable -> estável
O canal não pode ser omitido ou ficar em branco Channel é um campo obrigatório no ControlPlaneRevision. Ele não foi encontrado ou está em branco no recurso personalizado.
Tipo de revisão do plano de controle incompatível: ${TYPE} managed_service é o único campo de permissão para o campo ControlPlaneRevisionType.
Versão incompatível do Kubernetes: ${VERSION} As versões 1.15+ do Kubernetes são compatíveis.
A identidade da carga de trabalho não está ativada Ative a identidade da carga de trabalho no cluster.
Pool de carga de trabalho incompatível: ${POOL} O pool de carga de trabalho precisa estar no formato ${PROJECT_ID}.svc.id.goog.
ProvisioningFailed Ocorreu um erro ao atualizar os recursos do cluster O Google não conseguiu atualizar os recursos no cluster, como CRDs e webhooks.
MutatingWebhookConfiguration "istiod-asm-managed" contém um webhook com o URL ${EXISTING_URL}, mas é esperado ${PENDING_URL} O Google não substituirá os webhooks atuais para evitar falhas na instalação. Atualize manualmente se for o comportamento desejado.
ValidatingWebhookConfiguration ${NAME} contém um webhook com o URL ${EXISTING_URL}, mas é esperado ${PENDING_URL} O Google não substituirá os webhooks atuais para evitar falhas na instalação. Atualize manualmente se for o comportamento desejado.

O Cloud Service Mesh gerenciado não consegue se conectar ao cluster do GKE

Entre junho de 2022 e setembro de 2022, o Google concluiu o trabalho de segurança relacionado a redes autorizadas e Cloud Run e Cloud Functions no Google Kubernetes Engine (GKE). Os projetos que usavam o Cloud Service Mesh gerenciado, mas pararam de usá-lo antes da migração, não têm a API necessária para a comunicação entre o Cloud Run e o GKE.

Nesse cenário, o provisionamento gerenciado do Cloud Service Mesh falhará e o Cloud Logging exibirá a seguinte mensagem de erro:

Connect Gateway API has not been used in project [*PROJECT_NUMBER*] before or it is disabled.
Enable it by visiting https://console.developers.google.com/apis/api/connectgateway.googleapis.com/overview?project=[*PROJECT_NUMBER*] then retry.
If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

Filtre esta mensagem usando a seguinte consulta:

resource.type="istio_control_plane"
resource.labels.project_id=[*PROJECT_ID*]
resource.labels.location=[*REGION*]
severity=ERROR
jsonPayload.message=~"Connect Gateway API has not been used in project"

Enquanto isso, a injeção do sidecar e a implantação de recursos personalizados do Kubernetes relacionados ao Cloud Service Mesh também falharão e o Cloud Logging exibirá a seguinte mensagem de aviso:

Error creating: Internal error occurred: failed calling webhook
"rev.namespace.sidecar-injector.istio.io": failed to call webhook: an error on
the server ("unknown") has prevented the request from succeeding.

Filtre esta mensagem usando a seguinte consulta:

resource.type="k8s_cluster"
resource.labels.project_id=[*PROJECT_ID*]
resource.labels.location=[*REGION*]
resource.labels.cluster_name=[*CLUSTER_NAME*]
severity=WARNING
jsonPayload.message=~"Internal error occurred: failed calling webhook"

Para resolver o problema:

  1. Ative a API connectgateway necessária.

     gcloud services enable connectgateway.googleapis.com --project=[*PROJECT_ID*]
    
  2. Reinstale o Cloud Service Mesh gerenciado.

  3. Execute uma reinicialização gradual nas cargas de trabalho.

As APIs do Google Cloud não estão ativadas

Se a frota gerenciada do Cloud Service Mesh usar a TRAFFIC_DIRECTOR implementação do plano de controle, algumas APIs precisarão ser ativadas.

  1. Ative todas as APIs necessárias, incluindo aquelas listadas como "Pode ser desativada" quando não estiver usando a rede gerenciada do Cloud Service.

    gcloud services enable --project=[*PROJECT_ID*] \
        trafficdirector.googleapis.com \
        networkservices.googleapis.com \
        networksecurity.googleapis.com
    
  2. Verifique se você não tem ferramentas automatizadas que reverterão essa mudança. Se o erro se repetir, atualize todas as configurações ou listas de permissões relevantes.

A federação de identidade da carga de trabalho do NodePool para o GKE está desativada

O comando a seguir mostra o estado do Cloud Service Mesh gerenciado:

    gcloud container fleet mesh describe

Você pode encontrar o código de erro NODEPOOL_WORKLOAD_IDENTITY_FEDERATION_REQUIRED no campo Conditions da sua assinatura:

    membershipStates:
      projects/test-project/locations/us-central1/memberships/my-membership:
        servicemesh:
          conditions:
          - code: NODEPOOL_WORKLOAD_IDENTITY_FEDERATION_REQUIRED
            details: One or more node pools have workload identity federation disabled.
            documentationLink: https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity
            severity: ERROR
          controlPlaneManagement:
            details:
            - code: REVISION_FAILED_PRECONDITION
              details: Required in-cluster components are not ready. This will be retried
                within 15 minutes.
            implementation: TRAFFIC_DIRECTOR
            state: FAILED_PRECONDITION

Esse erro aparece se o cluster do GKE não tiver a Federação de Identidade da Carga de Trabalho ativada em todos os pools de nós desse cluster, já que esse é um pré-requisito para a instalação do Cloud Service Mesh.

Para resolver essa mensagem de erro, siga as instruções para Ativar a federação de identidade da carga de trabalho em todos os pools de nós. A ativação pode variar de acordo com o caso específico do cluster.

Após a ativação, a mensagem de erro será removida automaticamente, e o cluster voltará ao estado ACTIVE. Se o problema persistir e você precisar de mais ajuda, consulte Como receber suporte.