前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【K8s】kube-proxy 源码分析 01-01

【K8s】kube-proxy 源码分析 01-01

原创
作者头像
Librant
修改2022-07-05 23:48:18
2370
修改2022-07-05 23:48:18
举报
文章被收录于专栏:跟我一起学 K8s跟我一起学 K8s

【注】源码分析均以 k8s 的第一个 commit 代码分析;

kube-proxy 的入口函数 main()

代码语言:go
复制
cmd/proxy/proxy.go

在主函数中:

  • 生成 proxyConfig 的实例
  • 启动监听 etcd

主要的函数如下:

代码语言:go
复制
proxyConfig := config.NewServiceConfig()

etcdClient := etcd.NewClient([]string{*etcd_servers})

loadBalancer := proxy.NewLoadBalancerRR()

proxier := proxy.NewProxier(loadBalancer)

proxyConfig.RegisterServiceHandler(proxier)

proxyConfig.RegisterEndpointsHandler(loadBalancer)

下面就是具体对各个函数进行分析:

1)func NewServiceConfig() ServiceConfig {}

这里主要是生成 ServiceConfig 结构体;

代码语言:go
复制
serviceConfigSources:   make(map[string]chan ServiceUpdate),
endpointsConfigSources: make(map[string]chan EndpointsUpdate),
serviceHandlers:        make([]ServiceConfigHandler, 10),
endpointHandlers:       make([]EndpointsConfigHandler, 10),
serviceConfig:          make(map[string]map[string]api.Service),
endpointConfig:         make(map[string]map[string]api.Endpoints),
serviceNotifyChannel:   make(chan string),
endpointsNotifyChannel: make(chan string),

可以看到 ServiceConfig 中主要包含 service 和 endpoint 的更新通道,通过 channel 的方式监控 service 和 endpoint 的变动;这里是通过启动协程来进行控制;

代码语言:go
复制
go config.Run()

2)porxy.NewLoadBalancerRR() *LoadBalancerRR {}

-- 生成一个轮询的负载均衡器

这里的实现比较简单,就是通过遍历 endpoint 中的信息进行轮询;

代码语言:go
复制
LoadBalancerRR{endpointsMap: make(map[string][]string), rrIndex: make(map[string]int)

3)proxy.NewProxier(loadBalancer LoadBalancer) *Proxier {}

-- 通过负载均衡器进行服务代理

代码语言:go
复制
Proxier{loadBalancer: loadBalancer, serviceMap: make(map[string]int)}

4)proxyConfig.RegisterServiceHandler(proxier)

-- 注册一个代理器,处理 service 资源配置的相关变化;

代码语言:go
复制
func (impl *ServiceConfig) RegisterServiceHandler(handler ServiceConfigHandler) {}

这里传入的参数是一个接口:ServiceConfigHandler {},这个接口中只有 OnUpdate(services []api.Service) 方法;

-- Proxier 结构实现了 OnUpdate() 方法

5)proxyConfig.RegisterEndpointsHandler(loadBalancer)

-- 注册一个端点变化的 Handler

代码语言:go
复制
func (impl *ServiceConfig) RegisterEndpointsHandler(handler EndpointsConfigHandler) {}

这里传入的参数是一个接口:EndpointsConfigHandler {}, 这个接口中 OnUpdate(endpoints []api.Endpoints) 方法;

-- LoadBalancerRR 结构实现了 OnUpdate() 方法


至此, kube-proxy 的 main() 主流程就启动完成,具体的细节分析,在下一节进行详细分析;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档