Keepalived no reenviará el tráfico al nodo BACKUP después de la configuración del clúster de Kubernetes

Keepalived no reenviará el tráfico al nodo BACKUP después de la configuración del clúster de Kubernetes

Estructura del sistema:

  • 10.10.1.86: nodo maestro de Kubernetes
  • 10.10.1.87: Trabajador de Kubernetes 1 nodo; keepalivedNodo MAESTRO
  • 10.10.1.88: Trabajador de Kubernetes 2 nodo; keepalivedNodo de RESPALDO
  • 10.10.1.90: VIP, cargaría el saldo en .87& .88; Implementado por keepalived.

Este clúster de Kubernetes es un entorno de desarrollo y las pruebas recopilan registros de flujo de red.

Lo que quiero lograr es:

  1. Todos los enrutadores/conmutadores netflow registran la primera salida a.90
  2. Luego utilícelo keepalivedpara equilibrar la carga ( lb_kind: NAT) en .87& .88, que son dos trabajadores de Kubernetes.
  3. Existe NodePortun servicio para captar este tráfico en el clúster de Kubernetes y realizar el resto de los trabajos de análisis de datos.
  • Algo como:
        |                {OS Network}                   |   {Kubernetes Network}

                                K8s Worker -> filebeat -> logstash (deployments)
                              /
<data> -> [VIP] load balance
                              \ 
                                K8s Worker -> filebeat -> logstash (deployments)
  • filebeat.yml (he probado que todo el tráfico está bien después de filebeat, por lo que uso filela salida para limitar la causa raíz).
# cat filebeat.yml
filebeat.inputs:

- type: tcp
  max_message_size: 10MiB
  host: "0.0.0.0:5100"

- type: udp
  max_message_size: 10KiB
  host: "0.0.0.0:5150"




#output.logstash:
#  hosts: ["10.10.1.87:30044", "10.10.1.88:30044"]
output.file:
  path: "/tmp/"
  filename: tmp-filebeat.out

Kubernetes

  • Master y Workers son 3 VM en mi entorno privado; ni ninguno de los proveedores de GCP o AWS.
  • Versión:
# kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:31:21Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:25:06Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}
  • Servicios
# cat logstash.service.yaml
apiVersion: v1
kind: Service
metadata:
  name: logstash-service
spec:
  type: NodePort
  selector:
    app: logstash
  ports:
    - port: 9514
      name: tcp-port
      targetPort: 9514
      nodePort: 30044
  • Una vez que los datos llegan a Kubernetes, todo funciona bien.
  • Fue el saldo de carga VIP el que no se reenvió.

Configuración de Keepalived

!Configuration File for keepalived
global_defs {
  router_id proxy1   # `proxy 2` at the other node
}


vrrp_instance VI_1 {
  state MASTER       # `BACKUP` at the other node
  interface ens160
  virtual_router_id 41
  priority 100       # `50` at the other node
  advert_int 1
  virtual_ipaddress {
    10.10.1.90/23
  }
}

virtual_server 10.10.1.90 5100 {
  delay_loop 30
  lb_algo rr
  lb_kind NAT
  protocol TCP
  persistence_timeout 0

  real_server 10.10.1.87 5100 {
    weight 1
  }
  real_server 10.10.1.88 5100 {
    weight 1
  }
}
virtual_server 10.10.1.90 5150 {
  delay_loop 30
  lb_algo rr
  lb_kind NAT
  protocol UDP
  persistence_timeout 0

  real_server 10.10.1.87 5150 {
    weight 1
  }
  real_server 10.10.1.88 5150 {
    weight 1
  }

Funciona antes de la configuración del clúster de Kubernetes

  • Ambos .87& .88han instalado keepalivedy rrel equilibrio de carga (RoundRobin) funciona bien (TCP y UDP).
  • Detenga keepalivedel servicio ( systemctl stop keepalived) cuando vaya a configurar el clúster de Kubernetes, por si acaso.

El problema ocurrió después de la configuración del clúster de Kubernetes

  • Se encontró que solo el nodo MAESTRO .87puede reenviar el tráfico, el VIP no puede reenviar al nodo de RESPALDO .88.
  • Kubernetes NodePorty las implementaciones capturan con éxito los datos reenviados desde MASTER.

Prueba de problema por nc:

  • nc: solo quien tiene VIP (nodo MAESTRO) puede reenviar el tráfico; cuando rrse reenvía a RESPALDO, solo muestra el tiempo de espera.
  • También probado nc -l 5100en ambos servidores, solo el nodo MAESTRO obtuvo resultados.
# echo "test" | nc 10.10.1.90 5100
# echo "test" | nc 10.10.1.90 5100
Ncat: Connection timed out.
# echo "test" | nc 10.10.1.90 5100
# echo "test" | nc 10.10.1.90 5100
Ncat: Connection timed out.

Alguna información

  • Versiones de paquetes
# rpm -qa |grep keepalived
keepalived-1.3.5-19.el7.x86_64
  • CNI de Kubernetes:Calico
# kubectl get pod -n kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
calico-kube-controllers-b656ddcfc-wnkcj   1/1     Running   2          78d
calico-node-vnf4d                         1/1     Running   8          78d
calico-node-xgzd5                         1/1     Running   1          78d
calico-node-zt25t                         1/1     Running   8          78d
coredns-558bd4d5db-n6hnn                  1/1     Running   2          78d
coredns-558bd4d5db-zz2rb                  1/1     Running   2          78d
etcd-a86.axv.bz                           1/1     Running   2          78d
kube-apiserver-a86.axv.bz                 1/1     Running   2          78d
kube-controller-manager-a86.axv.bz        1/1     Running   2          78d
kube-proxy-ddwsr                          1/1     Running   2          78d
kube-proxy-hs4dx                          1/1     Running   3          78d
kube-proxy-qg2nq                          1/1     Running   1          78d
kube-scheduler-a86.axv.bz                 1/1     Running   2          78d
  • ipvsadm(mismo resultado en .87, .88)
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.10.1.90:5100 rr
  -> 10.10.1.87:5100              Masq    1      0          0
  -> 10.10.1.88:5100              Masq    1      0          0
UDP  10.10.1.90:5150 rr
  -> 10.10.1.87:5150              Masq    1      0          0
  -> 10.10.1.88:5150              Masq    1      0          0
  • Selinux siempre esPermissive
  • Si se detiene firewalld, tampoco funciona.
  • sysctldiferencia:
# before:
net.ipv4.conf.all.accept_redirects = 1
net.ipv4.conf.all.forwarding = 0
net.ipv4.conf.all.route_localnet = 0
net.ipv4.conf.default.forwarding = 0
net.ipv4.conf.lo.forwarding = 0
net.ipv4.ip_forward = 0

# after
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.all.route_localnet = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.lo.forwarding = 1
net.ipv4.ip_forward = 1

No estoy seguro de si se puede realizar alguna verificación adicional ahora, por favor avísenos, ¡gracias!

información relacionada