![Keepalived не перенаправляет трафик на узел BACKUP после настройки кластера Kubernetes](https://rvso.com/image/768920/Keepalived%20%D0%BD%D0%B5%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%20%D1%82%D1%80%D0%B0%D1%84%D0%B8%D0%BA%20%D0%BD%D0%B0%20%D1%83%D0%B7%D0%B5%D0%BB%20BACKUP%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8%20%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B0%20Kubernetes.png)
Структура системы:
10.10.1.86
: Главный узел Kubernetes10.10.1.87
: узел Kubernetes worker 1;keepalived
узел MASTER10.10.1.88
: узел Kubernetes worker 2;keepalived
узел BACKUP10.10.1.90
: VIP, будет выполнять балансировку нагрузки для.87
&.88
; реализованоkeepalived
.
Этот кластер Kubernetes представляет собой среду разработки, которая тестирует сбор журнала Netflow.
Чего я хочу добиться:
- Все журналы Netflow маршрутизатора/коммутатора сначала выводятся на
.90
- Затем используйте
keepalived
для балансировки нагрузки (lb_kind
:NAT
) для.87
&.88
, которые являются двумя рабочими процессами Kubernetes. - Существует
NodePort
служба, которая перехватывает этот трафик в кластер Kubernetes и выполняет остальные задачи по анализу данных.
- Что-то вроде:
| {OS Network} | {Kubernetes Network}
K8s Worker -> filebeat -> logstash (deployments)
/
<data> -> [VIP] load balance
\
K8s Worker -> filebeat -> logstash (deployments)
- filebeat.yml (проверил, что после filebeat трафик в порядке, поэтому использую
file
вывод, чтобы сузить круг первопричин).
# 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
Кубернетес
- Master и Workers — это три виртуальные машины в моей частной среде; они не принадлежат ни одному из поставщиков GCP или AWS.
- Версия:
# 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"}
- Услуги
# 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
- Как только данные попадают в Kubernetes, все работает нормально.
- Это был баланс нагрузки VIP, который не перенаправлялся.
Keepalived conf
!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
}
Работает до настройки кластера Kubernetes
- Оба
.87
&.88
установленыkeepalived
, иrr
(RoundRobin) балансировка нагрузки работает нормально (TCP и UDP). - На всякий случай остановите
keepalived
службу (systemctl stop keepalived
) при настройке кластера Kubernetes.
Проблема возникла после настройки кластера Kubernetes
- Обнаружено, что только главный узел
.87
может пересылать трафик, VIP не может пересылать его на резервный узел.88
. - Пересылаемые данные от MASTER успешно перехватываются Kubernetes
NodePort
и развертываниями.
Тестирование проблемы nc
:
nc
: только тот, кто имеет VIP (главный узел), может пересылать трафик, приrr
пересылке на резервный узел просто отображается тайм-аут.- также протестировано
nc -l 5100
на обоих серверах, только главный узел получил результаты.
# 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.
Некоторая информация
- Версии пакетов
# rpm -qa |grep keepalived
keepalived-1.3.5-19.el7.x86_64
- CNI-интерфейс 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
(тот же результат на.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 всегда
Permissive
- Если остановить
firewalld
, то все равно не получится. sysctl
разница:
# 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
Не уверен, можно ли сейчас провести дополнительную проверку, пожалуйста, посоветуйте, спасибо!