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模式

image

在 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模式

image

在 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

image

kube-proxy会监视service对象和Endpoints,调用netlink接口

309d8a5eb9e76b3d297de0fdfc9aa8b0.png

cluster IP

7ce2db0d22ef7237d0dc83af2bc19943.png

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
posted @   立勋  阅读(158)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示