Mam problem w długotrwałym procesie zwanym kube-proxy będącym częścią Kubernetes .
Problem polega na tym, że od czasu do czasu połączenie pozostaje w stanie FIN_WAIT2.
$ sudo netstat -tpn | grep FIN_WAIT2
tcp6 0 0 10.244.0.1:33132 10.244.0.35:48936 FIN_WAIT2 14125/kube-proxy
tcp6 0 0 10.244.0.1:48340 10.244.0.35:56339 FIN_WAIT2 14125/kube-proxy
tcp6 0 0 10.244.0.1:52619 10.244.0.35:57859 FIN_WAIT2 14125/kube-proxy
tcp6 0 0 10.244.0.1:33132 10.244.0.50:36466 FIN_WAIT2 14125/kube-proxy
Połączenia te nakładają się z czasem, co powoduje, że proces jest nieprawidłowy. Zgłosiłem już problem do modułu śledzenia błędów Kubernetes, ale chciałbym zrozumieć, dlaczego takie połączenia nie są zamykane przez jądro Linuksa.
Zgodnie z jego dokumentacją (poszukiwanie tcp_fin_timeout) połączenie w stanie FIN_WAIT2 powinno zostać zamknięte przez jądro po X sekundach, z których X można odczytać z / proc. Na moim komputerze jest ustawiony na 60:
$ cat /proc/sys/net/ipv4/tcp_fin_timeout
60
więc jeśli dobrze to rozumiem, takie połączenia powinny zostać zamknięte o 60 sekund. Ale tak nie jest, pozostają w takim stanie przez wiele godzin.
Chociaż rozumiem również, że połączenia FIN_WAIT2 są dość nietypowe (oznacza to, że host czeka na potwierdzenie ACK ze zdalnego końca połączenia, które może już zniknąć), nie rozumiem, dlaczego połączenia te nie są „zamykane” przez system .
Czy mogę coś z tym zrobić?
Pamiętaj, że ponowne uruchomienie powiązanego procesu jest ostatecznością.