K8S之ipvs负载均衡原理
文章目录
- 前言
- 一、ipvs vs iptables:
- 二、ipvs kube-proxy原理分析:
- 总结
前言
IPVS简介:
尽管 Kubernetes 在版本v1.6中已经支持5000个节点,但使用 iptables 的 kube-proxy 实
际上是将集群扩展到5000个节点的瓶颈。 在5000节点集群中使用 NodePort 服务,如
果有2000个服务并且每个服务有10个 pod,这将在每个工作节点上至少产生20000个
iptable 记录,这可能使内核非常繁忙。
ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的4层LAN交换,作为
Linux 内核的一部分。ipvs运行在主机上,在真实服务器集群前充当负载均衡器。ipvs
可以将基于TCP和UDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个
IP 地址上显示为虚拟服务。
一、ipvs vs iptables:
我们知道kube-proxy支持 iptables 和 ipvs 两种模式, 在kubernetes v1.8 中引入了 ipvs
模式,在 v1.9 中处于 beta 阶段,在 v1.11 中已经正式可用了。iptables 模式在 v1.1 中
就添加支持了,从 v1.2版本开始 iptables 就是 kube-proxy 默认的操作模式,ipvs 和
iptables 都是基于netfilter的。ipvs 会使用 iptables 进行包过滤、SNAT、masquared。
具体来说,ipvs 将使用ipset来存储需要DROP或masquared的流量的源或目标地址,
以确保 iptables 规则的数量是恒定的,这样我们就不需要关心我们有多少服务了。
启动ipvs的要求:
k8s版本 >= v1.11
使用ipvs需要安装相应的工具来处理”yum install ipset ipvsadm -y“
确保 ipvs已经加载内核模块, ip_vs、ip_vs_rr、ip_vs_wrr、ip_vs_sh、
nf_conntrack_ipv4。如果这些内核模块不加载,当kube-proxy启动后,会退回到iptables模式。
二、ipvs kube-proxy原理分析:
先前基于iptables规则表的DNAT->SNAT方式来处理外部客户端到k8s集群pod内的流量
和集群内部流量(cluster-ip到pod ip),无需在宿主机上管理cluster-ip都由iptables来进行
管理。
使用IPVS后是需要对vs(虚拟服务也就是vip)进行管理,由于IPVS的DNAT钩子挂在
INPUT链上,因此必须要让内核识别 VIP(cluster-ip) 是本机的 IP。k8s 通过设置将
service cluster ip 绑定到虚拟网卡kube-ipvs0,其中下面的10.96.x.x都是VIP,也就
是cluster-ip。
ipvs 会使用 iptables 进行包过滤、SNAT、masquared(伪装)。具体来说,ipvs 将使用
ipset来存储需要DROP或masquared的流量的源或目标地址,以确保 iptables 规则的
数量是恒定的,这样我们就不需要关心我们有多少服务了。
cluster-ip到pod访问
这里访问cluster ip为10.96.0.10,k8s集群内部的dns服务
1)、入口流量匹配:
数据包是通过本地协议发出的,在宿主机本地通过访问cluster-ip到后端真是的pod那
么就要伪装所有访问 Service Cluster IP 的外部流量,k8s只能在OUTPUT这个链上
来做相应的规则:
$iptables -S -tnat | grep OUTPUT
匹配到倒数第二条就是将流量引入到KUBE-SERVICES规则中处理。如下图:2)、入口流量引流到全局链KUBE-SERVICES中:
ipset list KUBE-CLUSTER-IP
iptables -S -tnat | grep KUBE-SERVICES
第一步中上面的数据包流入到KUBE-SERVICES该规则中目的就是让源地址不是
10.244.0.0/16,目的地址match 到 KUBE-CLUSTER-IP 的数据包打上标签。
入口流量标签化处理:
将上面KUBE-SERVICES链中的流量进行打标签处理:
$iptables -S -tnat | grep KUBE-MARK-MASQ
入口流量SNAT处理:
那么数据包在出去的时候一定是要经过POSTROUTING链进行SNAT即将所有来源外部
流量转换成该cluster ip的源地址。
$iptables -S -tnat | grep POSTROUTING
然后通过内部的lvs进行流量转发到后端pod上。如下图:
$ipvsadm -Ln
node-ip到pod访问
这里创建一个service为NodePort的nginx应用对应为nodeip:port(192.168.100.100:30080),
clusterip:port(10.101.19.237:80)
$ip ad| grep ipvs
$kubectl get svc
入口流量匹配:
集群外部通过node ip 访问到后端pod服务,流量肯定是先在PREROUTING链中处理:
$iptables -S -tnat | grep PREROUTING
匹配到倒数第二条就是,将流量引入到KUBE-SERVICES规则中处理。
2)、入口流量引流到全局链KUBE-SERVICES中:
$ipset list KUBE-CLUSTER-IP
$iptables -S -tnat | grep KUBE-SERVICES
第一步中上面的数据包流入到KUBE-SERVICES该规则中目的就是让源地址不是10.244.0.0/16,目的地址match 到 KUBE-CLUSTER-IP 的数据包打上标签
3)、入口流量标签化处理:
$iptables -S -tnat | grep KUBE-MARK-MASQ
入口流量SNAT处理:
那么数据包在出去的时候一定是要经过POSTROUTING链进行SNAT即将所有来源外部流量转换成该cluster ip的源地址。
$iptables -S -tnat | grep POSTROUTING
iptables中POSTROUTING链最先将流量引流到KUBE-POSTROUTING中做进一步的SNAT处理
$iptables -S -tnat | grep KUBE-POSTROUTING
端口的转换
$iptables -S -tnat | grep KUBE-NODE-PORT
上面的流程进行SNAT后即将所有来源外部流量转换成该cluster ip的源地址的对应得端
口。然后通过内部的lvs进行流量转发到后端pod上。
ipvsadm
–stat选项是统计自该条转发规则生效以来的包
ipvsadm -ln --stats
- Conns (connections scheduled) 已经转发过的连接数
- InPkts (incoming packets) 入包个数
- OutPkts (outgoing packets) 出包个数
- InBytes (incoming bytes) 入流量(字节)
- OutBytes (outgoing bytes) 出流量(字节)
–rate选项是显示速率信息
–rate选项是显示速率信息 - CPS (current connection rate) 每秒连接数
- InPPS (current in packet rate) 每秒的入包个数
- OutPPS (current out packet rate) 每秒的出包个数
- InBPS (current in byte rate) 每秒入流量(字节)
- OutBPS (current out byte rate) 每秒入流量(字节)
ipvsadm -Z 清空计数器
模拟DDOS之前
开启DDOS后
总结
这种的LB方式和之前分析的swarm集群中LB类似都是用lvs来直接进行负载,这比起原先使用iptables来进行负载在性能上要好的多,同时也比较清晰友好。总之一句话流量都是要先经过iptables清理一遍然后交给4层的lvs进行负载。
K8S之ipvs负载均衡原理相关推荐
- Docker Swarm服务发现和负载均衡原理
Docker Swarm服务发现和负载均衡原理 Docker使用的是Linux内核iptables和IPVS的功能来实现服务发现和负载均衡.Iptables是Linux内核中可用的包过滤技术,可根据数 ...
- 搞懂分布式技术8:负载均衡原理剖析
负载均衡的重要性无需多说,今天带来:负载均衡原理的解析. 开头先理解一下所谓的"均衡". 不能狭义地理解为分配给所有实际服务器一样多的工作量,因为多台服务器的承载能力各不相同,这可 ...
- 使用LVS实现负载均衡原理及安装配置详解
使用LVS实现负载均衡原理及安装配置详解 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均 ...
- ipvs负载均衡(三)ipvs三种工作方式
IPVS负载均衡(三)IPVS三种工作方式之NAT模式 IPVS是LVS(Linux Virtual Server)项目重要组成部分,目前包含于官方Linux Kernel,IPVS依赖于netfil ...
- 全网最详细的负载均衡原理图解
负载均衡由来 在业务初期,我们一般会先使用单台服务器对外提供服务.随着业务流量越来越大,单台服务器无论如何优化,无论采用多好的硬件,总会有性能天花板,当单服务器的性能无法满足业务需求时,就需要把多台服 ...
- 简谈docker swarm中负载均衡原理
同一集群内部的负载均衡模式 基于在swarm中创建节点即可分配内部域名的情况下: dnsrr 单纯通过内部DNS内部组件进行负载均,由于DNS缓存机制等问题,有局限性. VIP: 简单来讲是 (内部) ...
- php负载均衡原理_Java开发大型互联网架构深入负载均衡原理之方案分析
引言 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 负载均衡,英文名称为Load Balan ...
- ngnix 负载均衡原理
ngnix 负载均衡原理
- Ribbon负载均衡原理,Feign是如何整合Ribbon的?
文章目录 1. 什么是负载均衡? 2. Ribbon的使用 ①:自定义负载均衡策略 ②:Ribbon的饥饿加载 3. Ribbon的负载均衡原理 ①:收集带有@LoadBalanced注解的RestT ...
最新文章
- 释放变量所指向的内存_C++动态内存分配(学习笔记:第6章 15)
- Learn Python 011: while loop
- android加载html
- 3.Spring高级话题—3.计划任务
- 哇、、、、C++ 实现单向链表
- uploader什么意思_【已解决】请问下uploader上传失败是什么原因
- CCNA学习指南第三章
- 广东迅视资管 “亦庄智造”填补国内高速棒材技术空白
- U8glib学习使用(详细版)
- ARFoundation多图切换识别
- 别傻了!不能只会给别人开热点,要尝试华为手机的WiFi分享功能
- 极限的无穷小和无穷大
- HTML资源未找到,加载资源失败:服务器响应状态为404(未找到)
- 一篇 CVPR 2022顶会论文是如何炼成的,顶会一作亲述
- matlab 重复测量方差分析,DPABI重复测量方差分析时,在permutation test或后续的多重比较校正时报错...
- 计算机科技协会知识竞赛策划书,科协活动策划书
- WordCount的理解与MapReduce的执行过程
- Tom小猫,让我看清你的五脏六腑1
- 大数据:电信运营商的另一颗福星?
- 有什么能在网上挣钱的项目啊?做自媒体靠谱吗?
热门文章
- 互联网P2P优化管理标准体系研讨会召开
- 关于在校专利软著申请一二事
- win7和linux mint双系统安装总结
- 译《The Part-Time Parliament》——终于读懂了Paxos协议!
- 计算机专业品德行为,计算机教育里进行素质品德教育
- oracle10g rac启动,oracle 10G rac启动与关闭正常顺序
- 【从零开始玩量化17】如何python+QMT完成自动化交易?(全网最详细入门教程)
- 蚊子可携带 HIV 吗???
- php计算股票均线,移动平均线——Moving Average 平均线的计算公式
- 数据库Navicat建表出现1064错误原因