Diagnostique e resolva problemas quando serviços com Type=LoadBalancer apresentarem erros de CLB ou falhas de acesso. Consulte Observações sobre balanceamento de carga de serviço.
Pré-requisitos
A versão do componente CCM deve ser V1.9.3.276-g372aa98-aliyun ou posterior (instruções de atualização, notas de versão).
Processo de diagnóstico
Identifique a origem do problema no serviço LoadBalancer.
-
Identifique o serviço associado à instância de CLB. Substitua
XXX.XXX.XXX.XXXpelo endereço IP do balanceador de carga.kubectl get svc -A | grep -i LoadBalancer | grep {XXX.XXX.XXX.XXX}Um serviço íntegro exibe uma saída semelhante a:
default my-svc LoadBalancer 10.x.x.x XXX.XXX.XXX.XXX 80:32xxx/TCP 5d -
Execute o comando abaixo para verificar se há eventos de erro no serviço.
kubectl -n {your-namespace} describe svc {your-svc-name}Verifique a seção Events na parte inferior. Exemplo de saída de erro:
Events: Type Reason Age From Message ---- ------ --- ---- ------- Warning SyncLoadBalancerFailed 2m service-controller <error message here>Caso existam eventos de erro, localize a mensagem correspondente em Eventos de erro de serviço e soluções.
Se não houver eventos de erro, utilize o guia baseado em sintomas em Métodos de solução de problemas.
Eventos de erro de serviço e soluções
Execute kubectl -n {your-namespace} describe svc {your-svc-name} e compare a mensagem de erro na seção Events com a tabela abaixo.
| Mensagem de erro | Causa | Solução |
|---|---|---|
The backend server number has reached to the quota limit of this load balancers |
A instância de CLB atingiu a cota máxima de 200 servidores de back-end. |
Adote uma das seguintes medidas: 1. Solicite um aumento de cota na
página SLB Quota Management
. 2. Defina externalTrafficPolicy: Local
para reduzir a quantidade de back-ends. No modo Cluster, adicione a anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-label para limitar os nós de back-end. 3. Crie uma nova instância de CLB.
|
The loadbalancer does not support backend servers of eni type |
Instâncias compartilhadas de CLB não suportam back-ends do tipo Elastic Network Interface (ENI). | Adicione a anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small" para utilizar uma instância de CLB de alto desempenho. Verifique a compatibilidade da versão do CCM. Consulte Usar anotações para configurar uma instância de Classic Load Balancer (CLB). |
There are no available nodes for LoadBalancer |
A instância de CLB não possui servidores de back-end. | Verifique o status do pod: <br>- Se nenhum pod corresponder ao serviço, adicione um. <br>- Caso o pod esteja com falha, resolva o problema. Consulte Solucionar problemas de pods. <br>- Se o pod estiver em execução, mas não aparecer como back-end, verifique se ele está em um nó mestre e mova-o para um nó worker. |
alicloud: not able to find loadbalancer named [%s] in openapi, but it's defined in service.loaderbalancer.ingress... ou alicloud: can not find loadbalancer, but it's defined in service |
Não foi possível localizar a instância de CLB referenciada pelo serviço. | Pesquise a instância de CLB no console Server Load Balancer usando o EXTERNAL-IP do serviço. <br>- Se o CLB não existir mais e o serviço for desnecessário, exclua-o. <br>- Caso o CLB exista e tenha sido criado manualmente, adicione a anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id. Consulte Usar anotações para configurar uma instância de Classic Load Balancer (CLB). <br>- Se o CCM criou o CLB, adicione o rótulo kubernetes.do.not.delete à instância de CLB. Consulte Como renomear uma instância de SLB ao usar uma versão anterior do CCM?. |
ORDER.ARREARAGE Message: The account is arrearage. |
A conta possui pagamentos pendentes. | Regularize os pagamentos pendentes. |
PAY.INSUFFICIENT_BALANCE Message: Your account does not have enough balance. |
O saldo da conta é insuficiente.
O saldo da sua conta é insuficiente. |
Recarregue o saldo da conta. |
Status Code: 400 Code: Throttlingxxx |
A OpenAPI do CLB está sendo limitada (throttling). | 1. Verifique sua cota de CLB na página SLB Quota Management. <br>2. Verifique se há erros no serviço e resolva-os: kubectl -n {your-namespace} describe svc {your-svc-name}. |
Status Code: 400 Code: RspoolVipExist Message: there are vips associating with this vServer group. |
O listener vinculado ao grupo vServer não pode ser excluído. | 1. Verifique se a anotação do serviço contém um ID de CLB: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: {your-clb-id}. Se presente, o CLB está sendo reutilizado. <br>2. No console de CLB, exclua o listener referente à porta definida no serviço. Consulte Configurar regras de encaminhamento de listener. |
Status Code: 400 Code: NetworkConflict |
A instância de CLB interna está em uma Virtual Private Cloud (VPC) diferente da do cluster. | Mova a instância de CLB para a mesma VPC do cluster ou crie uma nova instância de CLB na VPC correta. |
Status Code: 400 Code: VSwitchAvailableIpNotExist Message: The specified VSwitch has no available ip. |
O vSwitch não possui endereços IP disponíveis. | Adicione a anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vswitch-id: "${YOUR_VSWITCH_ID}" para especificar um vSwitch diferente na mesma VPC. |
The specified Port must be between 1 and 65535. |
O modo ENI não aceita valores de string para targetPort. |
Altere targetPort para um número inteiro no YAML do serviço ou atualize o CCM. Consulte Atualizar o componente CCM. |
Status Code: 400 Code: ShareSlbHaltSales Message: The share instance has been discontinued. |
Versões antigas do CCM criam instâncias compartilhadas de CLB por padrão, as quais foram descontinuadas. | Atualize o componente CCM. |
can not change ResourceGroupId once created |
O grupo de recursos do CLB não pode ser alterado após a criação da instância. | Remova a anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-resource-group-id:"rg-xxxx" do serviço. |
can not find eniid for ip x.x.x.x in vpc vpc-xxxx |
IP da ENI não encontrado na VPC. A anotação service.beta.kubernetes.io/backend-type: eni está definida, mas o cluster utiliza Flannel, que não suporta o modo ENI. |
Remova a anotação service.beta.kubernetes.io/backend-type: eni do serviço. |
The operation is not allowed because the instanceChargeType of loadbalancer is PayByCLCU. ou User does not have permission modify InstanceChargeType to spec. |
O método de faturamento do CLB não pode ser alterado de pagamento conforme o uso (PayByCLCU) para pagamento por especificação. | Adote uma das seguintes medidas: <br>- Remova a anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec. <br>- Se o serviço possuir a anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type, defina seu valor como PayByCLCU. |
SyncLoadBalancerFailed the loadbalancer xxx can not be reused, can not reuse loadbalancer created by kubernetes. |
A instância de CLB foi criada pelo CCM e não pode ser reutilizada através da anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id. |
1. Localize o ID do CLB na anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id do YAML do serviço. <br>2. Resolva conforme o status do serviço: <br> - Serviço pendente: Substitua o ID do CLB por um criado manualmente no console Classic Load Balancer (CLB). <br> - Serviço não pendente, IP do CLB corresponde ao EXTERNAL-IP do serviço: Exclua a anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id. <br> - Serviço não pendente, IP do CLB não corresponde: Localize no console o CLB correspondente ao EXTERNAL-IP do serviço e atualize a anotação. Se não houver correspondência, utilize um ID de CLB criado manualmente e recrie o serviço. |
alicloud: can not change LoadBalancer AddressType once created. delete and retry |
O tipo de instância de CLB não pode ser alterado após a criação. | Exclua o serviço e recrie-o. |
the loadbalancer lb-xxxxx can not be reused, service has been associated with ip [xxx.xxx.xxx.xxx], cannot be bound to ip [xxx.xxx.xxx.xxx] |
O serviço está vinculado a uma instância de CLB e não pode ser revinculado apenas alterando a anotação. | Exclua o serviço e recrie-o com o ID correto da instância de CLB. |
Métodos de solução de problemas
Para problemas que não geram eventos de erro, utilize o guia baseado em sintomas abaixo.
|
Problema |
Sintoma |
Solução |
|
Problemas de acesso ao CLB |
Distribuição desigual de carga entre back-ends |
|
|
Erro 503 durante atualizações de aplicação |
||
|
CLB inacessível de dentro do cluster |
||
|
CLB inacessível de fora do cluster |
||
|
Erro "The plain HTTP request was sent to HTTPS port" |
||
|
Problemas de configuração do CLB |
Anotações de serviço não surtem efeito |
|
|
Configuração do CLB modificada inesperadamente |
Por que a configuração da minha instância de CLB foi modificada? |
|
|
Reutilização de instância existente de CLB não funciona |
||
|
Nenhum listener configurado ao reutilizar instância existente de CLB |
Por que nenhum listener é configurado ao reutilizar uma instância existente de CLB? |
|
|
Back-ends do CLB inconsistentes |
||
|
Problemas de exclusão do CLB |
Instância de CLB excluída inesperadamente |
|
|
Instância de CLB não é excluída após a exclusão do serviço |
Distribuição desigual de carga entre back-ends do CLB
Causa: O algoritmo de agendamento do CLB não é adequado ao padrão de tráfego.
Sintoma: Distribuição desigual de requisições entre os servidores de back-end.
Solução:
Para serviços com
externalTrafficPolicy: Local, adicione a anotaçãoservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wrr"para usar agendamento round-robin ponderado.Para serviços que utilizam conexões persistentes, adicione a anotação
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wlc"para agendamento por menor número de conexões ponderado. Isso evita que uma única conexão de longa duração monopolize o tráfego.
Para capturar pacotes de rede de contêineres visando análise de distribuição de carga, consulte este artigo da comunidade Alibaba Cloud Developer.
Erro 503 durante atualizações de aplicação
Causa: A drenagem de conexões ou o encerramento gracioso de pods não estão configurados. Durante atualizações contínuas (rolling updates), o CLB pode rotear tráfego para pods em fase de encerramento.
Sintoma: Erro 503 ao acessar o CLB durante uma atualização de aplicação.
Solução:
Adicione a anotação
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drainpara ativar a drenagem de conexões. Consulte Operações comuns para gerenciar listeners.-
Configure
readinessProbeepreStopno pod:readinessProbe : Os pods entram nos back-ends do CLB somente após passarem na sonda. Defina a frequência, o atraso e o limiar de falha da sonda para corresponder ao tempo de inicialização da sua aplicação. Timeouts muito curtos causam reinícios repetidos dos pods.
preStop e terminationGracePeriodSeconds : Defina
preStoppara o tempo necessário para sua aplicação drenar as requisições em andamento. Configure terminationGracePeriodSeconds para pelo menos 30 segundos a mais que o preStop.
apiVersion: v1 kind: Pod metadata: name: nginx namespace: default spec: containers: - name: nginx image: nginx # Liveness probe livenessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 5084 timeoutSeconds: 1 # Readiness probe readinessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 5084 timeoutSeconds: 1 # Graceful termination lifecycle: preStop: exec: command: - sleep - 30 terminationGracePeriodSeconds: 60
CLB inacessível de dentro do cluster
Causa: A opção externalTrafficPolicy: Local está definida no serviço. O kube-proxy encaminha tráfego apenas para pods no mesmo nó de origem da requisição. Se o nó não tiver um pod de back-end para o serviço, a conexão falhará. Isso afeta o tráfego interno do cluster roteado para o endereço do CLB. Consulte kube-proxy adds external-lb address to node-local iptables rule.
Sintoma: O CLB é acessível de fora do cluster, mas as conexões falham quando originadas internamente.
Solução: Utilize uma das seguintes abordagens:
Acesso via ClusterIP ou nome do serviço (recomendado para acesso interno): Use o ClusterIP ou o nome DNS do serviço em vez do endereço do CLB. Para Ingress, o nome do serviço é
nginx-ingress-lb.kube-system.-
Alterne para
externalTrafficPolicy: Cluster: O tráfego interno alcança o serviço independentemente da localização do pod, mas o IP de origem do cliente não é preservado. Para modificar o serviço de Ingress:Com um CLB de Ingress, os pods só conseguem acessar serviços expostos via Ingress/CLB a partir do nó onde o pod do Ingress está em execução.
kubectl edit svc nginx-ingress-lb -n kube-system -
Use
externalTrafficPolicy: Clustercom passagem direta de ENI (apenas Terway): Se seu cluster usa Terway com ENIs ou múltiplos IPs por ENI, definaexternalTrafficPolicy: Clustere adicione a anotaçãoservice.beta.kubernetes.io/backend-type: "eni". Isso preserva o IP de origem e permite o acesso interno. Consulte Usar anotações para configurar uma instância de Classic Load Balancer (CLB).apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/backend-type: eni labels: app: nginx-ingress-lb name: nginx-ingress-lb namespace: kube-system spec: externalTrafficPolicy: Cluster
CLB inacessível de fora do cluster
Causa: Uma ACL bloqueia o IP do cliente, o grupo vServer do CLB não possui back-ends ou a verificação de integridade está falhando.
Sintoma: A instância de CLB não pode ser acessada de fora do cluster.
Solução:
-
Verifique se há eventos de erro no serviço e resolva-os. Consulte Eventos de erro de serviço e soluções.
kubectl -n {your-namespace} describe svc {your-svc-name} Verifique se existe alguma ACL configurada na instância de CLB. Em caso afirmativo, confirme se ela permite tráfego de entrada do IP do cliente. Consulte Resource Access Management.
Verifique se o grupo vServer do CLB está vazio. Se estiver, confirme se há um pod associado ao serviço e em execução. Caso o pod esteja com falha, resolva primeiro o problema do pod. Consulte Solucionar problemas de pods.
Verifique se a verificação de integridade do listener do CLB está passando. Se estiver falhando, confirme se o pod responde corretamente. Consulte FAQ de verificação de integridade do CLB.
Impossível conectar ao serviço HTTPS de back-end
Causa: Com um certificado no listener do CLB, o CLB termina a conexão TLS e encaminha HTTP para os back-ends. Se targetPort apontar para uma porta HTTPS (por exemplo, 443), o pod rejeitará a requisição em texto simples com a mensagem "The plain HTTP request was sent to HTTPS port".
Sintoma: Falha nas conexões de back-end após configurar HTTPS no listener do CLB.
Solução: Defina targetPort para a porta HTTP do pod. Por exemplo, se o Nginx serve HTTPS na porta 443, defina targetPort como 80.
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "https:443"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}"
name: nginx
namespace: default
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
- name: https
port: 443
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer