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

待完善

相关推荐
升讯威在线客服系统几秒前
如何通过 Docker 在没有域名的情况下快速上线客服系统
java·运维·前端·python·docker·容器·.net
Karoku0662 小时前
【CI/CD】CI/CD环境搭建流程和持续集成环境配置
运维·ci/cd·docker·容器·kubernetes·prometheus
Lansonli2 小时前
云原生(五十七) | 阿里云CDN基本概念
阿里云·云原生·云计算
Bright16687 小时前
centos9安装k8s集群
云原生·容器·kubernetes
!!!5259 小时前
华为云镜像加速器
docker·容器·华为云
xidianjiapei00110 小时前
Kubernetes的Ingress 资源是什么?
云原生·容器·kubernetes
企鹅侠客10 小时前
kube-proxy有什么作用?
云原生·kubelet
sszdzq11 小时前
Docker
运维·docker·容器
dmy12 小时前
docker 快速构建开发环境
后端·docker·容器
土豆沒加13 小时前
K8S的Dashboard登录及验证
云原生·容器·kubernetes