kubernetes1.8版本开始,kube-proxy引入了ipvs模式,kube-proxy监控pod的变化并创建ipvs rules,ipvs与iptables类似,也是在kernel下通过netfilter实现的,但是采用hash表存储规则,在规则多的情况下,hash表查询速率的优势就会显现出来。

开启内核参数

cat >> /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# 是配置生效
sysctl -p

安装ipvs

yum install -y ipvsadm ipset

# 临时生效
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

配置kube-proxy

# 修改 mode 字段,修改成 mode: "ipvs"
kubectl edit cm kube-proxy -n kube-system
# 重新生成kube-proxy
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

测试是否生效

ipvsadm -L -n