当前位置: 首页 > news >正文

k8s service如何实现流量转发

1 基本概念

Service:在Kubernetes(K8s)中,Service用于将流量转发到后端的Pod中。Service提供了一种稳定的网络入口,尽管后端的Pod可能会动态改变

kube-proxy: kube-proxy是Kubernetes集群中的核心组件之一,它运行在每个节点上,负责实现Service的流量负载均衡。kube-proxy有两种转发模式:iptables、ipvs

2 转发模式对比

iptablesipvs
原理工作在 Linux 内核的netfilter框架上,使用链和规则的机制来匹配和处理网络流量。它通过顺序规则匹配实现流量转发,适用于小规模集群,但随着规则数量增加,性能会下降基于内核的 LVS 框架,通过哈希表快速查找和转发流量,支持丰富的负载均衡算法,适合大规模集群和高流量应用场景
性能如果规模较大,会导致规则较多,遍历规则较慢,从而影响性能IPVS 使用哈希表来存储和查找规则,而不是像 IPtables 那样线性匹配,因此即使有大量规则,其查找速度也非常快
调度规则随机算法,仅支持轮询提供多种策略(轮询、最少连接、源地址哈希等)

如何选择?
小规模集群或对负载均衡要求不高的集群可以选择 IPtables,不需要特殊内核模块,所有Linux发行版都支持;而对于需要高性能、复杂负载均衡策略和大规模集群的环境,IPVS 是更为理想的选择

3 实现原理详解

下面以一个简单的案例深入说明:
目前k8s上创建一个service指向后端 3副本的 deployment,具体是如何实现流量转发到pod的。

假设以下信息:
Service 名称: app1
Service ClusterIP: 10.96.0.10
Service Port: 80
后端 Pod IPs:
Pod 1: 10.0.0.2 (Pod1)
Pod 2: 10.0.0.3 (Pod2)
Pod 3: 10.0.0.4 (Pod3)
Pod 容器端口: 8080(假设每个 Pod 的应用都监听端口 8080)

3.1 iptables

当 kube-proxy 发现服务 app1 和它的后端 Pod 时,它会动态生成以下的 iptables 规则:

1、捕获流量并跳转到服务链

在 NAT 表中的 PREROUTING 链和 OUTPUT 链(用于本节点流量),创建规则来匹配目标 IP 为 app1 服务的流量,并引导到一个服务链,如 KUBE-SVC-XXXXXX。

# PREROUTING 链捕获目标为 app1 的流量,并跳转到服务链
iptables -t nat -A PREROUTING -d 10.96.0.10/32 -p tcp --dport 80 -j KUBE-SVC-XXXXXX# OUTPUT 链处理集群内发往 app1 服务的流量
iptables -t nat -A OUTPUT -d 10.96.0.10/32 -p tcp --dport 80 -j KUBE-SVC-XXXXXX

2、服务链处理负载均衡

KUBE-SVC-XXXXXX 是一个虚拟服务链,它对应 app1 的 ClusterIP 和端口。在这个链中,kube-proxy 创建规则来随机分发流量到 3 个后端 Pod。

# 随机选择一个 Pod,负载均衡到后端 Pod1
iptables -t nat -A KUBE-SVC-XXXXXX -m statistic --mode random --probability 0.33 -j KUBE-SEP-YYYYYY# 如果未命中第一个规则,随机选择 Pod2
iptables -t nat -A KUBE-SVC-XXXXXX -m statistic --mode random --probability 0.5 -j KUBE-SEP-ZZZZZZ# 如果前两个规则都未命中,则选择 Pod3
iptables -t nat -A KUBE-SVC-XXXXXX -j KUBE-SEP-WWWWWW

3、后端 Pod 规则链(DNAT 转换)

对于每个后端 Pod,kube-proxy 都会为其创建一个 KUBE-SEP-* 链(Service Endpoint 链),这些链中的规则负责将目标地址转换为对应 Pod 的 IP 和端口。

# Pod1 规则链(对应 IP 10.0.0.2 和端口 8080)
iptables -t nat -A KUBE-SEP-YYYYYY -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.2:8080# Pod2 规则链(对应 IP 10.0.0.3 和端口 8080)
iptables -t nat -A KUBE-SEP-ZZZZZZ -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.3:8080# Pod3 规则链(对应 IP 10.0.0.4 和端口 8080)
iptables -t nat -A KUBE-SEP-WWWWWW -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.4:8080

3.2 ipvs

待完善

http://www.lryc.cn/news/437172.html

相关文章:

  • 每日一练:K个一组翻转链表
  • 昨晚,OpenAI震撼发布o1大模型!我们正式迈入了下一个时代。
  • MySql8.x---开窗函数
  • 图文讲解HarmonyOS应用发布流程
  • 【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)
  • 经典负载调制平衡放大器(LMBA)设计-从理论到ADS仿真
  • Web开发:基础Web开发的支持
  • 【LeetCode每日一题】——LCR 168.丑数
  • Day7 | Java框架 | SpringMVC
  • 【网络通信基础与实践第二讲】包括互联网概述、互联网发展的三个阶段、互联网的组成、计算机网络的体系结构
  • CentOS7下安装Ruby3.2.4的实施路径
  • Redis 实现原理或机制
  • 使用程序方式获取与处理MySQL表数据
  • 计算机网络(五) —— 自定义协议简单网络程序
  • 开源模型应用落地-qwen2-7b-instruct-LoRA微调-unsloth(让微调起飞)-单机单卡-V100(十七)
  • [数据集][目标检测]车油口挡板开关闭合检测数据集VOC+YOLO格式138张2类别
  • Delphi 的 RSA 库 LockBox
  • element UI学习使用(1)
  • 如何搞定日语翻译?试试这四款工具
  • 【STM32】独立看门狗(IWDG)原理详解及编程实践(上)
  • 前端框架大观:探索现代Web开发的基石
  • 16 训练自己语言模型
  • udp网络通信 socket
  • LG AI研究开源EXAONE 3.0:一个7.8B双语语言模型,擅长英语和韩语,在实际应用和复杂推理中表现出色
  • 【mysql】mysql之主从部署以及介绍
  • Invoke-Maldaptive:一款针对LDAP SearchFilter的安全分析工具
  • QT 读取Excel表
  • 深入理解 Vue 组件样式管理:Scoped、Deep 和 !important 的使用20240909
  • C语言内存函数(21)
  • 三高基本概念之-并发和并行