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

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.kler.cn/a/306123.html

相关文章:

  • linux常见资源查询命令(持续更新)
  • CSS:怎么把网站都变成灰色
  • Keil基于ARM Compiler 5的工程迁移为ARM Compiler 6的工程
  • 【C#设计模式(4)——构建者模式(Builder Pattern)】
  • 必修 -- 常用笔试题
  • ESLint 使用教程(五):ESLint 和 Prettier 的结合使用与冲突解决
  • Python 课程10-单元测试
  • 基于 TDMQ for Apache Pulsar 的跨地域复制实践
  • 2024.9.14 Python与图像处理新国大EE5731课程大作业,马尔可夫随机场和二值图割,校正立体图像的深度
  • 攻击者如何在日常网络资源中隐藏恶意软件
  • rust + bevy 实现小游戏 打包成wasm放在浏览器环境运行
  • Vue3使用Websocket进行跨页面通信
  • 2024年金九银十最新版Java面试题及答案整理(持续更新)
  • 从单体到微服务:FastAPI ‘挂载’子应用程序的转变
  • AI在医学领域:医学AI的安全与隐私全面概述
  • 【iOS】ViewController的生命周期
  • Linux06(vi/vim)
  • 【Python机器学习】循环神经网络(RNN)——超参数
  • 什么是Java 语法糖?
  • ARM驱动学习之8 动态申请字符类设备号
  • sqli-labs Basic Challenge Less_1 通关指南
  • 【AI学习】陶哲轩在 2024 年第 65 届国际数学奥林匹克(IMO)的演讲:AI 与数学
  • 基于YOLOV8+Pyqt5光伏太阳能电池板目标检测系统
  • 使用docker配置wordpress
  • SQLite的入门级项目学习记录(一)
  • Kafka 消息丢失如何处理?