Por que ingress não pode ser acessado fora do cluster?
Ingresses encaminham solicitações com base nos protocolos HTTP e HTTPS da camada 7. Como uma entrada de tráfego de cluster, os ingresses usam nomes de domínio e caminhos para obter granularidades mais finas. Depois que uma entrada é adicionada a um cluster, o cluster pode falhar ao ser acessado. Esta seção descreve como localizar a falha quando uma entrada não é adicionada ou não pode ser acessada. Antes de corrigir problemas de entrada, leia as seguintes precauções e execute uma autoverificação:

- Se o endereço do host for especificado na entrada, o endereço IP não poderá ser usado para acesso.
- Verifique o grupo de segurança de nó do cluster e certifique-se de que as portas de serviço no intervalo de 30000 a 32767 estejam acessíveis a todos os segmentos de rede para tráfego de entrada.
Processo de solução de problemas
Esta seção fornece uma visão geral da solução de problemas de exceções de acesso externo de ingress, conforme mostrado na Figura 1.
- Verificar se a exceção é causada pelo ingress.
Verifique se o problema é causado pela entrada. Certifique-se de que a resolução de nome de domínio externo esteja normal, as regras do grupo de segurança estejam corretas e que o serviço e a carga de trabalho correspondentes ao ingresso estejam funcionando corretamente.
- Verificar o status de ingress.
Quando o serviço e a carga de trabalho estiverem normais, certifique-se de que o balanceador de carga do qual o ingress depende esteja normal. Se o ingress for do tipo Nginx, certifique-se de que o complemento nginx-ingress esteja normal.
- Verificar se o ingress está configurado corretamente.
Se os resultados da verificação anterior forem normais, a configuração do ingress pode estar incorreta.
- Verifique se os parâmetros para interconexão com o balanceador de carga estão corretos.
- Verifique se a configuração do Serviço está correta.
- Verifique se a configuração de encaminhamento está correta.
- Verificar certificado.
Se o acesso HTTPS é permitido no ingress, você igualmente precisa de verificar se a falha é causada pela configuração incorreta do certificado. Você pode usar o mesmo balanceador de carga para criar um ingress HTTP. Se o acesso for normal, o certificado HTTPS pode estar com defeito.
- Se a falha persistir, capture pacotes para análise ou envie um tíquete de serviço para obter ajuda.
Verificar se a exceção é causada pelo ingress
Verifique se a exceção de acesso é causada pelo ingress. Se ocorrer a exceção de resolução de nome de domínio, erro de regra de grupo de segurança, exceção de serviço ou exceção de carga de trabalho, o acesso de ingress poderá falhar.
A seguinte sequência de verificação está em conformidade com as regras de fora para dentro:
- Verifique se as regras de resolução de nome de domínio ou grupo de segurança são normais.
- Execute o seguinte comando para verificar se os conjuntos de registos do nome de domínio têm efeito no servidor do DNS autoritativo:
nslookup -qt= Type Domain name Authoritative DNS address
- Verifique as regras do grupo de segurança dos nós do cluster e certifique-se de que as portas de serviço no intervalo 30000–32767 estejam acessíveis a todos os segmentos de rede para tráfego de entrada. Para obter detalhes sobre como fortalecer o grupo de segurança, consulte Configuração de regras do grupo de segurança do cluster.
- Execute o seguinte comando para verificar se os conjuntos de registos do nome de domínio têm efeito no servidor do DNS autoritativo:
- Verifique se o Serviço pode acessar serviços no contêiner.
Você pode criar um pod no cluster e usar o endereço IP do cluster para acessar o Serviço. Se o tipo de Serviço for NodePort, também pode utilizar EIP:Port para aceder ao serviço através da Internet.
- Use kubectl para se conectar ao cluster e consultar o Serviço no cluster.
# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.247.0.1 <none> 443/TCP 34m nginx ClusterIP 10.247.138.227 <none> 80/TCP 30m
- Crie um pod e faça logon no contêiner.
kubectl run -i --tty --image nginx:alpine test --rm /bin/sh
- Execute o comando curl para acessar ClusterIP address:Port do Serviço para verificar se o Serviço no cluster está acessível.
curl 10.247.138.227:80
Se o Serviço pode ser acessado, o status da carga de trabalho de back-end é normal. Pode-se determinar preliminarmente que a exceção é causada pelo ingress. Para mais detalhes, consulte Verificar o status de ingress.
Se o acesso ao Serviço for anormal, verifique o status da carga de trabalho para determinar a causa.
- Use kubectl para se conectar ao cluster e consultar o Serviço no cluster.
- Verifique se o status da carga de trabalho é normal.
Se a carga de trabalho for normal, mas o Serviço não puder ser acessado, a exceção pode ser causada pelo Serviço. Verifique a configuração do Serviço. Por exemplo, verifique se a porta do contêiner está configurada corretamente para uma porta de serviço aberta do contêiner.
Se a carga de trabalho for normal, mas o resultado do acesso não for o esperado, verifique o código de serviço em execução no contêiner.
Verificar o status de ingress
O CCE suporta dois tipos de ingresses. O Ngnix Ingress Controller é fornecido pela comunidade de código aberto e precisa ser mantido pela instalação do complemento no cluster. O ELB Ingress Controller é executado no nó principal e é mantido por uma equipe dedicada da Huawei Cloud.
- Se você usar um ingress de Nginx, precisará instalar o complemento nginx-ingress no cluster. Se você usar uma ingress de ELB, pule esta etapa.
Vá para Add-ons > Add-ons Installed e verifique se o complemento nginx-ingress está em execução. Certifique-se de que os recursos do nó sejam suficientes no cluster. Caso contrário, a instância de complemento não pode ser agendada.
- Vá para o console do ELB para verificar o status do ELB.
- Ingress de ELB
A porta de acesso pode ser personalizada. Verifique se o ouvinte e o grupo de servidores back-end criados no ELB não foram deletados ou modificados.
Ao criar uma entrada ELB, você pode escolher Auto Create no console para criar automaticamente um balanceador de carga. Não modifique o balanceador de carga. Caso contrário, exceções de entrada podem ser causadas.
- Ingress de Nginx
As portas de acesso são fixas em 80 e 443. Portas personalizadas não são compatíveis. A instalação do complemento nginx-ingress ocupa as portas 80 e 443. Não as elimine. Caso contrário, você precisará reinstalar o complemento.
Você também pode determinar se a falha é causada pelo balanceador de carga com base no código de erro. Se o código de erro a seguir for exibido, há uma alta probabilidade de que a falha seja causada pelo balanceador de carga. Nesse caso, você precisa prestar atenção especial ao balanceador de carga.
- Ingress de ELB
Verificar se o ingress está configurado corretamente
Se os itens de verificação anteriores forem normais, verifique se a exceção é causada por configurações de parâmetros. Ao usar o kubectl para criar um ingress, um grande número de parâmetros precisa ser definido, o que é propenso a erros. Recomendamos que você use o console para criar ingresses e definir parâmetros conforme necessário para filtrar automaticamente balanceadores de carga e Serviços que não atendam aos requisitos. Isso evita efetivamente formatos incorretos ou falta de parâmetros-chave.
- Verifique se os parâmetros para interconexão com o balanceador de carga estão corretos.
Balanceadores de carga são definidos por parâmetros no campo annotations. O Kubernetes não verifica os parâmetros no campo annotations ao criar recursos. Se os parâmetros-chave estiverem incorretos ou ausentes, um ingress pode ser criada, mas não pode ser acessada.
Os seguintes problemas ocorrem com frequência:
- O balanceador de carga do ELB interconectado não está na mesma VPC que o cluster.
- Principais campos kubernetes.io/elb.id, kubernetes.io/elb.ip, kubernetes.io/ingress.class e kubernetes.io/elb.port nas annotations estão faltando quando um ingress do ELB é adicionada para conexão a um balanceador de carga do ELB existente.
- Quando você adiciona um ingress de Nginx, o complemento nginx-ingress não é instalado. Como resultado, a conexão de ELB não está disponível.
- Quando você adiciona um ingress de Nginx, os campos-chave kubernetes.io/ingress.class e kubernetes.io/elb.port estão faltando em annotations.
- Quando você adiciona um ingress de Nginx, o campo kubernetes.io/elb.port não suporta portas personalizadas. Se HTTP for usado, o valor é fixado em 80. Se HTTPS for usado, o valor é fixado em 443.
- Verifique se o Serviço está configurado corretamente.
- Verifique se o tipo de Serviço conectado ao ingress está correto. Para obter detalhes sobre os tipos de Serviço suportados pelo ingress, consulte Tabela 1.
Tabela 1 Tipos de serviço suportados pelo ingress Tipo de ingress
Tipo de acesso
ClusterIP
NodePort
Ingress de ELB
Roteamento de balanceamento de carga
Não suportado
Suportado
Roteamento de balanceamento de carga de ENI
Suportado
Não suportado
Ingress de Nginx
Roteamento de balanceamento de carga
Suportado
Suportado
Roteamento de balanceamento de carga de ENI
Suportado
Não suportado
- Verifique se o número da porta de acesso do Serviço está correto. O número da porta de acesso (campo port) do Serviço deve ser diferente do número da porta do contêiner (campo targetPort).
- Verifique se o tipo de Serviço conectado ao ingress está correto. Para obter detalhes sobre os tipos de Serviço suportados pelo ingress, consulte Tabela 1.
- Verifique se a configuração de encaminhamento está correta.
- O URL de encaminhamento adicionado deve existir na aplicação back-end. Caso contrário, o encaminhamento falha.
Por exemplo, o URL de acesso padrão da aplicação Nginx é /usr/share/nginx/html. Ao adicionar /test à política de encaminhamento de entrada, certifique-se de que sua aplicação Nginx contenha o mesmo URL, ou seja, /usr/share/nginx/html/test, caso contrário, 404 será retornado.
Ao usar o Nginx Ingress Controller, você pode adicionar o comentário de rewrite ao campo annotations para redirecionamento para reescrever o caminho que não existe no Serviço para evitar o erro de que o caminho de acesso não existe. Para obter detalhes, consulte Reescrita.
- Se o nome de domínio (host) for especificado quando um ingress for criado, o ingress não poderá ser acessado usando um endereço IP.
- O URL de encaminhamento adicionado deve existir na aplicação back-end. Caso contrário, o encaminhamento falha.
Verificar certificado
O tipo de certificado secreto de ingress do CCE é IngressTLS ou kubernetes.io/tls. Se o tipo de certificado estiver incorreto, o ingress não poderá criar um ouvinte no balanceador de carga. Como resultado, o acesso de ingress torna-se anormal.
- Remova os parâmetros HTTPS do YAML e crie um ingress HTTP para verificar se a entrada pode ser acessada.
Se o acesso HTTP for normal, verifique se o certificado secreto HTTPS está correto.
- Verifique se o tipo de segredo está correto. Verifique se o tipo secreto é IngressTLS ou kubernetes.io/tls.
# kubectl get secret NAME TYPE DATA AGE ingress IngressTLS 2 36m
- Crie certificados de teste para corrigir a falha do certificado.
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN={YOUR_HOST}/O={YOUR_HOST}"
- Use os certificados de teste tls.key e tls.crt para criar um segredo e verificar se o segredo pode ser acessado normalmente. A seguir, descrevemos como criar um segredo IngressTLS.
O exemplo a seguir mostra como criar um segredo IngressTLS usando kubectl:
kind: Secret apiVersion: v1 type: IngressTLS metadata: name: ingress namespace: default data: tls.crt: LS0tLS1CRU*****FURS0tLS0t tls.key: LS0tLS1CRU*****VZLS0tLS0=
Nas informações anteriores, tls.crt e tls.key são apenas exemplos. Substitua-os pelos arquivos reais. Os valores de tls.crt e tls.key são o conteúdo criptografado usando Base64.