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 条评论
登录 后参与评论

相关文章

来自专栏腾讯云Elasticsearch Service

Elasticsearch 分片恢复并发过高引发的bug分析

       大家好,今天为大家分享一次 ES 的填坑经验。主要是关于集群恢复过程中,分片恢复并发数调整过大导致集群 hang 住的问题。

1231
来自专栏Golang语言社区

服务器并发处理能力

序: 这里指的服务器是指提供HTTP服务的服务器,人们通常衡量一台web服务器能力的大小为其在单位时间内能处理的请求数的多少。 3.1 吞吐率 ...

7707
来自专栏开源优测

JMeter逻辑控制器08

前言 在jmeter中逻辑控制器主要分类两类: 控制jmeter测试计划中节点的逻辑执行顺序等等 对jmeter的节点进行分组,方便结果统计等等 进一步简化下,...

3435
来自专栏Web 开发

涨姿势 – 不一样的服务端长连接方案 – 客户端代理

传统的 LAMP 架构,PHP-CGI  这种方式是很难处理长连接的。要么写死循环的方式来握住请求,要么使用 swoole 这种,通过 C 拓展来支持。

462
来自专栏Kubernetes

docker volume源码分析

这是在docker v1.10.3版本的使用过程中,使用convoy 作为volume driver,在一次docker volume remove失败时,使我...

3806
来自专栏哲学驱动设计

C# async/await 使用总结

今天搞这两个关键字搞得有点晕,主要还是没有彻底理解其中的原理。 混淆了一个调用异步方法的概念: 在调用异步方法时,虽然方法返回一个 Task,但是其中的代码已经...

1886
来自专栏技术专栏

Spring Security+Spring Social+SpringBoot集成Restful可配置安全模块及代码生成器

1.本项目主要分为core核心模块,browser浏览器模块,app模块,demo使用restful实例模块及spring-boot-api-project-s...

1842
来自专栏技术博客

DevExpress A field with the name '' was not found on the selected data source.

绑定控件时发现的错误,找了很久终于找到原因了,可能也是大家没注意的地方,希望能给大家带来一些帮助。

532
来自专栏Elasticsearch实验室

Elasticsearch 分片恢复并发数过大引发的bug分析

       大家好,今天为大家分享一次 ES 的填坑经验。主要是关于集群恢复过程中,分片恢复并发数调整过大导致集群 hang 住的问题。

1635
来自专栏java相关

java中缓存分类总结

在平时的开发中会经常用到缓存,比如locache、redis等,但一直没有对缓存有过比较全面的总结。下面从什么是缓存、为什么使用缓存、缓存的分类以及对每种缓存的...

682

扫码关注云+社区