IPVS (IP Virtual Server,IP虚拟服务器)是基于Netfilter的、作为linux内核的一部分实现传输层负载均衡的技术,通常称为第4层LAN交换。
IPVS集成在LVS(Linux Virtual Server)中,它在主机中运行,并在真实服务器集群前充当负载均衡器。IPVS可以将对TCP/UDP服务的请求转发给后端的真实服务器,并使真实服务器的服务在单个IP地址上显示为虚拟服务。因此IPVS天然支持Kubernetes Service。
随着kubernetes使用量的增长,其资源的可扩展性变得越来越重要。特别是对于使用kubernetes运行大型工作负载的开发人员或者公司来说,service的可扩展性至关重要。
kube-proxy是为service构建路由规则的模块,之前依赖iptables来实现主要service类型的支持,比如(ClusterIP和NodePort)。但是iptables很难支持上万级的service,因为iptables纯粹是为防火墙而设计的,并且底层数据结构是内核规则的列表。
kubernetes早在1.6版本就已经有能力支持5000多节点,这样基于iptables的kube-proxy就成为集群扩容到5000节点的瓶颈。举例来说,如果在一个5000节点的集群,我们创建2000个service,并且每个service有10个pod,那么我们就会在每个节点上有至少20000条iptables规则,这会导致内核非常繁忙。
基于IPVS的集群内负载均衡就可以完美的解决这个问题。IPVS是专门为负载均衡设计的,并且底层使用哈希表这种非常高效的数据结构,几乎可以允许无限扩容。
IPVS模式在Kubernetes v1.8中引入,并在v1.9中进入了beta。 1.11中实现了GA(General Availability)。IPTABLES模式在v1.1中添加,并成为自v1.2以来的默认操作模式。 IPVS和IPTABLES都基于netfilter。 IPVS模式和IPTABLES模式之间的差异如下:
确保IPVS需要内核模块
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
查看是否被加载
$ ls /usr/lib/modules/3.10.0-514.el7.x86_64/kernel/net/netfilter/ipvs/ |grep -e ip_vs
ip_vs_dh.ko
ip_vs_ftp.ko
ip_vs.ko
ip_vs_lblc.ko
ip_vs_lblcr.ko
ip_vs_lc.ko
ip_vs_nq.ko
ip_vs_pe_sip.ko
ip_vs_rr.ko
ip_vs_sed.ko
ip_vs_sh.ko
ip_vs_wlc.ko
ip_vs_wrr.ko
$ ls /usr/lib/modules/3.10.0-514.el7.x86_64/kernel/net/ipv4/netfilter/ |grep nf_conntrack_ipv4
nf_conntrack_ipv4.ko
或
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
或
cut -f1 -d " " /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4
如果没有,使用下面的命令加载
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
在使用IPVS模式之前,还应在节点上安装ipset等软件包。
默认情况下,Kube-proxy在以kubeadm部署的集群中以iptables模式运行。查看日志如下
[root@master] ~$ kubectl logs kube-proxy-58j2k -n kube-system
W0115 11:00:48.003306 1 server_others.go:295] Flag proxy-mode="" unknown, assuming iptables proxy
I0115 11:00:48.814060 1 server_others.go:148] Using iptables Proxier.
I0115 11:00:48.831178 1 server_others.go:178] Tearing down inactive rules.
I0115 11:00:51.566086 1 server.go:464] Version: v1.13.0
修改ConfigMap的kube-system/kube-proxy中的config.conf
[root@master] ~$ kubectl edit cm kube-proxy -n kube-system
configmap/kube-proxy edited
#修改如下
kind: MasterConfiguration
apiVersion: kubeadm.k8s.io/v1alpha1
...
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 30s
kind: KubeProxyConfiguration
metricsBindAddress: 127.0.0.1:10249
mode: "ipvs" #修改
...
之后重启各个节点上的kube-proxy(删除后会自动重新创建)
[root@master] ~$ kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
pod "kube-proxy-7dstj" deleted
pod "kube-proxy-lx887" deleted
pod "kube-proxy-nfsb9" deleted
pod "kube-proxy-pkj44" deleted
[root@master] ~$ kubectl get pod -n kube-system | grep kube-proxy
kube-proxy-47dh9 1/1 Running 0 13s
kube-proxy-64qnx 1/1 Running 0 17s
kube-proxy-cbm26 1/1 Running 0 20s
kube-proxy-xnpnn 1/1 Running 0 15s
再次查看日志,可以看到ipvs已经启用了
[root@master] ~$ kubectl logs kube-proxy-47dh9 -n kube-system
I0118 22:12:10.119829 1 server_others.go:189] Using ipvs Proxier.
W0118 22:12:10.120601 1 proxier.go:381] IPVS scheduler not specified, use rr by default
I0118 22:12:10.120714 1 server_others.go:216] Tearing down inactive rules.
I0118 22:12:10.158816 1 server.go:464] Version: v1.13.2
I0118 22:12:10.163081 1 conntrack.go:52] Setting nf_conntrack_max to 131072
I0118 22:12:10.172084 1 config.go:202] Starting service config controller
I0118 22:12:10.172149 1 controller_utils.go:1027] Waiting for caches to sync for service config controller
I0118 22:12:10.172184 1 config.go:102] Starting endpoints config controller
I0118 22:12:10.172188 1 controller_utils.go:1027] Waiting for caches to sync for endpoints config controller
I0118 22:12:10.272577 1 controller_utils.go:1034] Caches are synced for endpoints config controller
I0118 22:12:10.272629 1 controller_utils.go:1034] Caches are synced for service config controller
https://segmentfault.com/a/1190000016333317
http://www.10tiao.com/html/606/201807/2664605531/1.html