proxy 每个节点上都会有的常驻进程,主要负责给请求的流量进行转发。比如流量到了service,proxy会将流量转发给相应的pod。
观察者模式
用到了观察者模式
主题是proxyConfig 当主题变化时,
就会调用注册到主题里的"proxier,loadBalancer"的onUpdate方法
那么是这么做到变化就会触发观察者的OnUpdage方法呢
kubernetes/cmd/proxy/proxy.go
proxyConfig := config.NewServiceConfig()
func NewServiceConfig() ServiceConfig {
config := ServiceConfig{
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), # 观察者通知channel
endpointsNotifyChannel: make(chan string),# 观察者通知channel
}
go config.Run() # 这里有个go routing
return config
}
那么又是谁往通知通道里写数据呢
proxy会对于每个服务都会开启一个双向代理,
下面是开启双向代理的代码
kubernetes/cmd/proxy/proxy.go
kubernetes/pkg/proxy/proxier.go