Problemas com Entrada no Google Kubernetes Engine (GKE) podem impedir que o tráfego externo ou interno chegue aos seus serviços.
Use este documento para encontrar soluções para erros relacionados à classe Entrada, anotações de IP estático, tamanhos de chaves de certificado e interações com níveis de rede.
Estas informações são destinadas a administradores e operadores de plataforma e desenvolvedores de aplicativos que implantam e gerenciam aplicativos expostos usando Entrada no GKE. Para mais informações sobre os papéis comuns e tarefas de exemplo referenciados no conteúdo do Google Cloud , consulte Funções e tarefas de usuário comuns do GKE.
A anotação da classe Entrada está incorreta
Sintoma
Ao criar um Entrada, você pode receber o seguinte erro:
Missing one or more resources. If resource creation takes longer than expected, you might have an invalid configuration.
Causas possíveis
Ao criar a Entrada, talvez você tenha configurado incorretamente a classe de Entrada no manifesto.
Resolução
Para especificar uma classe de entrada, é necessário usar a anotação kubernetes.io/ingress.class. Não é possível especificar uma Entrada do GKE usando spec.ingressClassName.
- Para implantar um balanceador de carga de aplicativo interno, use a anotação
kubernetes.io/ingress.class: gce-internal. - Para implantar um balanceador de carga de aplicativo externo, use a anotação
kubernetes.io/ingress.class: gce.
A anotação do endereço IP estático está incorreta
Sintoma
Ao configurar um Entrada externo para usar um endereço IP estático, você pode receber o seguinte erro:
Error syncing to GCP: error running load balancer syncing routine: loadbalancer <Name of load balancer> does not exist: the given static IP name <Static IP> doesn't translate to an existing static IP.
Causas possíveis
- Você não criou um endereço IP externo estático antes de implantar o Entrada.
- Você não está usando a anotação correta para seu tipo de balanceador de carga.
Resolução
Se você estiver configurando uma Entrada externa:
- Reserve um endereço IP externo estático antes de implantar a entrada.
- Use a anotação
kubernetes.io/ingress.global-static-ip-nameno recurso de entrada.
Se você estiver configurando um Entrada interno:
- Reserve um endereço IP interno estático regional antes de implantar o Entrada.
- Use a anotação
kubernetes.io/ingress.regional-static-ip-nameno recurso de entrada.
O endereço IP estático já está em uso
Sintoma
Você pode receber o seguinte erro ao especificar um endereço IP estático para provisionar o recurso de entrada interno ou externo:
Error syncing to GCP: error running load balancer syncing
routine: loadbalancer <LB name> does not exist:
googleapi: Error 409: IP_IN_USE_BY_ANOTHER_RESOURCE - IP ''<IP address>'' is already being used by another resource.
Causas possíveis
O endereço IP estático já está sendo usado por outro recurso.
Erro ao desativar o HTTP e usar um certificado gerenciado pelo Google
Sintoma
Se você estiver configurando um certificado SSL gerenciado pelo Google e desativando o tráfego HTTP no Entrada, vai aparecer o seguinte erro:
Error syncing to GCP: error running load balancer syncing
routine: loadbalancer <Load Balancer name> does not exist:
googleapi: Error 404: The resource ''projects/<Project>/global/sslPolicies/<Policy name>' was not found, notFound
Causas possíveis
Não é possível usar as seguintes anotações juntas ao configurar o Entrada:
networking.gke.io/managed-certificates(para associar o certificado gerenciado pelo Google a uma Entrada)kubernetes.io/ingress.allow-http: false(para desativar o tráfego HTTP)
Resolução
Desative o tráfego HTTP somente depois que o balanceador de carga de aplicativo externo estiver totalmente programado. Você pode atualizar a entrada e adicionar a anotação kubernetes.io/ingress.allow-http: false ao manifesto.
A sub-rede somente proxy está ausente para um recurso de entrada interno
Sintoma
Ao implantar um Entrada para um balanceador de carga de aplicativo interno, talvez você veja o seguinte erro:
Error syncing to GCP: error running load balancer syncing routine:
loadbalancer <LB name> does not exist: googleapi: Error 400: Invalid value for field 'resource.target': 'https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/<Region>/targetHttpsProxies/<Target proxy>'.
An active proxy-only subnetwork is required in the same region and VPC as
the forwarding rule.
Causas possíveis
Você não criou uma sub-rede somente proxy antes de criar o recurso de entrada. Uma sub-rede somente proxy é necessária para balanceadores de carga de aplicativo internos.
Resolução
Crie uma sub-rede somente proxy antes de implantar o Entrada interno.
A chave do certificado SSL é muito grande
Sintoma
Se o tamanho da chave do certificado SSL do balanceador de carga for muito grande, você poderá receber o seguinte erro:
Error syncing to GCP: error running load balancer syncing routine: loadbalancer gky76k70-load-test-trillian-api-ingress-fliismmb does not exist: Cert creation failures - k8s2-cr-gky76k70-znz6o1pfu3tfrguy-f9be3a4abbe573f7 Error:googleapi: Error 400: The SSL key is too large., sslCertificateKeyTooLarge
Causas possíveis
Google Cloud tem um limite de 2.048 bits para chaves de certificado SSL.
Resolução
Reduza o tamanho da chave do certificado SSL para 2.048 bits ou menos.
Erro ao criar uma entrada no nível Standard
Sintoma
Se você estiver implantando um Entrada em um projeto com o nível de rede padrão do projeto definido como Standard, a seguinte mensagem de erro vai aparecer:
Error syncing to GCP: error running load balancer syncing routine: load balancer <LB Name> does not exist: googleapi: Error 400: STANDARD network tier (the project''s default network tier) is not supported: STANDARD network tier is not supported for global forwarding rule., badRequest
Resolução
Configure o nível de rede padrão do projeto como Premium.
Erro "Não encontrado" esperado para k8s-ingress-svc-acct-permission-check-probe
O controlador de Ingress realiza verificações periódicas das permissões da conta de serviço
buscando um recurso de teste do seu projeto Google Cloud . Você vai encontrar isso como um GET do BackendService global (não existente) com o nome k8s-ingress-svc-acct-permission-check-probe. Como esse recurso normalmente
não existe, a solicitação GET vai retornar "não encontrado". Isso é esperado. O controlador está verificando se a chamada de API não foi rejeitada devido a problemas de autorização. Se você criar um BackendService com o mesmo nome, o GET será bem-sucedido em vez de retornar "não encontrado".
Erros ao usar o balanceamento de carga nativo de contêiner
Use as técnicas a seguir para verificar a configuração de rede. As seções a seguir explicam como resolver problemas comuns relacionados ao balanceamento de carga nativo de contêiner.
Veja a documentação de balanceamento de carga para saber como listar grupos de endpoints de rede.
É possível encontrar o nome e as zonas do NEG correspondente a um serviço na anotação
neg-statusdo serviço. Veja a especificação do serviço com:kubectl get svc SVC_NAME -o yamlA anotação
metadata:annotations:cloud.google.com/neg-statuslista as zonas e o nome do NEG correspondente ao serviço.É possível verificar a integridade do serviço de back-end correspondente a um NEG com o seguinte comando:
gcloud compute backend-services --project PROJECT_NAME \ get-health BACKEND_SERVICE_NAME --globalO serviço de back-end tem o mesmo nome que o NEG.
Para imprimir os logs de eventos de um serviço:
kubectl describe svc SERVICE_NAMEA string do nome do serviço inclui o nome e o namespace do serviço correspondente do GKE.
Não é possível criar um cluster com IPs de alias
- Sintomas
Quando você tenta criar um cluster com IPs de alias, pode encontrar o seguinte erro:
ResponseError: code=400, message=IP aliases cannot be used with a legacy network.- Causas possíveis
Você encontrará esse erro se tentar criar um cluster com IPs de alias que também usa uma rede legada.
- Resolução
Verifique se você não criou um cluster com IPs de alias e uma rede legada ativada simultaneamente. Para mais informações sobre como usar IPs de alias, consulte Criar um cluster nativo de VPC.
O tráfego não alcança os endpoints
- Sintomas
- Erros 502/503 ou conexões rejeitadas.
- Causas possíveis
Novos endpoints geralmente se tornam acessíveis depois de anexados ao balanceador de carga, desde que respondam a verificações de integridade. Poderão ocorrer erros 502 ou conexões rejeitadas se o tráfego não conseguir alcançar os endpoints.
Erros 502 e conexões rejeitadas também podem ser causados por um contêiner que não lida com
SIGTERM. Se um contêiner não lida comSIGTERMde maneira explícita, ele encerra imediatamente e para de processar as solicitações. O balanceador de carga continua a enviar tráfego de entrada para este contêiner encerrado, causando erros.O balanceador de carga nativo do contêiner tem apenas um endpoint de back-end. Durante uma atualização gradual, o endpoint antigo é desprogramado antes que o novo endpoint seja programado.
Os pods de back-end são implantados em uma nova zona pela primeira vez depois que um balanceador de carga nativo de contêiner é provisionado. A infraestrutura do balanceador de carga é programada em uma zona quando há pelo menos um endpoint na zona. Quando um novo endpoint é adicionado a uma zona, a infraestrutura do balanceador de carga é programada e causa interrupções no serviço.
- Resolução
Configure os contêineres para lidar com
SIGTERMe continuar a responder às solicitações durante o período de carência do encerramento (30 segundos por padrão). Configure os pods para começarem a falhar nas verificações de integridade ao receberemSIGTERM. Isso envia um sinal para que o balanceador de carga pare de enviar tráfego para o pod enquanto a desprogramação do endpoint estiver em andamento.Se o aplicativo não for encerrado normalmente e parar de responder a solicitações ao receber um
SIGTERM, o hook preStop poderá ser usado para processarSIGTERMe continuar veiculando tráfego enquanto a desprogramação do endpoint estiver em andamento.lifecycle: preStop: exec: # if SIGTERM triggers a quick exit; keep serving traffic instead command: ["sleep","60"]Consulte a documentação sobre encerramento de pods.
Se o back-end do balanceador de carga tiver apenas uma instância, configure a estratégia de implantação para evitar a desmontagem da única instância antes que a nova instância seja completamente programada. Para pods de aplicativos gerenciados pela carga de trabalho
Deployment, isso pode ser feito configurando a estratégia de lançamento com o parâmetromaxUnavailableigual a0.strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0Para solucionar problemas de tráfego que não alcança os endpoints, verifique se as regras de firewall permitem o tráfego TCP de entrada para os endpoints nos intervalos
130.211.0.0/22e35.191.0.0/16. Para saber mais, consulte Como adicionar verificações de integridade na documentação do Cloud Load Balancing.Veja os serviços de back-end no seu projeto. A string de nome do serviço de back-end relevante inclui o nome e o namespace do serviço do GKE correspondente:
gcloud compute backend-services listRecupere o status de integridade do back-end do serviço correspondente:
gcloud compute backend-services get-health BACKEND_SERVICE_NAMESe nenhum back-end estiver íntegro, significa que pode haver problemas na configuração de seu firewall, sua entrada ou seu serviço.
Se alguns back-ends não estiverem íntegros por um curto período de tempo, a causa poderá ser a latência de programação de rede.
Se alguns back-ends não aparecerem na lista de serviços de back-end, a causa poderá ser a latência de programação. É possível verificar isso executando o seguinte comando, em que
NEG_NAMEé o nome do serviço de back-end. NEGs e serviços de back-end compartilham o mesmo nome:gcloud compute network-endpoint-groups list-network-endpoints NEG_NAMEVerifique se todos os endpoints esperados estão no NEG.
Se você tiver um pequeno número de back-ends (por exemplo, um pod) selecionado por um balanceador de carga nativo de contêiner, considere aumentar o número de réplicas e distribuir os pods de back-end em todas as zonas do cluster do GKE. Isso garante que a infraestrutura subjacente do balanceador de carga seja totalmente programada. Caso contrário, considere restringir os pods de back-end a uma única zona.
Se você configurar uma política de rede para o endpoint, verifique se a entrada da sub-rede somente proxy é permitida.
Lançamento interrompido
- Sintomas
- O lançamento de uma implantação atualizada é interrompido e o número de réplicas atualizadas não corresponde ao escolhido.
- Causas possíveis
As verificações de integridade da implantação estão falhando. A imagem do contêiner pode estar corrompida ou a verificação de integridade pode estar mal configurada. O lançamento da substituição dos pods está esperando até que o pod recém-iniciado passe o portão de prontidão do pod (em inglês). Isso só ocorrerá se o pod estiver respondendo às verificações de integridade do balanceador de carga. Se o pod não responder ou se a verificação de integridade estiver configurada incorretamente, as condições do portão de prontidão não serão atendidas e o lançamento não poderá continuar.
Se você estiver usando
kubectl1.13 ou superior, é possível verificar o status dos portões de prontidão de um pod com o seguinte comando:kubectl get pod POD_NAME -o wideVerifique a coluna
READINESS GATES.Essa coluna não existe em
kubectl1,12 ou inferior. Um pod marcado comoREADYpode ter um portão de prontidão falho. Para verificar isso, use o seguinte comando:kubectl get pod POD_NAME -o yamlOs portões de prontidão e os status deles são listados na saída.
- Resolução
Verifique se a imagem do contêiner na especificação do pod de implantação está funcionando corretamente e se é capaz de responder a verificações de integridade. Verifique se as verificações de integridade estão configuradas corretamente.
Erros de modo degradado
- Sintomas
A partir da versão 1.29.2-gke.1643000 do GKE, você pode receber os seguintes avisos no serviço na Análise de registros quando os NEGs são atualizados:
Entering degraded mode for NEG <service-namespace>/<service-name>-<neg-name>... due to sync err: endpoint has missing nodeName field- Causas possíveis
Esses avisos indicam que o GKE detectou configurações incorretas do endpoint durante uma atualização do NEG com base em objetos
EndpointSlice, acionando um processo de cálculo mais detalhado chamado modo degradado. O GKE continua atualizando os NEGs com base no melhor esforço, corrigindo a configuração incorreta ou excluindo os endpoints inválidos das atualizações do NEG.Alguns erros comuns são:
endpoint has missing pod/nodeName fieldendpoint corresponds to an non-existing pod/nodeendpoint information for attach/detach operation is incorrect
- Resolução
Normalmente, os estados transitórios causam esses eventos e são corrigidos por conta própria. No entanto, os eventos causados por configurações incorretas em objetos
EndpointSlicepersonalizados permanecem sem resolução. Para entender a configuração incorreta, examine os objetosEndpointSlicecorrespondentes ao serviço:kubectl get endpointslice -l kubernetes.io/service-name=<service-name>Valide cada endpoint com base no erro do evento.
Para resolver o problema, você precisa modificar manualmente os objetos
EndpointSlice. A atualização aciona os NEGs a serem atualizados. Quando a configuração incorreta não existir mais, a saída será semelhante a esta:NEG <service-namespace>/<service-name>-<neg-name>... is no longer in degraded mode
Erros ao usar certificados SSL gerenciados pelo Google
Nesta seção, apresentamos informações sobre como resolver problemas com certificados gerenciados do Google.
Verifique eventos nos recursos ManagedCertificate e Entrada
Se você exceder o número de certificados permitidos, um evento com um
motivo TooManyCertificates será adicionado ao ManagedCertificate. Verifique
os eventos em um objeto ManagedCertificate usando o comando a seguir:
kubectl describe managedcertificate CERTIFICATE_NAME
Substitua CERTIFICATE_NAME pelo nome do
ManagedCertificate.
Se você anexar um ManagedCertificate inexistente a uma Entrada, um evento com
um motivo MissingCertificate será adicionado à Entrada. Verifique os eventos em
uma Entrada usando o seguinte comando:
kubectl describe ingress INGRESS_NAME
Substitua INGRESS_NAME pelo nome do seu Ingress.
Certificado gerenciado não provisionado quando o domínio resolve para endereços IP de vários balanceadores de carga
Quando o domínio estiver resolvido para endereços IP de vários balanceadores de carga (vários
objetos de Entrada), crie um único objeto ManagedCertificate e
anexe-o a todos os objetos de Entrada. Se, em vez disso, você criar muitos
objetos ManagedCertificate e anexar cada um deles a uma Entrada
separada, a autoridade de certificação talvez não consiga verificar a propriedade do domínio,
e alguns dos certificados podem não ser provisionado. Para que a verificação seja bem-sucedida, o certificado precisa
estar visível para todos os
endereços IP onde seu domínio é resolvido.
Especificamente, quando seu domínio resolver para endereços IPv4 e IPv6 configurados
com diferentes recursos de Entrada, crie um único
recurso ManagedCertificate e anexe-o às duas entradas.
Comunicação interrompida entre certificados gerenciados do Google e a Entrada
Os certificados gerenciados se comunicam com a Entrada usando a
anotaçãoingress.gcp.kubernetes.io/pre-shared-cert Essa comunicação poderá ser
interrompida se você, por exemplo:
- Execute um processo automatizado que limpa a
anotação
ingress.gcp.kubernetes.io/pre-shared-cert. - Armazene um snapshot da Entrada e depois exclua e restaure a Entrada a partir do
snapshot. Enquanto isso, um recurso
SslCertificatelistado na anotaçãoingress.gcp.kubernetes.io/pre-shared-certpode ter sido excluído. A entrada não funcionará se faltar algum certificado anexado a ele.
Se a comunicação entre certificados gerenciados do Google e a Entrada for interrompida, exclua
o conteúdo da anotação ingress.gcp.kubernetes.io/pre-shared-cert e aguarde a
reconciliação do sistema. Para evitar recorrência, verifique se a anotação não foi
modificada ou excluída por engano.
Erros de validação ao criar um certificado gerenciado do Google
As definições de ManagedCertificate são validadas antes
da criação do objeto ManagedCertificate. Se a validação falhar, o objeto ManagedCertificate
não será criado e uma mensagem de erro será impressa. As diferentes mensagens de erro e
os motivos são explicados da seguinte maneira:
spec.domains in body should have at most 100 items
Seu manifesto ManagedCertificate lista mais de 100 domínios no campo
spec.domains. Os certificados gerenciados do Google são compatíveis com até 100 domínios.
spec.domains in body should match '^(([a-zA-Z0-9]+|[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9])\.)+[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]\.?$'
Você especificou um nome de domínio inválido ou um nome de domínio curinga no campo spec.domains. O objeto ManagedCertificate não tem suporte para
domínios curinga (por exemplo, *.example.com).
spec.domains in body should be at most 63 chars long
Você especificou um nome de domínio longo demais. Certificados gerenciados do Google são compatíveis com nomes de domínio com, no máximo, 63 caracteres.
Como atualizar manualmente um certificado gerenciado pelo Google
Para atualizar manualmente o certificado de modo que o certificado do domínio antigo continue funcionando até que o novo seja provisionado, siga estas etapas:
- Crie um
ManagedCertificatepara o novo domínio. - Adicione o nome do
ManagedCertificateà anotaçãonetworking.gke.io/managed-certificatesna entrada usando uma lista separada por vírgulas. Não remova o nome do certificado antigo. - Aguarde até que o
ManagedCertificatefique ativo. - Desanexe o certificado antigo da Entrada e exclua-o.
Quando você cria um ManagedCertificate,o Google Cloud cria um
certificado SSL gerenciado pelo Google. Não é possível atualizar o certificado. Se você
atualizar o ManagedCertificate, Google Cloud excluirá e recriará o
certificado SSL gerenciado pelo Google.
Para fornecer uma Entrada criptografada por HTTPS segura para seus clusters do GKE, consulte o exemplo de Entrada segura.
A seguir
Se você não encontrar uma solução para seu problema na documentação, consulte Receber suporte para mais ajuda, incluindo conselhos sobre os seguintes tópicos:
- Abrir um caso de suporte entrando em contato com o Cloud Customer Care.
- Receber suporte da comunidade fazendo perguntas no StackOverflow e usando a tag
google-kubernetes-enginepara pesquisar problemas semelhantes. Você também pode participar do canal do Slack#kubernetes-enginepara receber mais suporte da comunidade. - Abrir bugs ou solicitações de recursos usando o Issue Tracker público.