将 iptables 切换为 ipvs ¶
kube-proxy ipvs和iptables的异同
- 相同点:ipvs和iptables都是通过netfitle内核进行转发。
-
异同点:iptables只是为防火墙设计的,IPtable只是防火墙,而ipvs是专门用于高性能负载均衡的,并使用更高效的数据结构,如hash表并支持索引。 ipvs与iptables相比较,其优势为:
(1)ipvs为大型集群提供了更好的可扩展性和性能
(2)ipvs支持比iptables更复杂的负载均衡算法,如rr、wrr、lc、wlc
(3)ipvs支持服务健康检查和链接重试等功能
(4)ipvs可以动态修改ipset集合
查看kube-proxy使用的模式查看kube-proxy使用的模式 ¶
#先查看有几个kube-proxy
kubectl get pods -n kube-system -o wide| grep proxy
#查看现在的kube-proxy使用什么模式
kubectl logs kube-proxy-wxctx -n kube-system |grep Using
kube-proxy 切换为ipvs模式 ¶
- 安装 ipvs
apt-get update && apt-get install -y ipset ipvsadm
- 在所有 master、node 节点上执行下面的脚本启动 ipvs 模块
cat <<EOF >/etc/sysconfig/modules/ipvs.modules
#!/bin/bash
ipvs_modules_dir="/usr/lib/modules/`uname -r`/kernel/net/netfilter/ipvs"
for i in \`ls \$ipvs_modules_dir | sed -r 's#(.*).ko.xz#\1#'\`; do
/sbin/modinfo -F filename \$i &> /dev/null
if [ \$? -eq 0 ]; then
/sbin/modprobe \$i
fi
done
EOF
cat <<EOF >/etc/modules-load.d/ipvs.conf
#!/bin/bash
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF
- 执行以下命令授权并执行
# 授权
chmod +x /etc/sysconfig/modules/ipvs.modules
#载入 ipvs 模块
bash /etc/sysconfig/modules/ipvs.modules
#查看模块是否已经载入成功
lsmod | grep ip_vs
- 在 master节点,修改编辑 kube-proxy 的 configmap 文件,修改模式为 ipvs 。
# 执行以下命令
kubectl edit configmaps kube-proxy -n kube-system
找到如下信息,修改 mode: "ipvs":
37 ipvs:
38 excludeCIDRs: null
39 minSyncPeriod: 0s
40 scheduler: ""
41 strictARP: false
42 syncPeriod: 0s
43 tcpFinTimeout: 0s
44 tcpTimeout: 0s
45 udpTimeout: 0s
46 kind: KubeProxyConfiguration
47 metricsBindAddress: ""
48 mode: "ipvs"
- 其中 mode 默认为空,使用 iptables 模式。
- scheduler 为空,默认负载均衡算法为轮询。
- 重启生效
# ipvs模式并没有立即生效,删除 kube-proxy 的 pod, 由 DaemonSet 控制,删除之后 DaemonSet 会重新在每个节点创建
kubectl delete pods -n kube-system -l k8s-app=kube-proxy
kubectl get pods -n kube-system -l k8s-app=kube-proxy
- 再次查看修改成功
kubectl logs kube-proxy-wxctx -n kube-system |grep Using
修改配置文件 ¶
kube-proxy的配置文件 /opt/kubernetes/config/kube-proxy.conf
添加参数:
KUBE_PROXY_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/opt/kubernetes/logs \
--hostname-override=node1 \
--proxy-mode=ipvs \ #添加这个参数
--config=/opt/kubernetes/config/kube-proxy-config.yml"
重启服务 ¶
systemctl restart kube-proxy.service
查看是否切换成功 ¶
journalctl -u kube-proxy.service