Resolver problemas do Cloud Service Mesh gerido

Este documento explica os 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 estado HTTP 400 e erros de associação ao cluster.

Se precisar de assistência adicional para resolver problemas do Cloud Service Mesh, consulte o artigo Receber apoio técnico.

As revisões são comunicadas como erro não saudável

Pode ver um erro genérico Revision(s) reporting unhealthy se o agente do serviço para a malha de serviços na nuvem gerida não tiver a função de gestão de identidade e acesso (IAM) necessária. Geralmente, isto ocorre quando a função é revogada pelo Terraform, Puppet ou reconfiguração de CI/CD.

Os passos necessários para resolver este erro dependem de estar a usar a consola ou a Google Cloud CLI. Google Cloud

Google Cloud consola

  1. Na Google Cloud consola, navegue para IAM e administrador > IAM.

  2. Selecione Incluir concessões de funções fornecidas pela Google.

  3. Reveja a lista de diretores.

    Se vir o agente de serviço com a função de IAM necessária na lista, significa que está configurado corretamente.

    Se a lista não incluir o agente de serviço e a função necessária, então avance para o passo seguinte.

  4. Conceda a função de agente de serviço do Anthos Service Mesh (roles/anthosservicemesh.serviceAgent) ao agente de serviço do Cloud Service Mesh no projeto. Para ver instruções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

CLI do Google Cloud

  1. Na CLI do Google Cloud, execute o seguinte comando para verificar se a função de IAM necessária foi concedida:

    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. Reveja a lista ROLE.

    Se vir funções na lista, significa que está configurado corretamente.

    Se não vir nenhuma função na lista, significa que a função necessária foi revogada.

  3. Para conceder a função necessária ao agente do 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 os seguintes:

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.

O erro pode ocorrer se não tiver ativado a identidade da carga de trabalho no cluster do Kubernetes, o que pode fazer através do 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 gerido

O comando seguinte apresenta o estado do plano de dados gerido:

gcloud container fleet mesh describe --project PROJECT_ID

A tabela seguinte apresenta todos os estados possíveis do plano de dados gerido:

Estado Código Descrição
ACTIVE OK O plano de dados gerido está a ser executado normalmente.
DISABLED DISABLED O plano de dados gerido está neste estado se não estiver configurado nenhum espaço de nomes ou revisão para o usar. Siga as instruções para ativar a malha de serviços na nuvem gerida através da API Fleet ou ativar o plano de dados gerido após o aprovisionamento da malha de serviços na nuvem gerida com asmcli. Tenha em atenção que os relatórios do estado do plano de dados gerido só estão disponíveis se tiver ativado o plano de dados gerido ao anotar um espaço de nomes ou uma revisão. A anotação de pods individuais faz com que esses pods sejam geridos, mas com um estado de funcionalidade de DISABLED se não forem anotados espaços de nomes nem revisões.
FAILED_PRECONDITION MANAGED_CONTROL_PLANE_REQUIRED O plano de dados gerido requer um plano de controlo do Cloud Service Mesh gerido ativo.
PROVISIONING PROVISIONING O plano de dados gerido está a ser aprovisionado. Se este estado persistir durante mais de 10 minutos, é provável que tenha ocorrido um erro e deve contactar o apoio técnico.
STALLED INTERNAL_ERROR O plano de dados gerido está bloqueado e não pode funcionar devido a uma condição de erro interno. Se o problema persistir, contacte o apoio técnico.
NEEDS_ATTENTION UPGRADE_FAILURES O plano de dados gerido requer intervenção manual para repor o serviço ao estado normal. Para mais informações e como resolver este 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 gerido está no estado NEEDS_ATTENTION e o código for UPGRADE_FAILURES, significa que o plano de dados gerido não conseguiu atualizar determinadas cargas de trabalho. Estas cargas de trabalho vão ser etiquetadas com dataplane-upgrade: failed pelo serviço de plano de dados gerido para análise adicional. Os proxies têm de ser reiniciados manualmente para serem atualizados. Para ver a lista de pods que requerem atenção, execute o seguinte comando:

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

Erro de membro do cluster (nenhum fornecedor de identidade especificado)

A ferramenta de instalação pode falhar com erros de membro do cluster, como os seguintes:

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 não tiver o Workload Identity do GKE ativado antes de registar o cluster. Pode voltar a registar o cluster na linha de comandos com o comando gcloud container fleet memberships register --enable-workload-identity.

Verifique o estado do plano de controlo gerido

Para verificar o estado do plano de controlo gerido, execute o comando gcloud container fleet mesh describe --project FLEET_PROJECT_ID.

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

Se precisar de mais detalhes, verifique o ControlPlaneRevisionrecurso personalizado no cluster, que é atualizado quando o plano de controlo gerido é aprovisionado ou falha no aprovisionamento.

Para inspecionar o estado 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

O resultado é semelhante ao seguinte:

    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 controlo gerido está a ser executado corretamente. Se true, o plano de controlo está a ser executado com êxito. Stalled determina se o processo de aprovisionamento do plano de controlo gerido encontrou um erro. Se Stalled, o campo Message contém mais informações acerca do erro específico. Consulte o artigo Códigos parados para mais informações sobre possíveis erros.

ControlPlaneRevision Stalled Codes

Existem vários motivos pelos quais a condição Stalled pode tornar-se verdadeira no estado ControlPlaneRevisions.

Motivo Mensagem Descrição
PreconditionFailed Apenas são suportadas associações 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 controlo gerido só funciona em clusters do GKE.
Nome de ControlPlaneRevision não suportado: ${NAME} O nome de ControlPlaneRevision tem de ser um dos seguintes:
  • asm-managed
  • asm-managed-rapid
  • asm-managed-stable
Namespace ControlPlaneRevision não suportado: ${NAMESPACE} O espaço de nomes da ControlPlaneRevision tem de ser istio-system.
Canal não suportado ${CHANNEL} para ControlPlaneRevision com o nome${NAME}. Valor esperado: ${OTHER_CHANNEL} O nome da ControlPlaneRevision tem de corresponder ao canal da ControlPlaneRevision com o seguinte:
  • asm-managed -> regular
  • asm-managed-rapid -> rapid
  • asm-managed-stable -> stable
O canal não pode ser omitido nem estar em branco Channel é um campo obrigatório no ControlPlaneRevision. Está em falta ou em branco no recurso personalizado.
Tipo de revisão do plano de controlo não suportado: ${TYPE} managed_service é o único campo permitido para o campo ControlPlaneRevisionType.
Versão do Kubernetes não suportada: ${VERSION} As versões 1.15 e posteriores do Kubernetes são suportadas.
O Workload Identity não está ativado Ative o Workload Identity no seu cluster.
Workload Identity Pool não suportado: ${POOL} O pool de carga de trabalho tem de ter o formato ${PROJECT_ID}.svc.id.goog.
ProvisioningFailed Ocorreu um erro ao atualizar os recursos do cluster A Google não conseguiu atualizar os seus recursos no cluster, como CRDs e webhooks.
MutatingWebhookConfiguration "istiod-asm-managed" contém um webhook com o URL ${EXISTING_URL}, mas esperava-se ${EXPECTED_URL} A Google não substitui os webhooks existentes para evitar danificar a sua instalação. Atualize esta opção manualmente se for o comportamento pretendido.
ValidatingWebhookConfiguration ${NAME} contém um webhook com o URL ${EXISTING_URL}, mas esperava ${EXPECTED_URL} A Google não substitui os webhooks existentes para evitar danificar a sua instalação. Atualize esta opção manualmente se for o comportamento pretendido.

O Managed Cloud Service Mesh não consegue estabelecer ligação ao cluster do GKE

Entre junho de 2022 e setembro de 2022, a Google concluiu o trabalho de segurança relacionado com redes autorizadas, o Cloud Run e as funções do Cloud Run no Google Kubernetes Engine (GKE). Os projetos que usaram anteriormente a malha de serviços do Google Cloud, mas deixaram de a usar antes da migração, não têm a API necessária para a comunicação entre o Cloud Run e o GKE.

Neste cenário, o aprovisionamento do Cloud Service Mesh gerido falha e o Cloud Logging apresenta 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 com 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"

Entretanto, a injeção de sidecar e a implementação de quaisquer recursos personalizados do Kubernetes relacionados com o Cloud Service Mesh também falham e o Cloud Logging apresenta 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 com 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 gerido.

  3. Faça um reinício contínuo nas cargas de trabalho.

As APIsGoogle Cloud não estão ativadas

Se a sua frota do Cloud Service Mesh gerida usar a TRAFFIC_DIRECTOR implementação do plano de controlo, determinadas APIs têm de ser ativadas.

  1. Ative todas as APIs necessárias, incluindo as listadas como "Pode ser desativada" quando não estiver a usar o Cloud Service Mesh gerido.

    gcloud services enable --project=[*PROJECT_ID*] \
        trafficdirector.googleapis.com \
        networkservices.googleapis.com \
        networksecurity.googleapis.com
    
  2. Certifique-se de que não tem ferramentas automatizadas que revertam esta alteração. Se o erro ocorrer novamente, atualize as configurações ou as listas de autorizações relevantes.