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

2022-07-05 23:48:18 浏览数 (1)

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

0 人点赞