跳转至

将 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