文章目录

  • 前言
  • 一、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

  1. Conns (connections scheduled) 已经转发过的连接数
  2. InPkts (incoming packets) 入包个数
  3. OutPkts (outgoing packets) 出包个数
  4. InBytes (incoming bytes) 入流量(字节)
  5. OutBytes (outgoing bytes) 出流量(字节)
    –rate选项是显示速率信息

    –rate选项是显示速率信息
  6. CPS (current connection rate) 每秒连接数
  7. InPPS (current in packet rate) 每秒的入包个数
  8. OutPPS (current out packet rate) 每秒的出包个数
  9. InBPS (current in byte rate) 每秒入流量(字节)
  10. OutBPS (current out byte rate) 每秒入流量(字节)
    ipvsadm -Z 清空计数器
    模拟DDOS之前

    开启DDOS后

总结

这种的LB方式和之前分析的swarm集群中LB类似都是用lvs来直接进行负载,这比起原先使用iptables来进行负载在性能上要好的多,同时也比较清晰友好。总之一句话流量都是要先经过iptables清理一遍然后交给4层的lvs进行负载。

K8S之ipvs负载均衡原理相关推荐

  1. Docker Swarm服务发现和负载均衡原理

    Docker Swarm服务发现和负载均衡原理 Docker使用的是Linux内核iptables和IPVS的功能来实现服务发现和负载均衡.Iptables是Linux内核中可用的包过滤技术,可根据数 ...

  2. 搞懂分布式技术8:负载均衡原理剖析

    负载均衡的重要性无需多说,今天带来:负载均衡原理的解析. 开头先理解一下所谓的"均衡". 不能狭义地理解为分配给所有实际服务器一样多的工作量,因为多台服务器的承载能力各不相同,这可 ...

  3. 使用LVS实现负载均衡原理及安装配置详解

    使用LVS实现负载均衡原理及安装配置详解 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均 ...

  4. ipvs负载均衡(三)ipvs三种工作方式

    IPVS负载均衡(三)IPVS三种工作方式之NAT模式 IPVS是LVS(Linux Virtual Server)项目重要组成部分,目前包含于官方Linux Kernel,IPVS依赖于netfil ...

  5. 全网最详细的负载均衡原理图解

    负载均衡由来 在业务初期,我们一般会先使用单台服务器对外提供服务.随着业务流量越来越大,单台服务器无论如何优化,无论采用多好的硬件,总会有性能天花板,当单服务器的性能无法满足业务需求时,就需要把多台服 ...

  6. 简谈docker swarm中负载均衡原理

    同一集群内部的负载均衡模式 基于在swarm中创建节点即可分配内部域名的情况下: dnsrr 单纯通过内部DNS内部组件进行负载均,由于DNS缓存机制等问题,有局限性. VIP: 简单来讲是 (内部) ...

  7. php负载均衡原理_Java开发大型互联网架构深入负载均衡原理之方案分析

    引言 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 负载均衡,英文名称为Load Balan ...

  8. ngnix 负载均衡原理

    ngnix 负载均衡原理

  9. Ribbon负载均衡原理,Feign是如何整合Ribbon的?

    文章目录 1. 什么是负载均衡? 2. Ribbon的使用 ①:自定义负载均衡策略 ②:Ribbon的饥饿加载 3. Ribbon的负载均衡原理 ①:收集带有@LoadBalanced注解的RestT ...

最新文章

  1. 释放变量所指向的内存_C++动态内存分配(学习笔记:第6章 15)
  2. Learn Python 011: while loop
  3. android加载html
  4. 3.Spring高级话题—3.计划任务
  5. 哇、、、、C++ 实现单向链表
  6. uploader什么意思_【已解决】请问下uploader上传失败是什么原因
  7. CCNA学习指南第三章
  8. 广东迅视资管 “亦庄智造”填补国内高速棒材技术空白
  9. U8glib学习使用(详细版)
  10. ARFoundation多图切换识别
  11. 别傻了!不能只会给别人开热点,要尝试华为手机的WiFi分享功能
  12. 极限的无穷小和无穷大
  13. HTML资源未找到,加载资源失败:服务器响应状态为404(未找到)
  14. 一篇 CVPR 2022顶会论文是如何炼成的,顶会一作亲述
  15. matlab 重复测量方差分析,DPABI重复测量方差分析时,在permutation test或后续的多重比较校正时报错...
  16. 计算机科技协会知识竞赛策划书,科协活动策划书
  17. WordCount的理解与MapReduce的执行过程
  18. Tom小猫,让我看清你的五脏六腑1
  19. 大数据:电信运营商的另一颗福星?
  20. 有什么能在网上挣钱的项目啊?做自媒体靠谱吗?

热门文章

  1. 互联网P2P优化管理标准体系研讨会召开
  2. 关于在校专利软著申请一二事
  3. win7和linux mint双系统安装总结
  4. 译《The Part-Time Parliament》——终于读懂了Paxos协议!
  5. 计算机专业品德行为,计算机教育里进行素质品德教育
  6. oracle10g rac启动,oracle 10G rac启动与关闭正常顺序
  7. 【从零开始玩量化17】如何python+QMT完成自动化交易?(全网最详细入门教程)
  8. 蚊子可携带 HIV 吗???
  9. php计算股票均线,移动平均线——Moving Average 平均线的计算公式
  10. 数据库Navicat建表出现1064错误原因