【注】源码分析均以 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() 主流程就启动完成,具体的细节分析,在下一节进行详细分析;