k8s集群网络(9)-service之iptables与ipvs对比

在前面的几篇文章里我们介绍了基于iptables和ipvs模式下cluster ip类型的service和node port类型的service实现原理,这里我们做一下回顾总结和对比,相关文章可以参考如下:

对于iptable方式的service:

  • 流量从pod network namespace(cluster ip类型的service)或者外部(node port类型的service)进入到host netwok namespace之中。

  • 在host netwok namespace的PREROUTING chain中会经过一系列target,KUBE-SERVICES(cluster ip类型的service),KUBE-NODEPORTS (node port类型的service),KUBE-SVC-XXX,KUBE-SEP-XXX。

  • 在这些target里根据iptable内核随机模块random来实现匹配endpoint target,实现负载均衡。

  • 在endpoint target(KUBE-SEP-XXX)里实现了DNAT,也就是将目标地址cluster ip转化为实际的pod的ip。

  • 数据包经过以上修改根据host network namespace的路由表做下一跳路由选择。

对于ipvs方式的service:

  • 流量从pod network namespace(cluster ip类型的service)或者外部(node port类型的service)进入到host netwok namespace之中。

  • 对于clutser ip类型的service,在host netwok namespace的PREROUTING chain中经过匹配ipset KUBE-CLUSTER-IP做mask标记操作。

  • 对于node port类型的service,在PREROUTING chain中经过匹配ipset KUBE-NODE-PORT-TCP做mask标记操作。

  • 对于clutser ip类型的service,由于host network namespace中有创建网络设备kube-ipvs0,并且绑定所有cluster ip,这样从pod发出的数据包目标ip为cluster ip,有kube-ipvs0网络设备对应,数据进入INPUT chain中。

  • 对于node port类型的service,由于数据包的目标ip是host的ip地址,所以也进入了host network namespace的INPUT chain中。

  • 利用linux内核模块ipvs,数据在INPUT chain中被ipvs的规则修改(可由ipvsadm查看规则),完成负载均衡和DNAT,然后将数据直接送入POSTROUTING chain。

  • 数据在POSTROUTING chain中,经过KUBE-POSTROUTING target,根据之前的mark操作完成MASQUERADE SNAT。

  • 数据包经过以上修改根据host network namespace的路由表做下一跳路由选择。

对于iptable和ipvs方式的service:

  • 两者都是采用linux内核模块完成负载均衡和endpoint的映射,所有操作都在内核空间完成,没有在应用程序的用户空间。

  • iptable方式依赖于linux netfilter/iptable内核模块。

  • ipvs方式依赖linux netfilter/iptable模块,ipset模块,ipvs模块。

  • iptable方式中,host宿主中ipatble的entry数目会随着service和对应endpoints的数目增多而增多。举个例子,比如有10个cluster ip类型的service,每个service有6个endpoints。那么在KUBE-SERVICES target中至少有10个entries(KUBE-SVC-XXX)与10个service对应,每个KUBE-SVC-XXX target中会有6个KUBE-SEP-XXX与6个endpoints来对应,每个KUBE-SEP-XXX会有2个enrties来分别做mark masq和DNAT,这样算起来至少有10*6*2=120个entries在iptable中。试想如果application中service和endpoints数目巨大,iptable entries也是非常庞大的,在一定情况下有可能带来性能上的问题。

  • ipvs方式中host宿主中iptable的entry数目是固定的,因为iptable做匹配的时候会利用ipset(KUBE-CLUSTER-IP或者KUBE-NODE-PORT-TCP)来匹配,service的数目决定了ipset的大小,并不会影响iptable的大小。这样就解决了iptable模式下,entries随着service和endpoints的增多而增多的问题。

  • 对于负载均衡,iptable方式采用random模块来完成负载均衡,ipvs方式支持多种负载均衡,例如round-robin,least connection,source hash等(可参考http://www.linuxvirtualserver.org/),并且由kubelet启动参数--ipvs-scheduler控制。

  • 对于目标地址的映射,iptable方式采用linux原生的DNAT,ipvs方式则利用ipvs模块完成。

  • ipvs方式会在host netwok namespace中创建网络设备kube-ipvs0,并且绑定了所有的cluster ip,这样保证了cluster-ip类型的service数据进入INPUT chain,从而让ipvs来完成负载均衡和目标地址的映射。

  • iptable方式不会在host netwok namespace中创建额外的网络设备。

  • iptable方式数据在host network namespace的chain中的路径是:PREROUTING-->FORWARDING-->POSTROUTING 

    在PREROUTING chain中完成负载均衡,mark masq和目标地址映射。

  • ipvs方式数据在host network namespace的chain中的路径是:

    PREROUTING-->INPUT-->POSTROUTING 

    在PREROUTING chain中完成mark masq SNAT,在INPUT chain利用ipvs完成负载均衡和目标地址映射。

  • iptable和ipvs方式在完成负载均衡和目标地址映射后都会根据host network namespace的路由表做下一跳路由选择。

  • 关于iptable和ipvs方式的选择并没有固定答案,要根据项目的需求和实际情况而定。

目前先写到这里,下一篇文章里我们继续介绍k8s集群overlay网络中pod到pod的数据通讯。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
### 回答1: Kubernetes 的网络系统是由多个组件组成的, 它们协作为应用程序提供网络连接和通信. 其中一些主要的组件包括: - kube-proxy: 运行在每个节点上, 负责为 Pod 和 Service 提供代理服务. - kube-dns: 为应用程序提供 DNS 服务. - 网络插件: 用于为 Pod 提供网络连接, 支持不同的网络模型, 如 Calico, Flannel, Cilium 等. - Service: 为应用程序提供负载均衡和服务发现. Kubernetes 的网络模型是基于 Pod 的, 每个 Pod 都有一个独立的 IP 地址, 使得容器间直接通信成为可能. Service 则提供了一种发现和负载均衡的机制, 让外部客户端可以访问 Pod. ### 回答2: Kubernetes(K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。下面是一些与K8s网络相关的知识点。 1. 服务发现:K8s通过DNS(域名系统)服务提供内部服务发现机制。每个服务都会被分配一个唯一的域名,其他服务可以通过该域名访问该服务。 2. Pod网络:Pod是K8s中的最小调度单元,它可以包含一个或多个容器。每个Pod都有一个唯一的IP地址,容器可以通过本地回环地址访问其他Pod中的容器。 3. 容器网络接口(CNI):CNI是一个规范,用于定义容器网络的实现方式。K8s使用CNI插件来设置和管理Pod的网络。不同的CNI插件可以支持不同的网络方案,如VLAN、VXLAN、Calico等。 4. 服务代理:K8s使用服务代理来实现服务之间的通信。服务代理可以在集群各个节点上运行,并通过负载均衡来分发到后端Pod。 5. 网络策略:K8s允许用户通过网络策略来定义集群中的网络访问规则。网络策略可以限制哪些Pod可以与另一个Pod通信,以及允许的协议和端口。 6. Ingress控制器:Ingress控制器是K8s中用于管理入站网络流量的组件。它可以将外部流量路由到集群内部的服务,并提供负载均衡和SSL终止等功能。 7. 可插拔网络解决方案:K8s提供了一些可插拔的网络解决方案,如Flannel、Calico等。这些解决方案可以根据具体需求选择,以提供不同的网络拓扑结构和性能。 总而言之,K8s网络相关的知识点包括服务发现、Pod网络、CNI、服务代理、网络策略、Ingress控制器和可插拔网络解决方案。这些知识点帮助我们理解和管理K8s集群中的网络配置和通信。 ### 回答3: Kubernetes(简称k8s)是一种用于容器编排和管理的开源平台,它涉及到一些重要的网络概念和组件。 首先,k8s网络模型是基于虚拟网络的概念。每个k8s集群中的容器都会被分配一个独立的IP地址,并且可以通过这个IP地址跨节点进行通信。这是通过一个称为kube-proxy的组件实现的,它会在每个节点上监听API服务器上的变化,并使用iptables或者IPVS等工具在宿主机上进行流量转发。 其次,k8s通过Service和Endpoint来暴露和访问容器。Service是一个逻辑概念,用于封装一组具有相同功能的容器,在集群内部提供服务的访问入口。一个Service可以通过ClusterIP、NodePort或者LoadBalancer等不同的类型暴露。而Endpoint是实际运行容器的IP和端口的集合,用于告诉Service流量应该转发到哪里。 此外,k8s还支持Ingress资源,用于在集群外部暴露服务,实现外部访问。Ingress通过定义一个或多个规则,将外部流量转发到不同的Service上,从而实现域名或路径的复杂路由。 最后,网络插件是k8s网络中的重要组件。k8s提供了一些默认的网络插件,如Flannel、Calico等,用于管理Pod之间的网络通信。网络插件负责创建网络的子网和路由表,并将Pod的IP地址与宿主机的虚拟网卡进行关联。 总结来说,k8s网络涉及到虚拟网络、kube-proxy、Service、Endpoint、Ingress等概念和组件,这些都是为了实现容器间的通信和外部访问的需求。不同的网络插件可以根据具体需求选择,以满足集群网络需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值