资讯专栏INFORMATION COLUMN

kube-proxy的ipvs模式解读

wangbinke / 2494人阅读

摘要:模式在中添加,并成为自以来的默认操作模式。支持比更复杂的负载平衡算法最小负载,最少连接,位置,加权等。安装的集群默认情况下,将在部署的集群中以模式运行。

IPVS

这篇文章主要讲述:

什么是IPVS?

IPVS 和 IPTABLES 区别

如何设置kube-proxy按照ipvs模式运行和故障排查

什么是IPVS

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

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

IPVS vs. IPTABLES

IPVS模式在Kubernetes v1.8中引入,并在v1.9中进入了beta。 IPTABLES模式在v1.1中添加,并成为自v1.2以来的默认操作模式。 IPVS和IPTABLES都基于netfilter。 IPVS模式和IPTABLES模式之间的差异如下:

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

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

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

什么时候ipvs会降级到iptables

IPVS proxier将使用iptables,在数据包过滤,SNAT和支持NodePort类型的服务这几个场景中。具体来说,ipvs proxier将在以下4个场景中回归iptables。

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

如果kube-proxy以--masquerade-all = true开头,则ipvs proxier将伪装访问服务群集IP的所有流量,其行为与iptables proxier相同。假设有一个群集IP 10.244.5.1和端口8080的服务,那么ipvs proxier安装的iptables应该如下所示。

# iptables -t nat -nL

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
KUBE-POSTROUTING  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes postrouting rules */

Chain KUBE-POSTROUTING (1 references)
target     prot opt source               destination         
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000

Chain KUBE-MARK-DROP (0 references)
target     prot opt source               destination         
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x8000

Chain KUBE-MARK-MASQ (6 references)
target     prot opt source               destination         
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x4000

Chain KUBE-SERVICES (2 references)
target     prot opt source               destination         
KUBE-MARK-MASQ  tcp  -- 0.0.0.0/0        10.244.5.1            /* default/foo:http cluster IP */ tcp dpt:8080
在kube-proxy启动中指定集群CIDR

如果kube-proxy以--cluster-cidr = 开头,则ipvs proxier将伪装访问服务群集IP的群集外流量,其行为与iptables proxier相同。假设kube-proxy随集群cidr 10.244.16.0/24提供,服务集群IP为10.244.5.1,端口为8080,则ipvs proxier安装的iptables应如下所示。

# iptables -t nat -nL

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
KUBE-POSTROUTING  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes postrouting rules */

Chain KUBE-POSTROUTING (1 references)
target     prot opt source               destination         
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000

Chain KUBE-MARK-DROP (0 references)
target     prot opt source               destination         
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x8000

Chain KUBE-MARK-MASQ (6 references)
target     prot opt source               destination         
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x4000

Chain KUBE-SERVICES (2 references)
target     prot opt source               destination         
KUBE-MARK-MASQ  tcp  -- !10.244.16.0/24        10.244.5.1            /* default/foo:http cluster IP */ tcp dpt:8080
为LB类型服务指定Load Balancer Source Ranges

当服务的LoadBalancerStatus.ingress.IP不为空并且指定了服务的LoadBalancerSourceRanges时,ipvs proxier将安装iptables,如下所示。
假设服务的LoadBalancerStatus.ingress.IP为10.96.1.2,服务的LoadBalancerSourceRanges为10.120.2.0/24。

# iptables -t nat -nL

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
KUBE-POSTROUTING  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes postrouting rules */

Chain KUBE-POSTROUTING (1 references)
target     prot opt source               destination         
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000

Chain KUBE-MARK-DROP (0 references)
target     prot opt source               destination         
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x8000

Chain KUBE-MARK-MASQ (6 references)
target     prot opt source               destination         
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x4000

Chain KUBE-SERVICES (2 references)
target     prot opt source       destination         
ACCEPT  tcp  -- 10.120.2.0/24    10.96.1.2       /* default/foo:http loadbalancer IP */ tcp dpt:8080
DROP    tcp  -- 0.0.0.0/0        10.96.1.2       /* default/foo:http loadbalancer IP */ tcp dpt:8080
支持 NodePort type service

为了支持NodePort类型的服务,ipvs将在iptables proxier中继续现有的实现。例如,

# kubectl describe svc nginx-service
Name:           nginx-service
...
Type:           NodePort
IP:             10.101.28.148
Port:           http    3080/TCP
NodePort:       http    31604/TCP
Endpoints:      172.17.0.2:80
Session Affinity:   None

# iptables -t nat -nL

[root@100-106-179-225 ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain KUBE-SERVICES (2 references)
target     prot opt source               destination         
KUBE-MARK-MASQ  tcp  -- !172.16.0.0/16        10.101.28.148        /* default/nginx-service:http cluster IP */ tcp dpt:3080
KUBE-SVC-6IM33IEVEEV7U3GP  tcp  --  0.0.0.0/0            10.101.28.148        /* default/nginx-service:http cluster IP */ tcp dpt:3080
KUBE-NODEPORTS  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service nodeports; NOTE: this must be the last rule in this chain */ ADDRTYPE match dst-type LOCAL

Chain KUBE-NODEPORTS (1 references)
target     prot opt source               destination         
KUBE-MARK-MASQ  tcp  --  0.0.0.0/0            0.0.0.0/0            /* default/nginx-service:http */ tcp dpt:31604
KUBE-SVC-6IM33IEVEEV7U3GP  tcp  --  0.0.0.0/0            0.0.0.0/0            /* default/nginx-service:http */ tcp dpt:31604

Chain KUBE-SVC-6IM33IEVEEV7U3GP (2 references)
target     prot opt source               destination
KUBE-SEP-Q3UCPZ54E6Q2R4UT  all  --  0.0.0.0/0            0.0.0.0/0            /* default/nginx-service:http */
Chain KUBE-SEP-Q3UCPZ54E6Q2R4UT (1 references)
target     prot opt source               destination         
KUBE-MARK-MASQ  all  --  172.17.0.2           0.0.0.0/0            /* default/nginx-service:http */
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            /* default/nginx-service:http */ tcp to:172.17.0.2:80
以 ipvs 模式 运行kube-proxy 前提条件

确保IPVS需要内核模块

ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4

检查上诉已编译到节点内核中。使用

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

如果编译成内核,则得到如下结果。

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

是否被加载

# load module 
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

# to check loaded modules, use
lsmod | grep -e ipvs -e nf_conntrack_ipv4
# or
cut -f1 -d " "  /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4

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

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

kubeadm 安装的集群

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

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

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

如果您使用的是Kubernetes v1.8,您还可以在kubeadm init命令中添加标志--feature-gates = SupportIPVSProxyMode = true(自v1.9起不推荐使用)

kubeadm init --feature-gates=SupportIPVSProxyMode=true
PS

如果成功启用了ipvs模式,你应该看到ipvs代理规则(使用ipvsadm)例如:

# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.1:443 rr persistent 10800
  -> 192.168.0.1:6443             Masq    1      1          0

当本地群集运行时,kube-proxy日志中会出现类似的日志(例如,本地群集的/tmp/kube-proxy.log):

Using ipvs Proxier.

然而没有ipvs代理规则或有以下日志则表明kube-proxy无法使用ipvs模式:

Can"t use ipvs proxier, trying iptables proxier
Using iptables Proxier.
调试和排查 检查ipvs 代理规则

用户可以使用ipvsadm工具检查kube-proxy是否正确维护IPVS规则。例如,我们在集群中有以下服务:

# kubectl get svc --all-namespaces
NAMESPACE     NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE
default       kubernetes   ClusterIP   10.0.0.1             443/TCP         1d
kube-system   kube-dns     ClusterIP   10.0.0.10            53/UDP,53/TCP   1d

我们应该能看到如下的规则:

 # ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.1:443 rr persistent 10800
  -> 192.168.0.1:6443             Masq    1      1          0
TCP  10.0.0.10:53 rr
  -> 172.17.0.2:53                Masq    1      0          0
UDP  10.0.0.10:53 rr
  -> 172.17.0.2:53                Masq    1      0          0
为什么kube-proxy不能以ipvs模式启动

Enable IPVS feature gateway

对于Kubernetes v1.10及更高版本,功能门SupportIPVSProxyMode默认设置为true。但是,您需要在v1.10之前为Kubernetes明确启用--feature-gates = SupportIPVSProxyMode = true。

指定proxy-mode=ipvs

检查kube-proxy模式是否已设置为ipvs

安装所需的内核模块和包

检查是否已将ipvs所需的内核模块编译到内核和软件包中。 (见前提条件)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/33061.html

相关文章

  • kube-proxyipvs模式解读

    摘要:模式在中添加,并成为自以来的默认操作模式。支持比更复杂的负载平衡算法最小负载,最少连接,位置,加权等。安装的集群默认情况下,将在部署的集群中以模式运行。 IPVS 这篇文章主要讲述: 什么是IPVS? IPVS 和 IPTABLES 区别 如何设置kube-proxy按照ipvs模式运行和故障排查 什么是IPVS IPVS(IP虚拟服务器)实现传输层负载平衡,通常称为第4层LAN交...

    zhkai 评论0 收藏0
  • 【容器云 UK8S】产品简介:漏洞修复记录、集群节点配置推荐和kube-proxy模式选择

    摘要:模式选择是中的关键组件其主要功能是在和其后端之间进行负载均衡。详见后续测试数据对于集群规模中等,数量不多的,推荐选择。模式下,使用负载均衡代替了。漏洞修复记录HTTP/2漏洞升级说明Runc容器逃逸漏洞修复说明cloudprovider更新20.10.1集群节点配置推荐1、Master配置推荐Master规格跟集群规模有关,集群规模越大,所需要的Master规格也越高,不同集群规模的,Mas...

    Tecode 评论0 收藏0
  • kube-proxy源码解析

    摘要:广告离线安装包,仅需三步源码解析相对于模式具备较高的性能与稳定性本文讲以此模式的源码解析为主,如果想去了解模式的原理,可以去参考其实现,架构上无差别。主要功能是监听和的事件,然后下放代理策略到机器上。 广告 | kubernetes离线安装包,仅需三步 kube-proxy源码解析 ipvs相对于iptables模式具备较高的性能与稳定性, 本文讲以此模式的源码解析为主,如果想去了解...

    thursday 评论0 收藏0
  • kube-proxy源码解析

    摘要:广告离线安装包,仅需三步源码解析相对于模式具备较高的性能与稳定性本文讲以此模式的源码解析为主,如果想去了解模式的原理,可以去参考其实现,架构上无差别。主要功能是监听和的事件,然后下放代理策略到机器上。 广告 | kubernetes离线安装包,仅需三步 kube-proxy源码解析 ipvs相对于iptables模式具备较高的性能与稳定性, 本文讲以此模式的源码解析为主,如果想去了解...

    X1nFLY 评论0 收藏0
  • 【容器云UK8S】产品简介

    摘要:完全兼容原生的,以私有网络为基础,并整合了等云产品。综合资源有效利用率错误容忍度两个因素,在不考虑业务混合部署业务总体规模大小的情况下,我们建议生产环境的节点应该介于核至核之间。模式是一个用于负载均衡的内核功能。产品概念UCloud Container Service for Kubernetes (UK8S)是一项基于Kubernetes的容器管理服务,你可以在UK8S上部署、管理、扩展你...

    Tecode 评论0 收藏0

发表评论

0条评论

wangbinke

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<