关注分享主机优惠活动
国内外VPS云服务器

解读kube-proxy(kube_proxy)的ipvs模式

摘要:添加了一种模式,该模式已成为默认操作模式。 支持比最小负载、最少连接、位置、加权等更复杂的负载均衡算法。 默认情况下,已安装的集群在已部署的集群内以 模式运行。

IPVS

本文主要内容包括:

什么是IPVS?

IPVS和IPTABLES的区别

如何配置kube-proxy以ipvs模式运行以及故障排除

什么是IPVS?

IPVS(IP虚拟服务器)实现传输层负载平衡(也称为第4层LAN交换),它是内核的一部分。

IPVS 在主机上运行,​​并充当真实服务器集群前面的负载平衡器。 IPVS 将基于 TCP 和 UDP 的服务的请求定向到真实服务器,并允许真实服务器的服务在单个 IP 地址上显示为虚拟服务。

比较 IPVS 和 IPTABLES

IPVS 模式在 Kubernetes v1.8 中引入,并在 v1.9 中进入测试版。 IPTABLES 模式是在 v1.1 中添加的,并且从 v1.2 开始一直是默认操作模式。 IPVS 和IPTABLES 都基于netfilter。 IPVS模式与IPTABLES模式的区别如下:

IPVS 为大型集群提供了出色的可扩展性和性能。

IPVS支持比iptables更复杂的负载均衡算法(最小负载、最少连接、位置、权重等)。

IPVS 支持服务器健康检查、连接重试等。

ipvs什么时候降级为iptables?

IPVS代理在包过滤场景中使用iptables。 、SNAT 和支持的 NodePort 类型服务。 具体来说,ipvs代理在四种情况下返回iptables:

kube-proxy启动项设置–masquerade-all=true

如果 kube-proxy 以 --masquerade-all = true 开头,ipvs proxy 会将所有访问服务集群 IP 的流量引导至 Masquerade 。 其行为与 iptables 代理相同。 假设您有一个集群 IP 10.244.5.1 和端口 8080 的服务,则 ipvs 代理安装的 iptables 如下所示:

# iptables -t nat -nLChain PREROUTING (policy ACCEPT)target prot opt 源目的地 KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0 /0 /* kubernetes 服务入口 */Chain OUTPUT (policy ACCEPT)target prot opt 源目的地 KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes 服务入口 * /Chain POSTROUTING (Policy ACCEPT)target prot opt 源目的地 KUBE-POSTROUTING all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes postrouting规则 */Chain KUBE-POSTROUTING (see 1)target prot opt source destination MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 /* 需要SNAT的kubernetes服务流量 */ Mark match 0x4000 /0x4000Chain KUBE-MARK-DROP (0引用)target prot opt 源目的地 MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK 或 0x8000Chain KUBE-MARK [ k4]MASQ (见6)target prot opt 源目的地 MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK 或 0x4000Chain KUBE-SERVICES (见2)target prot opt ​​源目标 KUBE[ k4]MARK-MASQ tcp -- 0.0.0.0/0 10.244.5.1/*default/foo:http 集群 IP */ tcp dpt:8080
启动 kube-proxy 时指定集群 CIDR

如果 kube-proxy 为 [k4 ] 时以 -cluster-cidr = 开始,ipvs 代理模拟集群外部访问服务集群 IP 的流量,其行为与 iptables 代理相同。 假设 kube-proxy 在集群 cidr 10.244.16.0/24 上提供服务,服务集群 IP 为 10.244.5.1,端口为 8080,则 ipvs 代理安装的 iptables 将是:

# iptables -t nat -nLChain PREROUTING (policy ACCEPT)target prot opt 源目的地 KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0 /0 /* kubernetes 服务入口 */Chain OUTPUT (policy ACCEPT)target prot opt 源目的地 KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes 服务入口 * /Chain POSTROUTING (Policy ACCEPT)Target Proto Opt Sourcetarget KUBE-POSTROUTING all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes postrouting 规则 */Chain KUBE-POSTROUTING (1references)target prot opt 源目的地 MASQUERADE all [ k4 ] [ k4] 0.0.0.0/0 0.0.0.0/0 /* 需要SNAT的kubernetes服务流量 */ 标记匹配 0x4000/0x4000Chain KUBE-MARK-DROP (0引用)target prot opt 源目的地 MARK all [ k4] - 0.0.0.0/0 0.0.0.0/0 MARK 或 0x8000Chain KUBE-MARK-MASQ (见 6) target prot opt 源目标 MARK all -- 0.0。   0.0/0 0.0.0.0 /0 MARK 或 0x4000Chain KUBE-SERVICES(参见 2)目标 prot选择源目的地 KUBE-MARK-MASQ tcp -- !10.244.16.0/24 10.244.5.1 /* Default/foo:http 集群 IP */ tcp dpt:8080
为 LB 类型的服务指定负载均衡器源范围

如果服务的 LoadBalancerStatus.ingress.IP 不为空并且指定了服务的 LoadBalancerSourceRanges,则 ipvs 代理程序将在 上安装 iptables。
假设服务的 LoadBalancerStatus.ingress.IP 为 10.96.1.2,服务的 LoadBalancerSourceRanges 为 10.120.2.0/24。

# iptables -t nat -nLChain PREROUTING (policy ACCEPT)target prot opt 源目的地 KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0 /0 /* kubernetes 服务入口 */Chain OUTPUT (policy ACCEPT)target prot opt 源目的地 KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes 服务入口 */Chain POSTROUTING (policy ACCEPT)target prot opt 源目的地 KUBE-POSTROUTING all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes postrouting Rules * /Chain KUBE-POSTROUTING (1references)target prot opt source destination MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 /* 需要 SNAT 的 kubernetes 服务流量 */ mark match 0x4000 / 0x4000Chain KUBE[ k4]MARK-DROP (0引用)target prot opt 源目的地 MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK 或 0x8000Chain KUBE-MARK- ]MASQ(6)目标prot opt源目标MARK所有-- 0.0.0.0/0 0.0.0.0/0 MARK 或 0x4000Chain KUBE-SERVICES (参见 2) target prot opt 源目的地 ACCEPT tcp -- 10.120.2.0/24 10.96.1.2 /* 默认/foo:http 负载均衡器 IP */ tcp dpt:8080DROP tcp -- 0.0.0.0/0 10.96.1.2 /* 默认/foo:http 负载均衡器 IP */ tcp dpt:8080
支持NodePort类型服务

为了支持NodePort类型服务,ipvs延续了iptables代理的现有实现。 例如,

# kubectl description svc nginx-serviceName: nginx-service...Type: NodePortIP: 10.101.28.148Port: http 3080/TCPNodePort: http 31604/TCPEndpoints: 172.17.0.2 : 80 会话亲和性: 无# iptables -t nat -nL[root@100-106-179-225 ~]# iptables -t nat -nLChain PREROUTING (policy ACCEPT)target prot opt 源目的地 KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes 服务门户 */Chain OUTPUT (policy ACCEPT)target prot opt ​​source 目的地 KUBE-SERVICES all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes 服务门户 */Chain KUBE-SERVICES (参见2) target prot opt ​​source目标 KUBE-MARK -MASQ tcp -- !172.16.0.0/16 10.101.28.148 /* default/nginx-service:http 集群 IP */ tcp dpt:3080KUBE-SVC[ k4]6IM33IEVEEV7U3GP tcp [k4 ]- 0.0.0.0/0 10.101.28.148 /* default/nginx-service:http 集群 IP */ tcp dpt:3080KUBE-NODEPORTSall -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes 服务的节点端口;注意:这必须是该链中的最后一条规则 */ ADDRTYPE match dst-type LOCALChain KUBE[k4 ]NODEPORTS (见1) target prot opt 源目的地 KUBE-MARK-MASQ tcp - - 0.0.0.0/0 0.0.0.0/0 /* default/nginx-service: http */ tcp dpt: 31604KUBE-SVC-6IM33IEVEEV7U3GP tcp -- 0.0.0.0/0 0.0.0.0/0 /*default/nginx-service:http */ tcp dpt:31604Chain KUBE [ k4]SVC-6IM33IEVEEV7U3GP(见2)target prot opt源destinationKUBE-SEP-Q3UCPZ54E6Q2R4UT All -- 0.0.0.0/0 0.0.0.0/0 /* Default/nginx[k4 ] 服务:http */Chain KUBE-SEP-Q3UCPZ54E6Q2R4UT(见1) target prot opt 源目的地 KUBE-MARK-MASQ all -- 172.17.0.2 0.0.0.0/0 /*default/nginx-service:http */DNAT tcp [ k4]- 0.0.0.0/0 0.0.0.0/0 /*default/nginx-service:http */ tcp to:172.17.0.2:80

马苏中的 kube[k4 。 ipvs mode ]proxy先决条件

确保IPVS需要内核模块

ip_vsip_vs_rrip_vs_wrrip_vs_shnf_conntrack_ipv4

申诉确保Node内核已编译进入节点内核。 使用

grep -e ipvs -e nf_conntrack_ipv4 /lib/modules/$(uname -r)/modules.builtin

编译进内核时,接下来它看起来像这样。 结果如下。

kernel/net/ipv4/netfilter/nf_conntrack_ipv4.kokernel/net/netfilter/ipvs/ip_vs.kokernel/net/netfilter/ipvs/ip_vs_rr.kokernel/net/netfilter/ipvs/ip_vs_wrr.kokernel/net /netfilter/ipvs/ip_vs_lc.kokernel/net/netfilt呃/ipvs/ip_vs_wlc.kokernel/net/netfilter/ipvs/ip_vs_fo.kokernel/net/netfilter/ipvs/ip_vs_ovf.kokernel/net/netfilter/ipvs/ip_vs_lblc.kokernel/net/netfilter/ipvs/ip_vs_lblcr.kokernel/net/ netfilter/ipvs/ip_vs_dh.kokernel/net/netfilter/ipvs/ip_vs_sh.kokernel/net/netfilter/ipvs/ip_vs_sed.kokernel/net/netfilter/ipvs/ip_vs_nq.kokernel/net/netfilter/ipvs/ip_vs_ftp.ko

加载了吗?

#load module modprobe -- ip_vsmodprobe -- ip_vs_rrmodprobe -- ip_vs_wrrmodprobe -- ip_vs_shmodprobe [ k4]- nf_conntrack_ipv4# 检查加载的模块 usemod | grep -e ipvs -e nf_conntrack_ipv4# orcut -f1 -d " " /proc/modules | grep -e ip_vs [k4 ]e nf_conntrack_ipv4

使用IPVS模式之前,节点上还必须安装ipset等软件包。

如果不满足这些要求,Kube-proxy 将恢复到 IPTABLES 模式。

库beadm 安装的集群

默认情况下,Kube-proxy 在 kubeadm 部署的集群中以 iptables 模式运行。

如果您在配置文件中使用 kubeadm,则可以在 kubeProxy 字段中指定 ipvs 模式并添加 SupportIPVSProxyMode: true。

kind: MasterConfigurationapiVersion: kubeadm.k8s.io/v1alpha1...kubeProxy: config: featureGates: SupportIPVSProxyMode=true mode: ipvs...

您正在使用 Kubernetes v1 案例。 在 8 中,您还可以将标志 --feature-gates = SupportIPVSProxyMode = true 添加到 kubeadm init 命令(自 v1.9 起已弃用)

kubeadm init - [k4 ] feature-gates=SupportIPVSProxyMode=true

PS

如果成功启用ipvs模式,则会显示ipvs代理规则(使用ipvsadm)。 示例:

# ipvsadm -lnIP 虚拟服务器版本 1.2.1 (大小 = 4096)Prot LocalAddress:端口调度程序标志 -> RemoteAddress:端口转发权重 ActiveConn InActConnTCP 10.0.0.1:443 rrpercient 10800 -> 192.168.0.1 :6443Masq 1 1 0

如果本地集群正在运行,kube-proxy日志中也会出现类似的日志(例如本地集群上的 /tmp/kube-proxy.log )。

使用 ipvs 代理。  

但是,要么 ipvs 代理规则不存在,要么以下日志显示 kube-proxy 无法使用 ipvs 模式:

Can't use ipvs proxy Don' 

调试和故障排除检查ipvs代理规则

用户可以使用ipvsadm工具检查kube -proxy是否维护IPVS例如,您的集群中有以下服务:

# kubectl get svc --all-namespacesNAMESPACE NAME TYPE CLUSTER-IP external-IP port AGEdefault kubernetes ClusterIP 10.0.0.1  443/TCP 1dkube-system kube-dns ClusterIP 10.0 .0.10  53/UDP,53/TCP 1d

显示以下规则:

 # ipvsadm -lnIP 虚拟服务器版本 1.2.1 (size= 4096)ProtLocalAddress:端口调度uler 标志 -> RemoteAddress:端口转发权重 ActiveConn InActConnTCP 10.0.0.1:443 rr 持久 10800 -> 192.168.0.1:6443 Masq 1 1 0TCP 10.0.0.10:53 rr -> 172.17.0.2:53 Masq 1 0 0UDP 10.0.0.10:53 rr -> 172.17.0.2:53 Masq 1 0 0

为什么我无法在 ipvs 模式下启动 kube-proxy

启用 Function Gateway

对于 Kubernetes v1.10 及更高版本,Function Gate SupportIPVSProxyMode 默认设置为 true。 但是,对于 v1.10 之前的 Kubernetes,您必须显式启用 --feature-gates=SupportIPVSProxyMode=true。

指定 proxy-mode=ipvs。

检查 kube- 代理模式是否设置为 ipvs。

安装所需的内核模块和软件包。

检查ipvs所需的内核模块是否编译到内核和软件包中。 (参见先决条件)

未经允许不得转载:主机频道 » 解读kube-proxy(kube_proxy)的ipvs模式

相关推荐

评论 抢沙发

评论前必须登录!