博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
k8s-kube-proxy运行机制分析
阅读量:5772 次
发布时间:2019-06-18

本文共 1712 字,大约阅读时间需要 5 分钟。

在每个Node上都会运行一个kube-proxy服务进程,这个进程可以看做service的透明代理和负载均衡器。其核心功能是将某个service的访问请求转发到后端的某个Pod上。对每一个TCP类型的service,kube-proxy都会在本地Node上建立一个socketserver来负责接收请求,然后均匀发送到后端某个Pod端口上。这个过程默认采用Round Robin负载均衡算法。

此外,service的cluster IP和Nodeport概念是proxy通过Iptables的NAT转换实现的。proxy在运行过程中动态创建于service相关的Iptables规则,这些规则实现了Cluster IP及NodePort的请求流量重定向到proxy进程上对应服务的代理端口的功能。

也就是说,访问service的请求,都会被节点机的Iptables规则重定向到kube-proxy监听service服务代理端口,那么proxy如何选择后端的pod呢?

目前proxy只支持round robin算法,该算法是轮询查询。

接下来深入分析proxy实现细节:

kube-proxy通过查询和监听API server中service和endpoint的变化。为每个service都建立了一个服务代理对象。并自动同步。服务代理对象是proxy程序内部的一种数据结构,它包括一个用于监听此服务请求的socketserver,socketserver的端口是随机选择的一个本地空闲端口。此外,kube-proxy内部也创建了一个负载均衡器-LoadBalancer,LoadBalancer上保存了service到对应的后端endpoint列表的动态转发路由表。而具体的路由选择则取决于Round Robin负载均衡算法及service的session会话保持这两个特性。

针对发生变化的service列表,proxy会逐个处理,下面是具体处理流程:

1.如果该service没有设置Cluster IP,则不做任何处理,否则获取该service的所有端口定义列表(spec.ports域)

2.逐个读取服务端口定义列表中的端口信息,根据端口名称,service名称和namespace判断本地是否已经存在对应的服务代理对象,如果不存在则新建,若存在并且service端口被修改过,则先删除Iptables中和该service端口相关的规则,关闭服务代理对象,然后走新建流程,也就是为该service端口分配服务代理对象并为创建相关的Iptables规则。

3.更新负载均衡器组件中对应service的转发地址列表,对于新建的service,确定转发时的会话保持策略。

4.对于已删除的service则进行清理。

proxy在启动时和坚挺到service或endpoint变化后,会在本机的Iptables的NAT表中添加4条规则链。

a,KUBE-PORTALS-CONTAINER:从容器中通过service Cluster IP和端口号访问service的请求。

b,KUBE-PORTALS-HOST:从主机通过service Cluster IP和端口号访问service的请求。

c,KUBE-NODEPORT-CONTAINER:从容器中通过service的NodePort端口号访问service的请求。

d,KUBE-NODEPORT-HOST:从主机通过service的NodePort端口号访问service的请求。

此外,kube-proxy在Iptables上为每个service创建由Cluster IP+service端口到kube-proxy所在主机IP+service代理服务所监听的端口的转发规则。

可以看到对“redis-master”service的6379端口的访问将被转发至物理机的42872端口。而42872端口就是proxy为这个service打开的随机本地端口。

转载于:https://www.cnblogs.com/sichenzhao/p/9320108.html

你可能感兴趣的文章
Java利用httpasyncclient进行异步HTTP请求
查看>>
循环多少次? 【杭电--HDOJ-1799】 附题+具体解释
查看>>
linux系统终端命令提示符设置(PS1)记录
查看>>
C++运算符重载
查看>>
【Web】URI和URL,及URL的编码
查看>>
宿舍局域网的应用
查看>>
html代码究竟什么用途
查看>>
oracle的substr函数的用法
查看>>
QT 数据库编程四
查看>>
npm下载包时代理配置
查看>>
全球十大理论
查看>>
model.addAttribute("student",student)——渲染
查看>>
JavaWeb开发之普通图片验证码生成技术与算术表达式验证码生成技术
查看>>
python和pywin32实现窗口查找、遍历和点击
查看>>
第二章 概率图模型的基本原理
查看>>
Hadoop HDFS编程 API入门系列之路径过滤上传多个文件到HDFS(二)
查看>>
Nginx反向代理,负载均衡,redis session共享,keepalived高可用
查看>>
CentOS7 yum 安装git
查看>>
sublime text 3浅色主题
查看>>
数据结构之红黑树(三)——删除操作
查看>>