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
Na Google Cloud consola, navegue para IAM e administrador > IAM.
Selecione Incluir concessões de funções fornecidas pela Google.
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.
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
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)'
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.
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 ControlPlaneRevision
recurso 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:
|
|
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:
|
|
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:
Ative a API
connectgateway
necessária:gcloud services enable connectgateway.googleapis.com --project=[*PROJECT_ID*]
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.
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
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.
A federação de identidade da força de trabalho do NodePool para o GKE está desativada
O comando seguinte apresenta o estado da malha de serviços na nuvem gerida:
gcloud container fleet mesh describe
Pode ver o código de erro NODEPOOL_WORKLOAD_IDENTITY_FEDERATION_REQUIRED
no campo Conditions
da sua subscrição:
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
Este erro é apresentado se o cluster do GKE não tiver a Workload Identity Federation ativada em todos os node pools desse cluster, uma vez que este é um pré-requisito para a instalação do Cloud Service Mesh.
Para resolver esta mensagem de erro, tem de seguir as instruções para ativar a Workload Identity Federation em todos os conjuntos de nós. Tenha em atenção que a ativação pode variar consoante o seu caso de cluster específico.
Após a ativação, a mensagem de erro deve ser removida automaticamente e o cluster deve voltar ao estado ACTIVE
. Se o problema persistir e precisar de
assistência adicional, consulte o artigo Receber apoio técnico.