Resolva problemas de configuração de CLB, reutilização de instâncias, acesso via NodePort e atualização do CCM em clusters ACK.
Índice
Configuração de CLB
|
Pergunta |
Resumo |
|
Duas instâncias de CLB: API server e Nginx Ingress Controller |
|
|
Como escolher entre as políticas de tráfego externo Local e Cluster? |
Comparação dos comportamentos das políticas de tráfego |
|
O CCM substitui alterações manuais no console de CLB |
|
|
Fórmulas de peso por versão do CCM |
|
|
Como habilitar connection draining para um Service do tipo LoadBalancer? |
Annotations para connection draining |
|
Comando kubectl + jq para listar todos os Services do tipo LoadBalancer |
|
|
Como habilitar a renomeação de CLB para versões antigas do CCM? |
Adicionar tags manualmente em instâncias de CLB criadas pelo CCM v1.9.3.10 ou anterior |
Acesso e ciclo de vida do CLB
|
Pergunta |
Resumo |
|
Por que um endereço IP de CLB está inacessível de dentro do cluster? |
Limitações da camada 4 e comportamento do modo Local |
|
Políticas de exclusão para instâncias de CLB criadas pelo CCM versus reutilizadas |
|
|
O que fazer se eu excluir acidentalmente uma instância de CLB? |
Etapas de recuperação para instâncias de CLB do API server, Ingress e aplicações |
Reutilização de uma instância de CLB existente
|
Pergunta |
Resumo |
|
Por que a reutilização de uma instância de CLB existente falha? |
Versão do CCM, origem da instância e requisitos de VPC |
|
Por que os listeners não são criados ao reutilizar uma instância de CLB existente? |
Annotation de substituição forçada obrigatória |
Solução de problemas de CLB
|
Pergunta |
Resumo |
|
O que fazer se uma instância de CLB permanecer no estado Pending? |
Verificar eventos e resolver erros |
|
Verificar eventos e resolver erros |
|
|
O que fazer se uma annotation de Service não entrar em vigor? |
Versão do CCM, presença de annotation e sintaxe |
|
Por que nenhum evento é exibido para a sincronização de Service e LoadBalancer? |
Versão do CCM anterior a v1.9.3.276-g372aa98-aliyun |
Mensagens de erro de Service
|
Pergunta |
Resumo |
|
Cota de servidores backend, esgotamento de IPs do vSwitch, disponibilidade de nós |
|
|
Modo ENI, porta de destino, grupo de recursos, tipo de endereço, método de faturamento |
|
|
Incompatibilidade de VPC, limitação de API, conflitos de vServer group |
|
|
Reutilização de CLB criado pelo CCM, CLB não encontrado, nova associação de CLB |
|
|
Pagamento em atraso, saldo insuficiente, instância compartilhada descontinuada |
NodePort e CCM
|
Pergunta |
Resumo |
|
Métodos de acesso por escopo de rede |
|
|
Como configurar um listener para um Service do tipo NodePort? |
Alterar para o tipo LoadBalancer |
|
ServiceNodePortRange e prevenção de conflitos de porta |
|
|
Link de solução de problemas |
|
|
Como adicionar permissões necessárias para uma atualização do CCM em um cluster ACK dedicado? |
Permissões de RAM para v2.11.2 e posteriores |
|
Como habilitar persistência de sessão para um Service do Kubernetes? |
Link externo |
Configuração de CLB
Quais instâncias de CLB um cluster ACK cria por padrão?
Se o add-on Nginx Ingress Controller for instalado durante a criação do cluster, duas instâncias de CLB serão criadas:
CLB do API server: Endpoint do API server. Todas as requisições do cluster passam por esta instância na porta TCP 6443. Os backends são pods do API server ou instâncias ECS master.
CLB do Nginx Ingress Controller: Associado ao Service
nginx-ingress-controllerno namespace kube-system. Associa-se dinamicamente aos pods do Ingress Controller para balancear requisições externas. Escuta nas portas TCP 80 e 443.
Como escolher entre as políticas de tráfego externo Local e Cluster?
As políticas de tráfego externo Local e Cluster diferem conforme o plugin de rede. Consulte External traffic policies: Local and Cluster.
Por que minha configuração de CLB foi modificada?
O CCM utiliza uma API declarativa e atualiza automaticamente a configuração do CLB com base na definição do Service. Alterações feitas diretamente no console de CLB podem ser substituídas.
Não modifique instâncias de CLB gerenciadas pelo Kubernetes no console de CLB. As alterações podem ser perdidas e tornar o Service inacessível. Utilize annotations de Service. Consulte Use annotations to configure a Classic Load Balancer (CLB) instance.
Como os pesos dos nós são calculados no modo Local?
O exemplo a seguir considera um pod de aplicação (app=nginx) implantado em três instâncias ECS e exposto por meio de um Service.

v1.9.3.276-g372aa98-aliyun e posteriores
O CCM define o peso do nó igual ao número de pods nesse nó. Por exemplo, se três instâncias ECS hospedam 1, 2 e 3 pods respectivamente, seus pesos serão 1, 2 e 3. O tráfego é distribuído na proporção de 1:2:3, resultando em carga equilibrada entre os pods.
Fórmula:


Entre v1.9.3.164-g2105d2e-aliyun e v1.9.3.276-g372aa98-aliyun
Anterior a v1.9.3.164-g2105d2e-aliyun
Como habilitar connection draining para um Service do tipo LoadBalancer?
Adicione as seguintes annotations ao Service. Após a remoção de um servidor backend, a instância de CLB continua processando as conexões existentes durante a duração do tempo limite de drenagem.
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drainservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout
Como listar todas as instâncias de CLB em um cluster?
-
Obtenha o nome, namespace, endereço IP e tipo de endereço de cada Service do tipo LoadBalancer. Exemplo de saída:
kubectl get services -A -ojson | jq '.items[] | select(.spec.type == "LoadBalancer") | {name: .metadata.name, namespace: .metadata.namespace, ip: .status.loadBalancer.ingress[0].ip, lb_type: .metadata.annotations."service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type"}'{ "name": "test", "namespace": "default", "ip": "192.168.*.*", "lb_type": "intranet" } { "name": "nginx-ingress-lb", "namespace": "kube-system", "ip": "47.97.*.*", "lb_type": "null" }
Como habilitar a renomeação de CLB para versões antigas do CCM?
O CCM v1.9.3.10 e posteriores adicionam tags automaticamente às instâncias de CLB para permitir a renomeação. Para instâncias de CLB criadas por versões anteriores do CCM, adicione a tag manualmente.
Este procedimento aplica-se apenas a instâncias de CLB criadas pelo CCM v1.9.3.10 ou anterior. O tipo de Service deve ser LoadBalancer.
Conecte-se ao nó master do cluster. Consulte Connect to an ACK cluster using kubectl.
-
Visualize o tipo de Service e o endereço IP. Substitua
${namespace}e${service}pelo namespace e nome do Service reais.kubectl get svc -n ${namespace} ${service}# kubectl get svc -n ${namespace} ${service} nginx-local LoadBalancer 172.19.xxx.xxx 47.111.xxx.xxx 8900:31598/TCP 33d -
Gere a tag para a instância de CLB:
kubectl get svc -n ${namespace} ${service} -o jsonpath="{.metadata.uid}"|awk -F "-" '{print "kubernetes.do.not.delete: "substr("a"$1$2$3$4$5,1,32)}'# kubectl get svc -n ${namespace} ${service} -o jsonpath="{.metadata.uid}"|awk -F "-" '{print "ku kubernetes.do.not.delete: xxx Faça login no console de CLB. Use o endereço IP da etapa 2 para pesquisar a instância de CLB na região correspondente.
Adicione uma tag à instância de CLB usando a chave e o valor da etapa 3 (itens 1 e 2 na figura anterior). Consulte Create and manage a CLB instance.
Acesso e ciclo de vida do CLB
Por que um endereço IP de CLB está inacessível de dentro do cluster?
Dois cenários podem causar isso.
Cenário 1: CLB privado não criado por um Service
Quando um pod acessa uma instância de CLB privada não criada por um Service, o acesso falha se o pod e um servidor backend estiverem no mesmo nó. Trata-se de uma limitação da camada 4: uma instância ECS não pode ser simultaneamente servidor backend e cliente da mesma instância de CLB.
Para resolver:
Altere o endereço IP do CLB para um endereço IP público.
Crie a instância de CLB por meio de um Service e defina a política de tráfego externo como Cluster. O Kube-proxy então intercepta o tráfego destinado ao CLB de dentro do cluster, contornando a limitação.
**Cenário 2: externalTrafficPolicy: Local bloqueia o acesso interno**
Quando um Service usa externalTrafficPolicy: Local, o acesso interno ao IP do CLB falha a partir de nós sem um pod backend. O endereço do CLB destina-se ao uso externo. O tráfego interno é interceptado pelo kube-proxy e roteado localmente (iptables ou IPVS). Se o nó não tiver um pod backend local, a conexão falhará.
Consulte kube-proxy adds external-lb address to local node iptables rules.
Soluções (listadas por ordem de recomendação):
Acesse Services internamente por ClusterIP ou nome do Service. Por exemplo, o nome do Service de Ingress é
nginx-ingress-lb.kube-system. Esta é a abordagem recomendada.-
**Altere
externalTrafficPolicypara Cluster.** Isso encaminha o tráfego para todos os nós, mas ativa o SNAT, impedindo que o backend obtenha o IP real do cliente.kubectl edit svc nginx-ingress-lb -n kube-system -
Use passthrough de elastic network interface (ENI) em clusters Terway. Defina
externalTrafficPolicycomo Cluster e adicione a annotationservice.beta.kubernetes.io/backend-type: "eni". Isso 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
Quando as instâncias de CLB são excluídas?
O comportamento de exclusão depende se o CCM criou a instância de CLB e como ela foi associada ao Service.
|
Operação no Service |
CLB criado pelo CCM |
CLB reutilizado |
|
Excluir o Service |
O CLB é excluído |
O CLB é mantido |
|
Alterar o tipo de Service de LoadBalancer para outro tipo |
O CLB é excluído |
O CLB é mantido |
Se o Service reutilizar uma instância de CLB existente (com a annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: {your-slb-id}), a exclusão do Service não excluirá a instância de CLB. Caso contrário, a exclusão do Service também excluirá a instância de CLB.
Não edite um Service para alterar uma instância de CLB criada pelo CCM para uma instância reutilizada. Isso desassocia o Service do CLB criado automaticamente, impedindo a exclusão automática quando o Service for removido.
O que fazer se eu excluir acidentalmente uma instância de CLB?
Se a instância de CLB do API server for excluída, ela não poderá ser recuperada. Você precisará recriar o cluster. Para instruções, consulte Create an ACK Pro cluster.
Cenário 1: CLB do Ingress excluído
As etapas a seguir usam o Nginx Ingress como exemplo.
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, localize o cluster desejado e clique em seu nome. No painel de navegação à esquerda, escolha Network > Services.
-
Selecione kube-system na lista suspensa Namespace.
Se nginx-ingress-lb aparecer na lista, clique em Edit YAML na coluna Actions. Remova o campo
status.loadBalancere seu conteúdo, depois clique em OK. O CCM reconstruirá a instância de CLB.-
Se nginx-ingress-lb não aparecer, clique em Create from YAML e use o seguinte modelo: ``
yaml apiVersion: v1 kind: Service metadata: labels: app: nginx-ingress-lb name: nginx-ingress-lb namespace: kube-system spec: externalTrafficPolicy: Local ports: selector: app: ingress-nginx type: LoadBalancer``name: http port: 80 protocol: TCP targetPort: 80
name: https port: 443 protocol: TCP targetPort: 443
Cenário 2: CLB específico de aplicação excluído
Se o Service não for mais necessário, exclua-o.
-
Se o Service ainda estiver em uso:
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, localize o cluster desejado e clique em seu nome. No painel de navegação à esquerda, escolha Network > Services.
Na lista suspensa Namespace, clique em All Namespaces e localize o Service desejado.
Na coluna Actions, clique em Edit YAML. Exclua o conteúdo de
status.loadBalancere clique em OK. O CCM reconstruirá a instância de CLB.
Reutilização de uma instância de CLB existente
Por que a reutilização de uma instância de CLB existente falha?
Verifique os itens a seguir nesta ordem:
Versão do CCM: Versões anteriores a v1.9.3.105-gfd4e547-aliyun não suportam a reutilização de instâncias de CLB. Para instruções de atualização, consulte Upgrade the CCM component.
Origem da instância: Instâncias de CLB criadas pelo cluster não podem ser reutilizadas.
CLB do API server: A instância de CLB do API server não pode ser reutilizada.
Incompatibilidade de VPC: Uma instância de CLB privada deve estar na mesma virtual private cloud (VPC) do cluster. A reutilização entre VPCs diferentes não é suportada.
Por que os listeners não são criados ao reutilizar uma instância de CLB existente?
Verifique se a annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners está definida como "true". Sem ela, os listeners não serão criados.
Por padrão, o CCM não substitui listeners em instâncias de CLB existentes:
Substituir listeners ativos pode causar interrupções no serviço.
O CCM suporta configurações de backend limitadas. Para configurações complexas, crie listeners no console de CLB. Force a substituição de listeners apenas quando suas portas não estiverem mais em uso.
Solução de problemas de CLB
O que fazer se uma instância de CLB permanecer no estado Pending?
Execute
kubectl -n {your-namespace} describe svc {your-svc-name}para verificar as mensagens de evento.Resolva os erros relatados nos eventos. Consulte Service error messages and solutions para obter orientações.
Se nenhum evento aparecer, consulte Why are no events displayed for Service and LoadBalancer synchronization?
O que fazer se um vServer group não for atualizado?
Execute
kubectl -n {your-namespace} describe svc {your-svc-name}para verificar as mensagens de evento.Resolva os erros relatados nos eventos. Consulte Service error messages and solutions para obter orientações.
Se nenhum evento aparecer, consulte Why are no events displayed for Service and LoadBalancer synchronization?
O que fazer se uma annotation de Service não entrar em vigor?
Execute
kubectl -n {your-namespace} describe svc {your-svc-name}para verificar se há eventos de erro. Se houver erros, consulte Service error messages and solutions.-
Se nenhum erro aparecer, verifique o seguinte:
Versão do CCM: Verifique se a versão do CCM suporta a annotation. Consulte Use annotations to configure a Classic Load Balancer (CLB) instance.
Presença da annotation: Faça login no console ACK. Na página Services, clique no nome do Service e confirme se a annotation existe. Se estiver ausente, adicione-a. Consulte Use annotations to configure a Classic Load Balancer (CLB) instance.
Sintaxe da annotation: Verifique se a chave e o valor da annotation estão corretos.
Para visualizar a lista de Services, consulte Manage services.
Por que nenhum evento é exibido para a sincronização de Service e LoadBalancer?
Se kubectl -n {your-namespace} describe svc {your-svc-name} não mostrar eventos, verifique a versão do CCM:
Anterior a v1.9.3.276-g372aa98-aliyun: Eventos não são suportados. Atualize o CCM. Para instruções de atualização, consulte Upgrade the CCM component.
v1.9.3.276-g372aa98-aliyun e posteriores: Abra um ticket para investigação adicional.
Mensagens de erro de Service e soluções
Mensagens de erro comuns de Service organizadas por categoria.
Erros de cota e recursos
|
Mensagem de erro |
Descrição e solução |
|
|
A instância de CLB atingiu sua cota de servidores backend. Por padrão, uma instância de CLB suporta até 200 servidores backend. Para resolver: - Solicite um aumento de cota na página de Gerenciamento de Cotas do SLB. - Defina |
|
|
A instância de CLB não tem servidores backend. Verifique se o Service está associado a um pod em execução. - Se nenhum pod estiver associado, associe o Service a um pod de aplicação. - Se o pod não estiver saudável, faça a solução de problemas. - Se o pod estiver executando em um nó master, mova-o para um nó worker. |
|
|
O vSwitch não tem endereços IP disponíveis. Use |
Erros de configuração
|
Mensagem de erro |
Descrição e solução |
|
|
Instâncias de CLB compartilhadas não suportam backends do tipo ENI. Adicione a annotation |
|
|
O modo ENI não suporta um valor de string para |
|
|
O grupo de recursos de uma instância de CLB não pode ser alterado após a criação. Remova a annotation |
|
|
O endereço IP da ENI não foi encontrado na VPC. Verifique se o Service possui a annotation |
|
|
O método de faturamento da instância de CLB não pode ser alterado de pagamento conforme o uso para pagamento por especificação. - Remova a annotation |
|
|
O tipo de endereço do CLB não pode ser alterado após a criação. Exclua e recrie o Service. |
Erros de rede
|
Mensagem de erro |
Descrição e solução |
|
|
A instância de CLB interna reutilizada não está na mesma VPC do cluster. Certifique-se de que a instância de CLB e o cluster estejam na mesma VPC. |
|
|
A API do CLB está sendo limitada. 1. Acesse a página de Gerenciamento de Cotas do SLB e verifique se sua cota de CLB é suficiente. 2. Execute |
|
|
Um listener associado ao vServer group não pode ser excluído. 1. Verifique se a annotation do Service contém |
Erros de reutilização de CLB
|
Mensagem de erro |
Descrição e solução |
|
|
A instância de CLB não pôde ser localizada com base no Service. Faça login no console de CLB e pesquise a instância de CLB pelo |
|
|
Uma instância de CLB criada pelo CCM não pode ser reutilizada. Verifique o ID do CLB na annotation |
|
|
O Service já está associado a uma instância de CLB e não pode ser associado a outra. Para alterar a instância de CLB, exclua e recrie o Service. Alterar apenas o ID do CLB na annotation |
Erros de faturamento
|
Mensagem de erro |
Descrição e solução |
|
|
Sua conta possui um pagamento em atraso. |
|
|
O saldo da sua conta é insuficiente. |
|
|
Versões antigas do CCM criam instâncias de CLB compartilhadas por padrão, mas instâncias compartilhadas foram descontinuadas. Upgrade the CCM component. |
NodePort e CCM
Como acessar um Service do tipo NodePort?
De dentro do cluster (em um nó do cluster): Use ClusterIP + porta ou IP do nó + NodePort do Service. O NodePort padrão é maior que 30000.
De fora do cluster (dentro da mesma VPC): Use o endereço IP do nó e o NodePort do Service.
De fora da VPC (de outra VPC ou da internet): Exponha o Service como tipo LoadBalancer e acesse-o por meio de seu endpoint externo.
Se a política de tráfego externo for Local, verifique se o nó acessado hospeda um pod backend do Service. Consulte External traffic policies: Local and Cluster .
Como configurar um listener para um Service do tipo NodePort?
O CCM suporta configuração de listener apenas para Services do tipo LoadBalancer. Altere o tipo de Service de NodePort para LoadBalancer.
Como configurar o intervalo de NodePort?
O parâmetro --service-node-port-range do API server (ServiceNodePortRange) controla o intervalo de portas para Services do tipo NodePort e LoadBalancer. O intervalo padrão é de 30000 a 32767. Em clusters ACK Pro, personalize os parâmetros do plano de controle para ajustar esse intervalo. Consulte Customize the parameters of the control plane for an ACK Pro cluster.
Tenha em mente o seguinte:
Evite conflitos de intervalo de portas. O intervalo de NodePort não deve se sobrepor ao parâmetro de kernel
net.ipv4.ip_local_port_range, que controla os números de porta locais disponíveis para aplicações no nó. O valor padrão deip_local_port_rangeé de 32768 a 60999.Os intervalos padrão são seguros. Com as configurações padrão do ACK, o ServiceNodePortRange (30000-32767) e o
ip_local_port_range(32768-60999) não se sobrepõem. Se algum dos intervalos tiver sido estendido e agora houver sobreposição, poderão ocorrer exceções de rede esporádicas. Em casos graves, as verificações de integridade falham e os nós ficam offline. Restaure os valores padrão ou ajuste ambos os intervalos para eliminar a sobreposição.Reconfigure Services existentes após alterações. Após ajustar o intervalo de portas, alguns Services do tipo NodePort ou LoadBalancer ainda podem usar portas dentro do intervalo
ip_local_port_range. Executekubectl edit <service-name>e altere o campospec.ports.nodePortpara um NodePort não utilizado.
O que fazer se uma atualização do CCM falhar?
Consulte Falha na verificação de atualização do Cloud Controller Manager (CCM).
Como adicionar permissões necessárias para uma atualização do CCM em um cluster ACK dedicado?
Versões mais recentes do CCM introduzem APIs da Alibaba Cloud que exigem permissões adicionais do Resource Access Management (RAM). Por exemplo, a v2.11.2 adiciona gerenciamento de rotas para redes Flannel, e a v2.12.1 adiciona gerenciamento em lote para Network Load Balancer (NLB).
Antes de atualizar para a v2.11.2 ou posterior em um cluster ACK dedicado, conceda as permissões necessárias à função RAM do cluster:
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, localize o cluster desejado e clique em seu nome. No painel de navegação à esquerda, clique em Cluster Information.
Clique na aba Basic Information e clique no nome da função em Master RAM Role.
-
No console RAM, clique em Permissions > Policies no painel de navegação à esquerda. Localize a política personalizada que começa com
k8sMasterRolePolicy-Ccm-e clique no nome da política.Para clusters mais antigos, essa política pode não existir. Selecione uma política personalizada cujo nome comece com
k8sMasterRolePolicy-. -
Clique em Edit Policy Document e adicione a permissão
nlb:ListAsynJobsàs permissões do NLB. Para clusters Flannel, adicione também as permissõesvpc:CreateRouteEntriesevpc:DeleteRouteEntriesàs permissões da VPC."nlb:ListServerGroupServers", "nlb:GetJobStatus", "nlb:LoadBalancerLeaveSecurityGroup", "nlb:LoadBalancerJoinSecurityGroup", "nlb:ListAsynJobs" ], "Resource": "*", "Effect": "Allow" },}, { "Action": [ "vpc:Describe*", "vpc:DeleteRouteEntry", "vpc:CreateRouteEntry", "vpc:CreateRouteEntries", "vpc:DeleteRouteEntries" ], "Resource": "*", "Effect": "Allow" } ] } Envie as alterações e prossiga com a atualização do CCM.


