博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】k8s源码分析-----kube-proxy(2)ProxyServer
阅读量:4032 次
发布时间:2019-05-24

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

 

本文QQ空间链接:

本文csdn博客链接:

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日

(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)

 

如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。

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

 

你可能感兴趣的文章
消息中间件:谈一谈 RocketMQ 的技术架构
查看>>
微服务统一认证,OAuth2 的认证流程
查看>>
Dubbo性能有多强,来看下官方的性能测试报告
查看>>
Kafka的常用使用场景:从初级到高级,你用到了几个
查看>>
阿里技术团队推荐:Dubbo 服务化最佳实践
查看>>
Nginx 限流常用模块:限制并发和IP访问频率
查看>>
OpenResty 高性能服务器,单机可达10K
查看>>
RocketMQ的十二个特性,你都知道吗「上」
查看>>
RocketMQ的十二个特性,你都知道吗「下」
查看>>
一文搞懂RocketMQ最常见的16个基本概念
查看>>
Intellij IDEA启动优化,让开发的感觉飞起来
查看>>
玩转Java高并发?请先说明下并发下的惊群效应
查看>>
轻松搭建Redis 5.0集群环境,只需十分钟
查看>>
Jmeter压测错误,Address already in use: connect
查看>>
高并发API网关,Spring Cloud Gateway 之限流操作
查看>>
OAuth2.0 微服务认证授权,四种常见的授权模式
查看>>
Java 2019 面试宝典
查看>>
Redis面试题之持久化和五种部署方式
查看>>
搞定Spring Cloud断路器组件 Hystrix 的舱壁模式
查看>>
mybatis之大于、小于、大于等于和小于等于的写法
查看>>