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源码解析_proxy

proxy源码解析_proxy_02

那么又是谁往通知通道里写数据呢

proxy源码解析_proxy_03

proxy源码解析_proxy_04

proxy源码解析_proxy_05

proxy会对于每个服务都会开启一个双向代理,

下面是开启双向代理的代码

kubernetes/cmd/proxy/proxy.go

proxy源码解析_proxy_06

kubernetes/pkg/proxy/proxier.go

proxy源码解析_proxy_07

proxy源码解析_proxy_08

proxy源码解析_proxy_09

proxy源码解析_proxy_10

proxy源码解析_proxy_11


LoadBalancer的作用

proxy源码解析_proxy_12

proxy源码解析_proxy_13