kubernetes開啟ipvs 模式,主要修改kube-proxy 配置彤断。
前提條件:
確保IPVS需要內核模塊
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
檢查已編譯到節(jié)點內核中
grep -e ipvs -e nf_conntrack_ipv4 /lib/modules/$(uname -r)/modules.builtin
是否被加載
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
to check loaded modules, use
lsmod | grep -e ipvs -e nf_conntrack_ipv4
or
cut -f1 -d " " /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4
注:
linux kernel 4.19版本已經(jīng)將nf_conntrack_ipv4 更新為 nf_conntrack, 而 kube-proxy 1.13 以下版本状植,強依賴 nf_conntrack_ipv4呢袱。 解決方式:
1、降級內核到 4.18?
2祝蝠、升級kube-proxy到 1.13+ (推薦,無需重啟機器幻碱,影響幸锵痢)
升級kube-proxy:
1、下載bin文件
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.13.md#node-binaries
wget?https://dl.k8s.io/v1.13.2/kubernetes-node-linux-amd64.tar.gz
2褥傍、解壓后替換 kube-proxy文件儡嘶,更新配置,完成重啟
tar -zxvf kubernetes-node-linux-amd64.tar.gz
mv /usr/local/bin/kube-proxy /usr/local/bin/kube-proxy.1.12.3
cp kubernetes/node/bin/kube-proxy /usr/local/bin/
配置文件更新如下:
/etc/systemd/system/kube-proxy.service
...
--proxy-mode=ipvs
...
systemctl restart kube-proxy.service # 重啟服務
3恍风、 查看日志確認沒有異常
journalctl -u kube-proxy.service
日志中輸出:
server_others.go:189] Using ipvs Proxier. 表示配置ipvs模式成功
接下來驗證 ipvs 規(guī)則:?
(需提前安裝好 ipvsadm 管理工具)
#ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.17.0.1:30443 rr
-> 10.244.0.23:443 Masq 1 0 0
TCP 172.17.0.1:36142 rr
我們可以看到有相關的規(guī)則蹦狂,表示service 已經(jīng)開始使用ipvs 進行流量負載均衡了。
4朋贬、壓力測試:
簡單啟動nginx 服務凯楔, 暴露nodeport?
#kubectl create deployment nginxtest --image=nginx:1.12
#kubectl expose deployment nginxtest --port=80 --type=NodePort
#kubectl get svc nginxtest
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginxtest NodePort 10.68.10.190 80:35896/TCP 84s
#kubectl get deployments nginxtest
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginxtest 1 1 1 1 118s
使用ab進行測試:
#ab -c 100 -n 100000?http://10.68.10.190/
#ab -c 100 -n 100000?http://10.188.1.201:35896/
如無異常,則表示ipvs功能正辰跄迹可用了摆屯。
踩的一些坑:
#使用ab測試,發(fā)現(xiàn)有許多耗時非常大的請求糠亩,有時也會失敗虐骑。 查看dmesg日志后發(fā)現(xiàn)有如下日志輸出:
net_ratelimit: 544 callbacks suppressednf_conntrack: nf_conntrack: table full, dropping packet
-------》 提示 nf_conntrack: table full,增加如下值到 sysctl.conf中赎线。 kube-proxy 默認會調整到 131072
net.netfilter.nf_conntrack_max=1048576
net.nf_conntrack_max=1048576
apr_socket_recv: Connectionresetbypeer
-------》 ab測試的時候出現(xiàn)廷没,這個主要防止 syn***的, 內網(wǎng)我們可以打開 echo " net.ipv4.tcp_syncookies = 0" >> /etc/sysctl.conf && sysctl -p
參考文獻:?https://kubernetes.io/zh/blog/2018/07/09/ipvs-based-in-cluster-load-balancing-deep-dive/