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

待完善

### Kubernetes服务流量转发原理 Kubernetes 服务的流量转发机制是其网络模型的核心部分,它确保了 Pod 之间的通信以及外部客户端与内部服务之间的交互能够高效、可靠地完成。以下是对 Kubernetes 流量转发原理的深入解析。 #### 1. Kubernetes 服务的基本概念 在 Kubernetes 中,服务(Service)为一组 Pod 提供了一个稳定的虚拟 IP 地址和端口,使得即使后端 Pod 的实际 IP 地址发生变化,客户端仍然可以通过固定的 Service 地址访问这些 Pod[^1]。这种抽象使得服务发现和负载均衡成为可能。 #### 2. 流量转发的关键技术 Kubernetes流量转发主要依赖于以下核心技术: - **iptables**:Kubernetes 使用 iptables 规则来实现服务的流量转发。当一个请求到达某个节点时,iptables 会根据预定义的规则将流量重定向到后端的 Pod。这些规则可以通过 `iptables-save` 命令查看[^5]。 - **CNI(Container Networking Interface)**:CNI 是一种标准接口,用于配置容器网络。通过 CNI 插件(如 Calico 或 Flannel),Kubernetes 可以管理集群中每个 Pod 的网络配置,从而确保流量能够在不同节点之间正确路由[^4]。 - **DNS**:Flexkube-dns 是 Kubernetes 集群中的 DNS 服务器,负责为 Service 和 Pod 提供域名解析服务。客户端可以通过 Service 的域名访问对应的 Pod,而无需关心具体的 IP 地址[^2]。 #### 3. 流量转发的具体过程 假设有一个名为 `my-service` 的 Service,并且该 Service 对应多个后端 Pod。以下是流量转发过程: 1. **客户端发起请求**:客户端通过 `my-service` 的虚拟 IP 地址或域名发送请求。 2. **DNS 解析**:如果客户端使用的是域名,则 Flexkube-dns 会将域名解析为 Service 的虚拟 IP 地址[^2]。 3. **iptables 规则匹配**:当请求到达某个节点时,iptables 会根据预先设置的规则将流量转发到后端的一个 Pod。这个选择过程通常基于轮询或其他负载均衡算法[^5]。 4. **Pod 处理请求**:被选中的 Pod 接收到请求并进行处理,然后将响应返回给客户端。 #### 4. Ingress 的角色 对于需要对外暴露的服务,Kubernetes 提供了 Ingress 资源。Nginx Ingress Controller 是一种常用的实现方式,它充当整个集群对外通信的唯一入口点。通过 Ingress,管理员可以定义复杂的路由规则,从而灵活地控制外部流量如何进入集群内的服务[^3]。 ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: my-service port: number: 80 ``` 上述 YAML 定义了一个 Ingress 规则,将来自 `example.com` 的流量转发到 `my-service`。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值