在 iptables 工作模式下,iptables 中 KUBE-SEP-XXX 链上规则和 Pod 数量成正比,当集群规模增大(10000 个 Pod 以上)时每个 k8s 节点上 iptables 规则会快速上升,从而影响集群 Service 的连接速度以及 CPU 资源消耗。
前几篇文章已经分析了 service 的原理以及 kube-proxy iptables 模式的原理与实现,本篇文章会继续分析 kube-proxy ipvs 模式的原理与实现。
2020 年 9 月,UCloud 上线了 Serverless 容器产品 Cube,它具备了虚拟机级别的安全隔离、轻量化的系统占用、秒级的启动速度,高度自动化的弹性伸缩,以及简洁明了的易用性。结合虚拟节点技术(Virtual Kubelet),Cube 可以和 UCloud 容器托管产品 UK8S 无缝对接,极大地丰富了 Kubernetes 集群的弹性能力。如下图所示,Virtual Node 作为一个虚拟 Node 在 Kubernetes 集群中,每个 Cube 实例被视为 VK 节点上的一个 Pod。
在Kubernetes集群中,网络代理是实现负载均衡和服务发现的重要组件。在Kubernetes中,有两种主要的代理模式:IPVS和iptables。这两种代理模式都可以实现负载均衡和服务发现,但它们有着不同的优缺点。
在前面的几篇文章里我们介绍了基于iptables和ipvs模式下cluster ip类型的service和node port类型的service实现原理,这里我们做一下回顾总结和对比,相关文章可以参考如下:
大家好,我是 roc,来自腾讯云容器服务(TKE)团队,经常帮助用户解决各种 K8S 的疑难杂症,积累了比较丰富的经验,本文分享几个比较复杂的网络方面的问题排查和解决思路,深入分析并展开相关知识,信息量巨大,相关经验不足的同学可能需要细细品味才能消化,我建议收藏本文反复研读,当完全看懂后我相信你的功底会更加扎实,解决问题的能力会大大提升。
在之前文章中我们介绍了基于iptable方式实现的k8s集群中cluster ip类型和node port类型service的负载均衡。其本质上是当网络数据包从pod的network namespace中通过linux veth pair设备进入到host宿主中的network namespace时,经过iptable一系列的NAT转换,把service的cluster ip和端口DNAT成pod的ip和端口。同时leverage linux iptable的random模块,实现了对pod的负载均衡,然后再交由host对目标pod的路由策略来实现将数据包发往pod。当然,这一切都是在linux内核空间实现的,和应用程序的用户空间没有关系。在这里我们主要介绍基于ipvs的cluster ip类型service的实现原理。如果对于ipvs不熟悉的同学可以浏览一下网站http://www.linuxvirtualserver.org/,大名鼎鼎的LVS负载均衡就是基于ipvs来实现的。
kube-proxy 就可以通过 Service 的 Informer 感知到API Server中service和endpoint的变化情况。而作为对这个事件的响应,它就会在宿主机上创建这样一条 iptables 规则(你可以通过 iptables-save 看到它)。这些规则捕获到service的clusterIP和port的流量,并将这些流量随机重定向到service后端Pod。对于每个endpoint对象,它生成选择后端Pod的iptables规则。
到目前为止,本人见到的最有诚意的 K8s 网络问题分享,而且还有小图片呢!迫不及待的申请了转载授权。
下载 [root@h101 keepalived]# wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz --2016-03-02 15:26:58-- http://www.keepalived.org/software/keepalived-1.2.19.tar.gz Resolving www.keepalived.org... 37.59.63.157, 2001:41d0:8:7a9d::1 Connecting t
kube-proxy 是 Kubernetes 中的关键组件。他的角色就是在服务(ClusterIP 和 NodePort)和其后端 Pod 之间进行负载均衡。kube-proxy 有三种运行模式,每种都有不同的实现技术:userspace、iptables 或者 IPVS。
ipvs相对于iptables模式具备较高的性能与稳定性, 本文讲以此模式的源码解析为主,如果想去了解iptables模式的原理,可以去参考其实现,架构上无差别。
👉腾小云导读 作者经常帮助用户解决各种 K8s 各类「疑难杂症」,积累了丰富经验。本文将分享几个网络相关问题的排查和解决思路,深入分析并展开相关知识,实用性较强。此外,本文几个情况是在使用 TKE 时遇到的。不同厂商的网络环境可能不一样,文中会对不同问题的网络环境进行说明。欢迎继续往下阅读。 👉看目录点收藏,随时涨技术 1 跨 VPC 访问 NodePort 经常超时 2 LB 压测 CPS 低 3 DNS 解析偶尔 5S 延时 4 Pod 访问另一个集群的 apiserver 有延时 5 DNS 解析异常
Kube-proxy的主要作用是将集群内部服务的访问请求分发到正确的Pod上。在Kubernetes中,每个服务都有一个唯一的DNS名称和一个虚拟的IP地址,这个IP地址是由Kube-proxy维护的。当有访问请求到达该IP地址时,Kube-proxy会根据负载均衡算法,将请求分发到后端的Pod上。同时,Kube-proxy还可以检测后端Pod的状态,以确保服务的高可用性和可靠性。
今天稍微了解了LVS 的原理和使用,在网络上找到不少好文章,稍微加以处理并在这里备份:
https://github.com/nevermosby/linux-bpf-learning/tree/master/bpf/bpf-maps
Kubernetes Service的底层实现可以使用两种网络模式:iptables和ipvs。
大家好,我是 roc,来自腾讯云容器服务(TKE)团队,之前发过一篇干货满满的爆火文章 Kubernetes 网络疑难杂症排查分享,包含多个疑难杂症的排查案例分享,信息量巨大。这次我又带来了续集,只讲
上一篇文章主要是介绍了,每台虚拟机的环境配置。接下来我们开始有关K8S的相关部署。
在以前系列文章中我们以学习为目的介绍了二进制手动安装k8s集群,这里也是一个系列文章,同样以学习为目的,我们介绍k8s集群网络。对于网络基本涉及两个方面,一是到各个服务的网络间负载均衡,另一个是网络间的通讯。
kube-proxy 的转发模式可以通过启动参数–proxy-mode进行设置,有userspace、iptables、IPVS等可选项。
LVS是Linux Virtual Server的简称,即Linux虚拟服务器。从Linux内核2.4版本之后,已经将LVS内置于内核中,提供负载均衡技术。
(1)LVS 是Linux Virtual Server的简称,也就是 Linux 虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。
在 Kubernetes 社区里面有一个讨论已久的 bug (#81775),这个问题是当 client 对 service 发起大量新建 TCP 连接时,新的连接被转发到 Terminating 或已完全销毁的旧 Pod 上,导致持续丢包 (报错 no route to host),其根因是内核 ipvs 连接复用引发,本文来详细掰扯下。
IPVS(IP Virtual Server)是 Linux 内核提供的一种高性能负载均衡器。它使用 IP 地址虚拟化技术将多个服务器虚拟为一个单一的服务地址,并使用多种算法来分配负载。Kubernetes 使用 IPVS 来实现高可用的负载均衡服务。
笔者在学习kubernetes的kube-proxy的时候,kube-proxy具有三种proxy mode:
1. Node之间的网络是未知的,有可能是物理服务器直接联网,有可能是虚拟机通过VPC互联,也可以是物理服务器以裸金属方式接入VPC;
当今计算机技术已进入以网络为中心的计算时期。由于客户/服务器模型的简单性、易管理性和易维护性,客户/服务器计算模式在网上被大量采用。在九十年代中 期,万维网(World Wide Web)的出现以其简单操作方式将图文并茂的网上信息带给普通大众,Web也正在从一种内容发送机制成为一种服务平台,大量的服务和应用(如新闻服务、网 上银行、电子商务等)都是围绕着Web进行。这促进Internet用户剧烈增长和Internet流量爆炸式地增长,图1显示了1995至2000年与 Internet连接主机数的变化情况[1],可见增长趋势较以往更迅猛。
Kube-proxy是Kubernetes中的一个组件,它用于实现Kubernetes集群内部的网络代理。在Kubernetes集群中,每个节点都会启动一个kube-proxy进程来负责网络代理。Kube-proxy通过监视Kubernetes API服务器上的Service和Endpoints对象,自动配置节点上的iptables规则,从而实现了负载均衡和服务发现等功能。
在IPVS: How Kubernetes Services Direct Traffic to Pods一文中,作者给出了一个简单的组网(如下)来模拟kubernetes是如何使用IPVS进行通信的。
为了方便后面集群节点间的直接调用,在这配置一下主机名解析,企业中推荐使用内部DNS服务器
| 导语 前面介绍了很多K8S的概念以及架构方面的东西,这里我们说说K8S的网络。云计算里面的网络向来是复杂的,因为里面牵扯到硬件网络跟虚拟网络的交互。尤其是虚拟网络,比较抽象,如果不搞清楚,一些问题排障将寸步难行。
Kubernetes 中的 Service 就是一组同 label 类型 Pod 的服务抽象,为服务提供了负载均衡和反向代理能力,在集群中表示一个微服务的概念。kube-proxy 组件则是 Service 的具体实现,了解了 kube-proxy 的工作原理,才能洞悉服务之间的通信流程,再遇到网络不通时也不会一脸懵逼。
kube-proxy是Kubernetes的核心组件,部署在每个Node节点上,它是实现Kubernetes Service的通信与负载均衡机制的重要组件;kube-proxy负责为Pod创建代理服务,从apiserver获取所有server信息,并根据server信息创建代理服务,实现server到Pod的请求路由和转发,从而实现K8s层级的虚拟转发网络。
实现负载均衡的方式有很多,例如基于DNS的负载均衡、基于四层交换技术的负载均衡、基于七层交换技术的负载均衡,其中nginx大家不陌生,我们可以通过配置实现负载均衡,可是问题也很明显,如果nginx宕机了,那么如何进行负载?这个时候会想多来几台nginx,综合考虑,今天介绍一种基于四层+七层交换技术的负载均衡,以虚拟ip来负载给我们多台nginx,再由nginx来实现负载均衡过程。本文采用CentOS 7.6作为操作系统示例。
这一篇是讲service,但是基础使用以及基本概念由于官方实在是写的比较完整了,我没有必要复述一遍,所以还不太清楚的小伙伴们可以去看官方的文档:https://kubernetes.io/docs/concepts/services-networking/service/。
1. LVS 简介 ---- 1. LVS 是什么? LVS 的英文全称是 Linux Virtual Server,即 Linux 虚拟服务器。它是我们国家的章文嵩博士的一个开源项目。在 linux 内核 2.6 中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。 2. LVS 能干什么? LVS 主要用于多服务器的负载均衡。它工作在网络 4 层,可以实现高性能,高可用的服务器集群技术。 它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。 它易用,配置非常简单,且有多种负载均衡的
为什么需要使用负载均衡呢?这是一个必较重要的问题 实际生产环境中某单台服务器已不能负载日常用访问压力时,就需要使用负载均衡,把用户的请求数据分担到(尽可能平均分配)后端所有功能同等的集群的节点上,同样也是为了解决单台服务器故障问题,从而提高用户的访问体验。
摘 要 Keepalived是由C语言编写,目标是基于Linux为应用提供简单而又强大的负载均衡和高可用的服务。 概述 随着互联网井喷式发展,单节点服务已经不能满足并发需求,通常利用nginx反向代理来实现集群部署以此解决并发需求(nginx负载均衡实现)。此时虽然保证了应用的集群化和高容灾性,但nginx却单节点运行,这极大的为系统宕机埋下伏笔。为此我们必须来采用一主一备或一主N备的方式来保证nginx的运行,高可用(HA- High Availability)的解决方案很多,本文以Keepalived
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。
负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、haproxy,商业的硬件负载均衡设备F5、Netscale。
作者范建明、洪志国、张浩,均为腾讯云容器产品中心高级工程师,负责容器网络和Service Mesh,容器Runtime,调度等相关研发工作。
kube-proxy是Kubernetes的一个组件,它是一个网络代理,用于实现Kubernetes集群中Service和Pod之间的网络通信。
我们的Pod通常会由Deployment进行管理,而Pod的IP是不固定的,另外我们一个服务通常会有多个Pod,在多个Pod之间进行负载均衡也是一个很正常的需求,因为上述两个原因,从而诞生了Service。
LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器。它是我们国家的章文嵩博士的一个开源项目。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。二.LVS能干什么?
领取专属 10元无门槛券
手把手带您无忧上云