Diagnostique e resolva problemas quando services do tipo Type=LoadBalancer apresentarem erros de CLB ou falhas de acesso. Consulte Service load balancing notes.
Pré-requisitos
A versão do componente CCM deve ser V1.9.3.276-g372aa98-aliyun ou posterior (upgrade instructions, release notes).
Processo de diagnóstico
Identifique a origem do problema no service LoadBalancer.
-
Localize o service 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 service í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 service.
kubectl -n {your-namespace} describe svc {your-svc-name}Verifique a seção Events na parte inferior. Exemplo de saída com erro:
Events: Type Reason Age From Message ---- ------ --- ---- ------- Warning SyncLoadBalancerFailed 2m service-controller <error message here>Se houver eventos de erro, localize a mensagem correspondente em Service error events and solutions.
Caso não existam eventos de erro, utilize o guia baseado em sintomas em Troubleshooting methods.
Eventos de erro do service 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 medidas a seguir: 1. Solicite 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 aceitam back-ends do tipo Elastic Network Interface (ENI). | Adicione a anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small" para usar uma instância de CLB de alto desempenho. Verifique a compatibilidade da versão do CCM. Consulte Use annotations to configure a Classic Load Balancer (CLB) instance. |
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 service, adicione um. <br>- Caso o pod esteja com problemas de integridade, resolva a questão. Consulte Troubleshoot pod issues. <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 service. | Pesquise a instância de CLB no Server Load Balancer console usando o EXTERNAL-IP do service. <br>- Se o CLB não existir mais e o service 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 Use annotations to configure a Classic Load Balancer (CLB) instance. <br>- Se o CCM criou o CLB, adicione o rótulo kubernetes.do.not.delete à instância de CLB. Consulte How do I rename an SLB instance if I am using an earlier version of 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 service e corrija-os: kubectl -n {your-namespace} describe svc {your-svc-name}. |
Status Code: 400 Code: RspoolVipExist Message: there are vips associating with this vServer group. |
Não é possível excluir o listener vinculado ao grupo vServer. | 1. Verifique se a anotação do service 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 service. Consulte Configure listener forwarding rules. |
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 do tipo string para targetPort. |
Altere targetPort para um número inteiro no YAML do service ou atualize o CCM. Consulte Upgrade the CCM component. |
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. | Upgrade the CCM component. |
can not change ResourceGroupId once created |
Não é possível alterar o grupo de recursos do CLB 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 service. |
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 oferece suporte ao modo ENI. |
Remova a anotação service.beta.kubernetes.io/backend-type: eni do service. |
The operation is not allowed because the instanceChargeType of loadbalancer is PayByCLCU. ou User does not have permission modify InstanceChargeType to spec. |
Não é possível alterar o método de faturamento do CLB de pagamento conforme o uso (PayByCLCU) para pagamento por especificação. | Adote uma das medidas a seguir: <br>- Remova a anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec. <br>- Caso o service possua 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. |
O CCM criou a instância de CLB e não é possível reutilizá-la por meio 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 no YAML do service. <br>2. Resolva conforme o status do service: <br> - Service pendente: Substitua o ID do CLB por um criado manualmente no Classic Load Balancer (CLB) console. <br> - Service não pendente e IP do CLB corresponde ao EXTERNAL-IP do service: Remova a anotação service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id. <br> - Service não pendente e IP do CLB não corresponde: Localize no console o CLB correspondente ao EXTERNAL-IP do service e atualize a anotação. Se não houver correspondência, use um ID de CLB criado manualmente e recrie o service. |
alicloud: can not change LoadBalancer AddressType once created. delete and retry |
Não é possível alterar o tipo da instância de CLB após a criação. | Exclua o service 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 service está vinculado a uma instância de CLB e não é possível revinculá-lo apenas alterando a anotação. | Exclua o service 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 a seguir.
|
Problema |
Sintoma |
Solução |
|
Problemas de acesso ao CLB |
Distribuição desigual de carga entre os back-ends |
|
|
Erro 503 durante atualizações da 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 do service não surtem efeito |
|
|
Configuração do CLB modificada inesperadamente |
||
|
Reutilização de instância de CLB existente não funciona |
||
|
Nenhum listener configurado ao reutilizar uma instância de CLB existente |
Why is no listener configured when I reuse an existing CLB instance? |
|
|
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 service |
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 services com
externalTrafficPolicy: Local, adicione a anotaçãoservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wrr"para usar o agendamento weighted round-robin.Para services que utilizam conexões persistentes, adicione a anotação
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wlc"para aplicar o agendamento weighted least connections. Isso evita que uma única conexão de longa duração monopolize o tráfego.
Erro 503 durante atualizações da aplicação
Causa: O draining de conexões ou o encerramento graceful do pod não estão configurados. Durante atualizações rolling, o CLB pode rotear tráfego para pods em fase de encerramento.
Sintoma: Erro 503 ao acessar o CLB durante uma atualização da aplicação.
Solução:
Adicione a anotação
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drainpara ativar o draining de conexões. Consulte Common operations to manage listeners.-
Configure
readinessProbeepreStopno pod:readinessProbe : Os pods entram nos back-ends do CLB somente após passarem na sondagem. Configure a frequência, o atraso e o limiar de falha da sondagem para corresponder ao tempo de inicialização da sua aplicação. Timeouts muito curtos causam reinícios repetidos do pod.
preStop e terminationGracePeriodSeconds : Defina
preStopcomo 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 service. O kube-proxy encaminha o 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 service, 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 externamente ao cluster, mas as conexões falham quando originadas internamente.
Solução: Utilize uma das abordagens a seguir:
Acesso via ClusterIP ou nome do service (recomendado para acesso interno): Use o ClusterIP ou o nome DNS do service em vez do endereço do CLB. Para Ingress, o nome do service é
nginx-ingress-lb.kube-system.-
Alterne para
externalTrafficPolicy: Cluster: O tráfego interno alcança o service independentemente da localização do pod, porém o IP de origem do cliente não é preservado. Para modificar o service de Ingress:Com um CLB de Ingress, os pods só conseguem acessar services 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 o seu cluster utiliza Terway com ENIs ou múltiplos IPs por ENI, definaexternalTrafficPolicy: Clustere adicione a anotaçãoservice.beta.kubernetes.io/backend-type: "eni". Essa configuração preserva o IP de origem e permite o acesso interno. Consulte Use annotations to configure a Classic Load Balancer (CLB) instance.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 (health check) está falhando.
Sintoma: Não é possível acessar a instância de CLB externamente ao cluster.
Solução:
-
Verifique se existem eventos de erro no service e resolva-os. Consulte Service error events and solutions.
kubectl -n {your-namespace} describe svc {your-svc-name} Verifique se há alguma ACL configurada na instância de CLB. Em caso afirmativo, confirme se ela permite tráfego de entrada proveniente do IP do cliente. Consulte Resource Access Management.
Confira se o grupo vServer do CLB está vazio. Se estiver, verifique se existe um pod associado ao service e em execução. Caso o pod não esteja íntegro, resolva o problema do pod primeiro. Consulte Troubleshoot pod issues.
Verifique se a verificação de integridade do listener do CLB está passando. Em caso de falha, confirme se o pod responde corretamente. Consulte CLB health check FAQ.
Impossível conectar ao service HTTPS de back-end
Causa: Quando há 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 puro com a mensagem "The plain HTTP request was sent to HTTPS port".
Sintoma: Falhas na conexão com o 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, configure 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