service代理默认使用iptables规则通过内核模块netfilter实现流量转发,内核转发效率高,但是iptables不具备更为灵活的负载均衡策略,只是将流量随意的转发至后端Pod,当Pod不可用时也无法进行健康检查;就以下是将默认流量转发修改为ipvs。
启动ipvs模块
首先,您需要创建一个配置文件 /etc/sysconfig/modules/ipvs.modules,并将以下内容写入其中:
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
然后,将配置文件设置为可执行,并运行它,以加载所需的内核模块:
# chmod 755 /etc/sysconfig/modules/ipvs.modules
# bash /etc/sysconfig/modules/ipvs.modules
最后,您可以使用以下命令检查加载的内核模块:
lsmod | grep -e ip_vs -e nf_conntrack
[root@master modules]# lsmod | grep -e ip_vs -e nf_conntrack
nf_conntrack_ipv6 18935 7
nf_defrag_ipv6 35104 1 nf_conntrack_ipv6
nf_conntrack_netlink 36396 0
nfnetlink 14519 4 nf_tables,ip_set,nf_conntrack_netlink
nf_conntrack_ipv4 15053 10
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 145458 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 139264 10 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_nat_masquerade_ipv4,nf_nat_masquerade_ipv6,nf_conntrack_netlink,nf_conntrack_ipv4,nf_conntrack_ipv6
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
修改代理模式为ipvs
修改kube-proxy的comfigmaps文件
# kubectl get configmaps -n kube-system kube-proxy
NAME DATA AGE
kube-proxy 2 127d
# kubectl edit cm -n kube-system kube-proxy
44 mode: "ipvs" #默认mode: ""为空,使用iptables
# kubectl edit cm -n kube-system kube-proxy
configmap/kube-proxy edited
因为kube-prooxy是用daemonsets控制器创建的,直接删除kube-proxy的Pod,让他重建就可以了
# kubectl get pod --show-labels -n kube-system | grep kube-proxy #删除之前的pod名称
# kubectl delete pod -l k8s-app=kube-proxy -n kube-system
# kubectl get pod --show-labels -n kube-system | grep kube-proxy #删除后发现已经重建完成并运行
完成配置验证IPVS功能
查看日志"Using ipvs Proxier"
,"Creating dualStackProxier for ipvs"
已经使用并创建了ipvs。
[root@master modules]# kubectl logs kube-proxy-4jhpz -n kube-system | grep ipvs
I0406 02:33:33.709297 1 server_others.go:269] "Using ipvs Proxier"
I0406 02:33:33.709345 1 server_others.go:271] "Creating dualStackProxier for ipvs"
配置已经生效并且 kube-proxy 在 ipvs 模式下运行,可以验证 IPVS 功能是否正常。在一个运行着服务的 Node 上运行ipvsadm -Ln | grep <service-ip>
命令,将替换<service-ip>
为您实际的服务 IP 地址:
[root@master modules]# ipvsadm -Ln | grep 10.244.0.0
TCP 10.244.0.0:30002 rr
TCP 10.244.0.0:30179 rr
TCP 10.244.0.0:30186 rr
TCP 10.244.0.0:31000 rr
TCP 10.244.0.0:31270 rr
TCP 10.244.0.0:31847 rr
TCP 10.244.0.0:31935 rr
TCP 10.244.0.0:32080 rr
TCP 10.244.0.0:32222 rr
TCP 10.244.0.0:32443 rr
TCP 10.244.0.0:32469 rr
如果不能使用ipvsadm命令需要下载ipvsadm模块
yum install ipvsadm