在原有k8s基础上ipvs代替iptables

/ k8s / 没有评论 / 38浏览

开启ipvs

由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块

ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4

加载ipvs所有模块:

/etc/sysconfig/modules/ipvs.modules # 该文件保证开机自动加载,所有节点都需要执行

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
for i in $(ls $ipvs_mods_dir | grep -o "^[^.]*"); do
    /sbin/modinfo -F filename $i &> /dev/null
    if [ $? -eq 0 ]; then
        /sbin/modprobe $i
    fi
done
EOF
# 临时生效
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
# 永久生效
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

开启ipvs支持

# yum -y install ipset* ipvsadm
# chmod +x /etc/sysconfig/modules/ipvs.modules
# /etc/sysconfig/modules/ipvs.modules   # 手动执行一次

开启路由转发

系统初始化时已执行过 略过

# cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
EOF
# modprobe br_netfilter
# sysctl -p

查看是否加载

lsmod | grep -e ip_vs

修改ConfigMap

kube-system/kube-proxy中的config.conf

kubectl edit cm kube-proxy -n kube-system
···
 39行 mode: "" -> mode: "ipvs"
···

# 重启所有工作节点的kube-proxy pod
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

# 查看是否生效
kubectl get pod -n kube-system --output=wide | grep kube-proxy

查看ipvs规则

[root@k8s-master ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.96.0.1:443 rr
  -> 192.168.0.171:6443           Masq    1      0          0
TCP  10.96.0.10:53 rr
UDP  10.96.0.10:53 rr