本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1460685179
本文csdn博客链接:http://blog.csdn.net/screscent/article/details/51159168
k8s源码为v1.1.1稳定版本
1、ProxyServer的构建与主流程
源码在k8s.io\kubernetes\cmd\kube-proxy
main函数入口
这个就不再多说了,这种结构已经见多了
继续进入源码k8s.io\kubernetes\cmd\kube-proxy\app
// NewProxyServerDefault creates a new ProxyServer object with default parameters.
func NewProxyServerDefault(config *ProxyServerConfig) (*ProxyServer, error) {
两个东西是关键的
代理模式支持两种,一种是IPtables,还有一种userspace
我们这里只分析iptables。
上图中,我们看到构建了一个proxierIptables,并且两个重要的东西都赋值为proxierIptables
proxier = proxierIptables
endpointsHandler = proxierIptables
在文章《k8s源码分析-----kube-proxy(1)config》中,我们已经分析过了serviceConfig和endpointsConfig。可以看出,注册进去的两个接口都是proxierIptables。下一节我们再深入分析proxierIptables。
下面我们看看run
run的最后运行了proxier的syncloop,在本文中其实就是proxierIptables.syncloop
2、proxierIptables
源码在k8s.io\kubernetes\pkg\proxy\iptables
我们看看构建
我们再看看结构体
很简单,主要的变量有
serviceMap:用于保存service信息
endpointsMap:用于保存endpoint信息
portsMap:用于保存ports信息
haveReceivedServiceUpdate、haveReceivedEndpointsUpdate两个标识位,用于标识service和endpoint是否更新
2.1 service和endpoint更新
废话就不多说了
看看我们之前注册的两个接口
那么我们看看proxier提供的相应接口
2.1.1、OnServiceUpdate
直接看源码
获取到的services信息,进行遍历。如果不正确的,直接跳过
再进一步对每个service的port进行遍历,每个端口是一个服务
构建信息的时候,判断是否已经存在,存在且没有发生改变的则跳过。如果存在但已经发生变化的,则先删除,再重新添加
然后将老信息里面的,不存在的服务删除。
最后是更新IPtables rules
2.1.2 、OnEndpointsUpdate
直接上源码
从以上的代码来看,其实和service更新是类似的,更新新的endpoint信息,然后将老的endpoint信息中不存在的删除掉,最后进入IPtables rule更新
2.2 、SyncLoop
在1中的最后调用了run,而run中调用了proxier的synloop
那我们看看syncloop
上面只是定时调用了sync
我们继续往下看
sync其实就是一个加锁的syncProxyRules。
所以殊途同归,最后的都进入到了syncProxyRules
2.3 syncProxyRules
这个函数中,主要的动作就是更具service信息和endpoint信息,配置IPtables规则,设置相应的路由。具体IPtables怎么配置,这里就不深入讲解了,感兴趣的可以去了解下,相关网络的配置。
3、总结
kube-proxy的代码非常清晰,简洁。当然这与其功能比较单一也有很大的关系。
龚浩华
QQ 月牙寂 道长 29185807
2016年4月15日
(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)
如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。
第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注