kube-proxy工作原理
kube-proxy工作原理
kube-proxy工作原理
https://cloud.tencent.com/developer/article/1097449
每个node节点上都有一个kube-proxy进程,这个进程从master、apiserver获取信息,感知service和endpoint的创建,然后做两个事:
1.为每个service 在集群中每个节点上面创建一个随机端口,任何该端口上面的连接会代理到相应的pod
2.集群中每个节点安装iptables规则,用于clusterip + port路由到上一步定义的随机端口上面,所以集群中每个node上面都有service的转发规则:
KUBE-PORTALS-CONTAINER 从容器中通过service cluster ip和端口访问service的请求
KUBE-PORTALS-HOST 从主机中通过service cluster ip和端口访问service的请求
KUBE-NODEPORT-CONTAINER 从容器中通过service nodeport端口访问service的请求
KUBE-NODEPORT-HOST 从主机中通过service nodeport端口访问service的请求
kube-proxy转发模式的分类
Kube-proxy的转发模式可以通过启动参数--proxy-mode进行配置
userspace模式
在 userspace 代理模式中,kube-proxy 会在用户空间中运行,并执行以下操作:
服务 IP 和端口管理:
kube-proxy 监听 Kubernetes API server 以获取 Service 和 Endpoint 的更新信息。
为每个 Service 分配一个唯一的 ClusterIP(Service IP),并创建相应的 iptables 规则来捕获对该 IP 和端口的流量。
流量捕获和转发:
当客户端 Pod(Client Pod)发送流量到某个 Service 的 ClusterIP 时,这些流量会被 iptables 捕获并重定向到 kube-proxy。
kube-proxy 接收这些流量,并根据 Service 对应的 Endpoint 列表在用户空间中进行处理和负载均衡。
kube-proxy 会选择一个可用的后端 Pod(Pod 1、2 或 3)并将流量转发给它。
与后端 Pod 通信:
在 Node1 上,kube-proxy 会将流量转发给同一个节点上的 Pod 1。
在 Node2 上,kube-proxy 会将流量转发给同一个节点上的 Pod 2 或 Pod 3。
如果目标 Pod 在不同的节点上,kube-proxy 会通过跨节点网络将流量转发到目标 Pod。
为什么userspace模式要建立iptables规则
原因是Kube-proxy进程只监听一个端口,这个端口既不是服务的访问端口也不是服务的NodePort,因此需要一层iptables把访问服务的连接重定向给Kube-proxy进程的一个临时端口。Kube-proxy在代理客户端请求时会开放一个临时端口,以便后端Pod的响应返回给Kube-proxy, 然后Kube-proxy再返回给客户端。
iptables模式
在 iptables 代理模式中,kube-proxy 使用 iptables 管理流量的路由和转发。Kube-proxy利用iptables的DNAT模块,实现了Service入口地址到Pod实际地址的转换,免去了一次内核态到用户态的切换
服务 IP 和端口管理:
kube-proxy 监听 Kubernetes API server 以获取 Service 和 Endpoint 的更新信息。
为每个 Service 分配一个唯一的 ClusterIP(Service IP),并创建相应的 iptables 规则来捕获对该 IP 和端口的流量。
流量捕获和转发:
当客户端 Pod(Client Pod)发送流量到某个 Service 的 ClusterIP 时,这些流量会被 iptables 捕获。
iptables 规则直接在内核空间中将流量路由到适当的后端 Pod(Pod 1、Pod 2 或 Pod 3)。
与后端 Pod 通信:
如果目标 Pod 位于同一节点(如 Pod 1 和 Client Pod),流量在本地路由。
如果目标 Pod 位于不同节点(如 Pod 2 或 Pod 3),流量通过跨节点网络路由到目标 Pod。
ipvs
https://zhuanlan.zhihu.com/p/39909011
kube-proxy会监视service对象和Endpoints,调用netlink接口
cluster IP
1.APIServer把关于service的配置信息(资源清单中的定义的内容)写到etcd中
2.kube-proxy监视etcd中service的变化,将变化的信息写入到iptables中
3.上面的iptables因环境而异,还可以是ipvs或userspace
4.iptables使用NAT等技术将VIP的流量转至endpoint中
5.endpoint是后端真实服务器的IP加端口的统称
创建deployment
vim myapp-deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: svc-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: stabel
template:
metadata:
labels:
app: myapp
release: stabel
env: test
spec:
containers:
- name: myapp
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
创建SVC
vim myapp-service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
type: ClusterIP
selector:
app: myapp
release: stabel
ports:
- name: http
port: 80
targetPort: 80
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)