k8s service如何实现流量转发

1 基本概念

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

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

2 转发模式对比

iptables ipvs
原理 工作在 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。

bash 复制代码
# 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。

bash 复制代码
# 随机选择一个 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 和端口。

bash 复制代码
# 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

待完善

相关推荐
Python私教12 分钟前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
运维&陈同学1 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
O&REO2 小时前
单机部署kubernetes环境下Overleaf-基于MicroK8s的Overleaf应用部署指南
云原生·容器·kubernetes
politeboy2 小时前
k8s启动springboot容器的时候,显示找不到application.yml文件
java·spring boot·kubernetes
运维小文3 小时前
K8S资源限制之LimitRange
云原生·容器·kubernetes·k8s资源限制
登云时刻3 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
wuxingge11 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes
志凌海纳SmartX12 小时前
趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
云原生·容器·kubernetes
锅总12 小时前
nacos与k8s service健康检查详解
云原生·容器·kubernetes
BUG弄潮儿13 小时前
k8s 集群安装
云原生·容器·kubernetes