k8s源码分析-----kube-proxy(2)ProxyServer

说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。

申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。

龚浩华,QQ 29185807,月牙寂 道长

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

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的代码非常清晰,简洁。当然这与其功能比较单一也有很大的关系。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏从零开始学 Web 前端

从零开始学 Web 之 Ajax(七)跨域

跨域这个概念来自一个叫 “同源策略” 的东西。同源策略是浏览器上为了安全考虑实施的非常重要的安全机制。

564
来自专栏快乐八哥

Windows8异步编程的注意事项

Windows8项目中涉及到下载数据和上传数据。针对小的数据使用的是WinJS.xhr(),而针对大的文件,不方便使用post方式直接上传的文件都使用Backg...

16410
来自专栏河湾欢儿的专栏

Require.js

通过require.js 可以对javascript文件进行别样引用 Require.js的使用: 第一步: 只需在html页面中引用require.js ...

652
来自专栏james大数据架构

jQuery打造智能提示插件二(可编辑下拉框)

在上一篇 jQuery打造智能提示插件 上改进,增加下拉按钮,修复点击下拉区域外不隐藏BUG 效果 ? js封装,注意红色部分为BUG修复,然后传入boxwid...

1695
来自专栏北京马哥教育

Linux Shell 通配符、元字符、转义符最全使用攻略

来自:程默 - 博客园,作者:程默 www.cnblogs.com/chengmo/archive/2010/10/17/1853344.html 说到she...

3656
来自专栏子勰随笔

通过JS检测当前设备类型

1529
来自专栏前端架构

JS模块化工具requirejs教程(二):基本知识 分类 编程技术

前一篇:JS模块化工具requirejs教程(一):初识requirejs 我们以非常简单的方式引入了requirejs,这一篇将讲述一下requirejs中的...

642
来自专栏緣來來來

Python爬虫 --- 2.5 Scrapy之汽车之家爬虫实践

Scrapy框架为文件和图片的下载专门提供了两个Item Pipeline 它们分别是:

291
来自专栏Python小屋

Python批量判断IP地址所属地区

首先安装Python扩展库netaddr,然后对下面的代码进行简单修改后即可满足某些场合的应用。 from random import randrange fr...

3287
来自专栏阮一峰的网络日志

网页开发的6种在线调试环境

如今的网页代码,一般由三个部分组成:   * HTML,语义层,提供网页的内容。   * CSS,表现层,规定网页的外观。   * Javascript,...

2823

扫描关注云+社区