Autor: LI Yu
O modo ipvs foi adicionado na versão 1.8 do k8s. Então, quais são as vantagens e desvantagens deste modelo em comparação com o modelo iptables, vamos discutir isso.
Vamos primeiro revisar como as informações de um pod são alteradas.
Primeiro, o kubectl inicia uma solicitação e a solicitação chega ao api-server e, em seguida, o api-server armazena as informações no etcd. Em seguida, o kube-proxy monitora a alteração do api-server, transmite as informações para o serviço e as envia para o endpoint de back-end por meio do iptables.
Essa série de solicitações é finalmente passada por meio do iptables.
Para cada terminal em segundo plano, como você escolhe para qual enviar? Se o primeiro pod selecionado não responder, ele selecionará outro pod para iniciar.
Isso cria um problema. Iptables é baseado em uma lista de regras de kernel. Quanto mais nós de cluster, pior é o desempenho. Por exemplo, usamos o serviço nodeport em 1000 nós, e cada um dos 1000 serviços tem 10 pods. Então, haverá pelo menos 10.000 regras de iptables em cada nó, o que tornará o kernel muito ocupado. O desempenho da máquina será bastante reduzido.
Em seguida, examinamos o modo ipvs. Nesse modo, o kube-proxy ainda está monitorando as alterações do serviço. E sincronize regularmente as regras do ipvs e as informações de serviço por meio da interface de rede. Ao acessar o serviço, o tráfego fluirá para o endereço do endpoint de back-end.
ipvs é baseado na função de gancho netfilter, que usa a tabela hash como a estrutura de dados subjacente. Isso significa que o ipvs usa menos tráfego para sincronizar regras, tornando o throughput da rede mais eficiente.
Aqui, podemos resumir.
Tanto ipvs quanto iptables são baseados em netfilter. Suas diferenças são:
ipvs fornece melhor escalabilidade e desempenho para clusters de grande escala.
Ipvs suporta algoritmos de balanceamento de replicação mais complexos do que iptables (carga mínima, conexões mínimas, round-robin ponderado, etc.))
Ipvs suporta funções de verificação de integridade de servidor e repetição de conexão
E por que o desempenho é tão bom, mas o K8S sempre usou iptables por padrão? Estima-se que eles acham que a maioria das empresas não exigirá o uso de clusters em grande escala.
Em seguida, tentamos o modo ipvs.
Primeiro verifique o modo atual, o meu é a versão K8S1.18.
Mudamos para o modo ipvs para verificar se o módulo do kernel está carregado.
[root@adm-master ~]# lsmod|grep ip_vs
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 145497 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 139224 9 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_ipv4,nf_conntrack_ipv6
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
Este está originalmente vazio, modificado para o modo ipvs
[root@adm-master ~]# kubectl edit configmap kube-proxy -n kube-system
configmap/kube-proxy edited
Excluir todos os pods kube-proxy
[root@adm-master ~]# kubectl delete pod/kube-proxy-84p9n -n kube-system
pod "kube-proxy-84p9n" deleted
[root@adm-master ~]# kubectl delete pod/kube-proxy-mkbk8 -n kube-system
pod "kube-proxy-mkbk8" deleted
[root@adm-master ~]# kubectl delete pod/kube-proxy-xzwxl -n kube-system
pod "kube-proxy-xzwxl" deleted
Modo de visualização
Veja as regras relacionadas ao ipvs.
Instale o ipvsadm
yum install -y ipvsadm